This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TPS23881:通过 Linux 驱动程序进行奇偶校验和 SRAM 编程(内核6.1)

Guru**** 2387060 points
Other Parts Discussed in Thread: TPS23881, TPS23880
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1469139/tps23881-parity-and-sram-programming-via-linux-driver-kernel-6-1

器件型号:TPS23881
Thread 中讨论的其他器件: TPS23880

工具与软件:

您好!
我正在尝试启用此 IC、以便为另一个器件提供60W 的电源。 我能使它在低功耗模式下工作、PD 也能启动。 当 PD 尝试消耗更多功率时、PSE 停止供电。 我知道我需要将 SRAM 数据发送到 IC 以实现>30W 的电力输送。

我已将下面的上游驱动程序(6.12)移植到我的内核(6.1)
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/net/pse-pd/tps23881.c?h=v6.12.12

在探头函数中、奇偶校验和 SRAM 闪存被启动、I2C 写入成功(~20KB 奇偶校验和180KB SRAM)、但固件修订版读取为0xFF (我使用 TPS23881_2_PARITY_v15和 TPS23881_2_SRAM_v15 bin 文件)

我已经为0x20向 i2c 写入函数添加了 printk 以查看正在向芯片发送的所有数据

以下是使用 v15奇偶校验和 SRAM 时的调试信息。 得到 tps23881 2-0020:固件版本0xff 而不是0x15

root@...-board:~# insmod tps23881_6.12_ref_v15.ko
[   29.829113] kernel_read_file_from_path_initns path=/lib/firmware/TPS23881_2_PARITY_v15.bin
[   29.838140] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:01
[   29.844950] ... tps: i2c_smbus_write_byte_data addr:20 reg:62 data:00
[   29.851681] ... tps: i2c_smbus_write_byte_data addr:20 reg:63 data:80
[   29.858380] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:c4
[   29.865081] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:bc
[   29.871775] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:02
[   29.878474] ... tps: i2c_smbus_write_byte_data addr:20 reg:91 data:00
[   29.885175] ... tps: i2c_smbus_write_byte_data addr:20 reg:90 data:00
[   29.891873] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:00
[   29.898573] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:00
[   31.530767] kernel_read_file_from_path_initns path=/lib/firmware/TPS23881_2_SRAM_v15.bin
[   31.541516] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:c5
[   31.548243] ... tps: i2c_smbus_write_byte_data addr:20 reg:62 data:00
[   31.554942] ... tps: i2c_smbus_write_byte_data addr:20 reg:63 data:80
[   31.561635] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:c0
[   31.568333] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:bc
[   31.575020] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:02
[   31.581716] ... tps: i2c_smbus_write_byte_data addr:20 reg:91 data:00
[   31.588413] ... tps: i2c_smbus_write_byte_data addr:20 reg:90 data:00
[   31.595106] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:00
[   31.601805] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:00
[   38.291518] kauditd_printk_skb: 3 callbacks suppressed
[   38.291528] audit: type=1334 audit(1677930006.820:21): prog-id=10 op=UNLOAD
[   38.305693] audit: type=1334 audit(1677930006.820:22): prog-id=9 op=UNLOAD
[   45.818518] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:18
[   45.837342] tps23881 2-0020: Firmware revision 0xff
[   45.842349] ... tps: i2c_smbus_write_byte_data addr:20 reg:17 data:a0
[   45.849067] i2c_smbus_write_word_data addr:20 reg:26 data:e4e4
[   45.855012] i2c_smbus_write_word_data addr:20 reg:12 data:aaaa
[   45.860954] i2c_smbus_write_word_data addr:20 reg:13 data:0000
[   45.866895] i2c_smbus_write_word_data addr:20 reg:29 data:0000
[   45.872846] i2c_smbus_write_word_data addr:20 reg:14 data:0000
[   45.879745] tps23881 2-0020: DebugFS entry registers created
[   45.885465] ... tps: DebugFS entry registers created

以下是使用 v14的奇偶校验和 SRAM 时的调试信息。 得到 tps23881 2-0020:固件版本0x0而不是0x85

root@...-board:~# insmod tps23881_6.12_ref_v14.ko
[  277.778863] kernel_read_file_from_path_initns path=/lib/firmware/TPS23881_2_PARITY_v14.bin
[  277.787623] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:01
[  277.794385] ... tps: i2c_smbus_write_byte_data addr:20 reg:62 data:00
[  277.801107] ... tps: i2c_smbus_write_byte_data addr:20 reg:63 data:80
[  277.807816] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:c4
[  277.814521] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:bc
[  277.821216] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:02
[  277.827916] ... tps: i2c_smbus_write_byte_data addr:20 reg:91 data:00
[  277.834612] ... tps: i2c_smbus_write_byte_data addr:20 reg:90 data:00
[  277.841349] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:00
[  277.848052] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:00
[  279.495612] kernel_read_file_from_path_initns path=/lib/firmware/TPS23881_2_SRAM_v14.bin
[  279.506359] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:c5
[  279.513106] ... tps: i2c_smbus_write_byte_data addr:20 reg:62 data:00
[  279.519809] ... tps: i2c_smbus_write_byte_data addr:20 reg:63 data:80
[  279.526512] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:c0
[  279.533209] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:bc
[  279.539906] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:02
[  279.546604] ... tps: i2c_smbus_write_byte_data addr:20 reg:91 data:00
[  279.553307] ... tps: i2c_smbus_write_byte_data addr:20 reg:90 data:00
[  279.559999] ... tps: i2c_smbus_write_byte_data addr:20 reg:d7 data:00
[  279.566691] ... tps: i2c_smbus_write_byte_data addr:20 reg:1d data:00
[  293.784973] ... tps: i2c_smbus_write_byte_data addr:20 reg:60 data:18
[  293.804701] tps23881 2-0020: Firmware revision 0x0
[  293.809627] ... tps: i2c_smbus_write_byte_data addr:20 reg:17 data:a0
[  293.817623] i2c_smbus_write_word_data addr:20 reg:26 data:e4e4
[  293.823595] i2c_smbus_write_word_data addr:20 reg:12 data:aaaa
[  293.829557] i2c_smbus_write_word_data addr:20 reg:13 data:0000
[  293.835523] i2c_smbus_write_word_data addr:20 reg:29 data:0000
[  293.841467] i2c_smbus_write_word_data addr:20 reg:14 data:0000
[  293.856116] tps23881 2-0020: DebugFS entry registers created
[  293.861823] ... tps: DebugFS entry registers created

在这两种情况下、固件似乎都被 IC 拒绝。 我已重新下载固件并重新检查以确保固件文件未损坏。

欢迎提供任何解决此问题的建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们的 PoE 团队目前不在办公室、 明天还会回来。 很抱歉耽误你的时间。

    BR、

    Ke Wang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有人能告诉我奇偶校验数据和 SRAM 数据可能有什么问题吗?
    驱动程序代码中的函数如下所示:

    static const struct tps23881_fw_conf tps23881_fw_parity_conf[] = {
    {.reg = 0x60, .val = 0x01},
    {.reg = 0x62, .val = 0x00},
    {.reg = 0x63, .val = 0x80},
    {.reg = 0x60, .val = 0xC4},
    {.reg = 0x1D, .val = 0xBC},
    {.reg = 0xD7, .val = 0x02},
    {.reg = 0x91, .val = 0x00},
    {.reg = 0x90, .val = 0x00},
    {.reg = 0xD7, .val = 0x00},
    {.reg = 0x1D, .val = 0x00},
    { /* sentinel */ }
    };
    
    static const struct tps23881_fw_conf tps23881_fw_sram_conf[] = {
    {.reg = 0x60, .val = 0xC5},
    {.reg = 0x62, .val = 0x00},
    {.reg = 0x63, .val = 0x80},
    {.reg = 0x60, .val = 0xC0},
    {.reg = 0x1D, .val = 0xBC},
    {.reg = 0xD7, .val = 0x02},
    {.reg = 0x91, .val = 0x00},
    {.reg = 0x90, .val = 0x00},
    {.reg = 0xD7, .val = 0x00},
    {.reg = 0x1D, .val = 0x00},
    { /* sentinel */ }
    };
    
    static int tps23881_flash_sram_fw_part(struct i2c_client *client,
    const char *fw_name,
    const struct tps23881_fw_conf *fw_conf)
    {
    const struct firmware *fw = NULL;
    int i, ret;
    
    ret = request_firmware(&fw, fw_name, &client->dev);
    if (ret)
    return ret;
    
    dev_dbg(&client->dev, "Flashing %s\n", fw_name);
    
    /* Prepare device for RAM download */
    while (fw_conf->reg) {
    ret = i2c_smbus_write_byte_data(client, fw_conf->reg,
    fw_conf->val);
    if (ret)
    goto out;
    
    fw_conf++;
    }
    
    /* Flash the firmware file */
    for (i = 0; i < fw->size; i++) {
    ret = i2c_smbus_write_byte_data(client,
    TPS23881_REG_SRAM_DATA,
    fw->data[i]);
    if (ret)
    goto out;
    }
    
    out:
    release_firmware(fw);
    return ret;
    }
    
    static int tps23881_flash_sram_fw(struct i2c_client *client)
    {
    int ret;
    
    ret = tps23881_flash_sram_fw_part(client, fw_parity_name,
    tps23881_fw_parity_conf);
    if (ret)
    return ret;
    
    ret = tps23881_flash_sram_fw_part(client, fw_sram_name,
    tps23881_fw_sram_conf);
    if (ret)
    return ret;
    
    ret = i2c_smbus_write_byte_data(client, TPS23881_REG_SRAM_CTRL, 0x18);
    if (ret)
    return ret;
    
    mdelay(12);
    
    return 0;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还尝试使用 i2c-tools 从 Linux 用户空间向 i2c 总线发送数据。 这是生成的脚本、也不会正常工作。 (~200行脚本)

    https://smalldev.tools/share-bin/VMcXi66f
    备用链接: https://codefile.io/f/fJd27Ug92b

    它还会导致在 SRAM 加载后0x41为0xff

    Config for parity load
    i2cset -y "2" "0x20" "0x60" "0x01" b
    i2cset -y "2" "0x20" "0x62" "0x00" b
    i2cset -y "2" "0x20" "0x63" "0x80" b
    i2cset -y "2" "0x20" "0x60" "0xC4" b
    i2cset -y "2" "0x20" "0x1D" "0xBC" b
    i2cset -y "2" "0x20" "0xD7" "0x02" b
    i2cset -y "2" "0x20" "0x91" "0x00" b
    i2cset -y "2" "0x20" "0x90" "0x00" b
    i2cset -y "2" "0x20" "0xD7" "0x00" b
    i2cset -y "2" "0x20" "0x1D" "0x00" b
    Loading Parity firmware...
    Loading firmware: /lib/firmware/TPS23881_2_PARITY_v15.bin (20649 bytes)
    Progress: 99% (20448/20649 bytes)
    Firmware /lib/firmware/TPS23881_2_PARITY_v15.bin loaded successfully!
    Config for SRAM load
    i2cset -y "2" "0x20" "0x60" "0xC5" b
    i2cset -y "2" "0x20" "0x62" "0x00" b
    i2cset -y "2" "0x20" "0x63" "0x80" b
    i2cset -y "2" "0x20" "0x60" "0xC0" b
    i2cset -y "2" "0x20" "0x1D" "0xBC" b
    i2cset -y "2" "0x20" "0xD7" "0x02" b
    i2cset -y "2" "0x20" "0x91" "0x00" b
    i2cset -y "2" "0x20" "0x90" "0x00" b
    i2cset -y "2" "0x20" "0xD7" "0x00" b
    i2cset -y "2" "0x20" "0x1D" "0x00" b
    Loading SRAM firmware...
    Loading firmware: /lib/firmware/TPS23881_2_SRAM_v15.bin (180394 bytes)
    Progress: 99% (178592/180394 bytes)
    Firmware /lib/firmware/TPS23881_2_SRAM_v15.bin loaded successfully!
    Finish SRAM load
    i2cset -y "2" "0x20" "0x60" "0x18" b
    SRAM Load Failed. Entering Safe Mode!
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Renjith:

    感谢您发送编修!

    由于资源有限和农历新年、答复可能会被推迟。 我们将在两周后回复您。 感谢您的耐心等待!  

    此致、

    Diang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    无论我需要了解哪种方向、都将有所帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Renjith:

    感谢您的耐心。 我不确定 TI 在安全资源中发布的代码是否与 Linux 兼容。 它标记为 Windows。  

    您可以尝试使用 Windows 系统吗? 我们有一个视频介绍为 TPS23880加载 SRAM 代码、该代码靠近 TPS23881 (https://www.ti.com/video/series/power-over-ethernet-ssm-training-series.html poe)

    此致、

    Diang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们使用 Windows 系统来安装.exe 并从已安装的文件夹中获取了.bin 文件。
    奇偶校验文件和 SRAM 文件的 md5sum 如下:

    md5sum *.bin
    340f54029aa084bb822788663dd13616 TPS23881_2_PARITY_v15.bin
    a2f7111bf7e2f3d181ee59bb45a62d6e TPS23881_2_SRAM_v15.bin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Renjith:

    是的、您需要加载 SRAM 和奇偶校验代码  

    此致、

    Diang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    邢亮
    我们将首先加载奇偶校验、然后加载 SRAM
    文件位于中的目标系统(i.MX93 Linux 内核6.1 (使用 TPS23881驱动程序进行修改)

    /lib/firmware/TPS23881_2_PARITY_v15.bin

    /lib/firmware/TPS23881_2_SRAM_v15.bin

    随着驱动程序的编写方式、它使用 firmware_loader(ret = request_firmware(&fw, fw_name, &client->dev);)来读取文件。 它将检查/lib/firmware.中的某些位置 如果您看看代码、则文件读取和 i2c 写入成功。

    我已将打印添加到发送到 i2c 写入(打开 POST)的所有命令。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Renjith:

    感谢您的更新。

    TI 可能不会为 所有类型的系统提供 PSE SRAM 产品系列。 系统可能不同、但希望能  加载 SRAM 和奇偶校验。 如果您有其他问题或疑虑、敬请告知。  

    此致、

    Diang