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.

[参考译文] Linux/BQ27421-G1:在 Debian 上安装和使用驱动程序

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/588333/linux-bq27421-g1-installing-and-using-the-driver-on-debian

器件型号:BQ27421-G1
主题中讨论的其他器件: BQ27421-G2bq27500BQ27000BQ27200BQ27210BQ27010BQ27510bq27541

工具/软件:Linux

大家好、我一直在尝试在 Debian 系统上使用这个功率监控器的驱动程序、具体来说、Linaro 4.4.9。  我正在使用 Variscite 的 DART SD410 Devkit。  我使用 bash shell 从发出了一些直接 i2c 调用、以从 BQ27421-G1获取信息、并验证了报告的数据是否准确。  因此、我知道我已正确连接器件。

但是、在执行将驱动程序构建到内核中的步骤后、我尚未确定任何使用该驱动程序的方法。  我按照指令通过 menuconfig 将驱动程序构建到我的内核中、如此处所示。

符号:battery_BQ27XXX [=y]
类型:三态
提示:BQ27xxx 电池驱动
程序位置:
->设备驱动程序
->在
drivers/power/supply/Kconfig:167中定义的电源类支持(power_supply [=y])
取决于:power_supply [=y]


符号:battery_BQ27XXX_I2C [=y]
类型:三态
提示:BQ27xxx I2C 支持
位置:
->设备驱动程序
->电源类支持(POWER_SUPPLY [=y])
->在
drivers/power/supply/Kconfig:172中定义的 BQ27xxx 电池驱动器(battery_BQ27XXX [=y])
取决于:power_supply [=y]&& battery_BQ27XXX [=y]&& I2C [=y] 

刷写 SOM 的引导映像后、我希望文件结构中的文件内容会报告温度、电池电量等 但我没有发现这样的东西。 此外、在文件系统上找不到该模块的.ko 文件。 我希望它位于/lib/modules 下的某个位置 /。 我必须在源树中找到.ko、将其扫描到 SOM、然后用 insmod 手动插入。 但是、即使在这之后、我也看不到任何方法可以从器件中获取轮询的信息。

我已经阅读了该器件的快速入门指南和技术参考、但似乎没有这些信息、因此我将尝试回答以下问题。

(1)如何构建内核、使其包含驱动程序并在引导时加载? 在内核配置更改后进行内核重建不会导致这种情况。 我需要采取哪些进一步的步骤?
(2)如何告知驱动器已连接 BQ27421-G2的 I2C?
(3)如何从驱动程序中提取 BQ27421-G2的信息?
(4)技术参考提到了一些 API 调用的外观、例如 Temperature()、Voltage()。 是否有程序可以链接到的库(.so 或.A)来访问驱动程序提供的信息?  或者、程序在编译时可能包含一些头文件吗?

谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    (1)如何构建内核、使其包含驱动程序并在引导时加载? 在内核配置更改后进行内核重建不会导致这种情况。 我需要采取哪些进一步的步骤?
    答案:更改 defconfig 并将其设为=Y 还可以解决依赖关系(最好通过 menuconfig 实现)。 检查是否加载了驱动程序的 dmesg。
    (2)如何告知驱动器已连接 BQ27421-G2的 I2C?
    答案:您需要在器件树中将其设置为 I2C 板信息。 了解器件树选项。
    (3)如何从驱动程序中提取 BQ27421-G2的信息?
    答案:一旦完成步骤1和步骤2、您可以通过 sysfs 条目:/sys/class/power_supply/battery 进行访问
    (4)技术参考提到了一些 API 调用的外观、例如 Temperature()、Voltage()。 是否有程序可以链接到的库(.so 或.A)来访问驱动程序提供的信息? 或者、程序在编译时可能包含一些头文件吗?
    答:我不确定。 您可以浏览 uEvents Netlink 消息或使用第3点中提到的 sysfs etntry。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经做了(1)、但没有做(2)、因此这是我所遗漏的事情。 如果您有示例器件树文件、是否会发布链接?

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

    您好!

    请参阅内核源代码 Documentation/i2c/instantiate-devices 中的

    例如、用于参考、并且需要 tof ind 用于总线和 i2c 从器件

    i2c3{(&I)
    时钟频率=<100000 >;

    bq27500@55{
    兼容="ti、bq27500";
    reg =<0x55>;
    };

    };

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

    大家好、感谢您提供更多线索。  我已经在我的 Linux 版本(Debian Linaro 4.5.9)上查看了驱动程序源代码、那里的驱动程序源代码似乎没有提供所需的任何 f_device_id 信息、其中包括兼容性字符串。  我还发现了一个内核树提交、似乎添加了我的 Linux 树的驱动程序源所缺少的信息。

    www.spinics.net/.../msg115434.html

    此驱动程序是否在当前版本的系统上运行?  由于其他原因、我不知道是否可以从4.4.9升级。  驱动程序源代码文件中的驱动程序版本#define'ed 为1.2.0。

    为了进行良好的测量、我在按照指导修改器件树后尝试了内核构建、但驱动程序未加载或在系统上运行。

    谢谢、

    Brian

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

    令人担忧的是驱动器未加载。 至少应运行驱动程序的 module_init (如果不是探测)。 您是否添加了足够的日志来表明驱动程序未加载? 我建议您将驱动程序作为模块、以便您可以随时插入并检查相应的 dmesg。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的内核配置包括:
    CONFIG_W1_SLAVE_BQ27000=y
    CONFIG_BATTERY_BQ27XXX=y
    CONFIG_BATTERY_BQ27XXX_I2C=y
    CONFIG_BATTERY_BQ27XXX_PLANALE=y

    我使用 menuconfig 检查所有相关的依赖项、它们是"y"。 我已经使用该配置完成了启动映像的纯净构建、无论是否使用第一个 W1配置项、因为这些说明都没有提及它。 但它不会像我预期的那样生成.ko 文件、当然、dmesg 在引导后不包含任何有关驱动程序的信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    您需要将其设为=m

    例如

    CONFIG_W1_SLAVE_BQ27000=m
    CONFIG_BATTERY_BQ27XXX=m
    CONFIG_BATTERY_BQ27XXX_I2C=m
    CONFIG_BATTERY_BQ27XXX_PLANCE=m

    然后"制作模块"、并安装模块。 以将其设为.ko

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

    感谢您对我的耐心等待。 我认为'y'会按相同的方式构建.ko 文件。 在重建将"m"设置为这些值的内核后、我尝试手动加载.ko 文件。 这确实构建了.ko 文件、但它没有使它们成为引导映像的一部分、因此我手动将 bq27xxx_battery.ko 从我的开发机器转移到目标平台、并使用它运行了一个 insmod。 但是、这会产生内核中止。 看到该输出的前几行:

    root@linaro-alip:~ insmod bq27xxx_battery.ko ^M
    [112.345321]无法在虚拟地址000000c8^M 处处理内核 NULL 指针解除引用
    [112.345380] PgD = ffffffc0235a8000^M
    [112.352561][000000c8]* PgD=0000000000000000、* Pud=00000000000000000000^M
    [112.359838]^M
    [112.362572]内部错误:Oops:96000005 [#1] preempt SMP^M
    [112.362584] power_supply bq27500-00:power_supply_name=bq275000-0^M
    [112.362614]链接的模块:bq27xxx_battery (+)^M
    [112.362638] CPU:2 PID:2475 Comm:insmod 未被污染4.4.9.9-linaro-lt-QCOM #1^M
    [112.362646]硬件名称:Variscite VAR-SD410CustomBoard (DT)^M
    [112.362663]任务:ffffc025952700 ti:ffffffc0258a0000 task.ti:ffffffc0258a0000^M
    [112.362691] PC 位于 DEV_DRIVER_STRING+0x8/0x28^M
    [112.362713] LR 位于__DYNAL_DEV_dbg+0x74/0xcc^M
    [112.362727] PC:[ ] LR:[ ]状态:80000145^M
    [112.36274] sp:ffffffc0258a3620^M
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    您能否分享您对 i2c 所做的 DTS 更改?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dwarakesh、

    我已附加两个.dtsi 文件。  这是我最后一次使用它们的状态。  我不记得我之前的状态之间的确切修改、但是我所做的任何更改都阻止了内核中止的发生。  但驱动程序似乎仍然无法加载。  我想这些文件中的任何一个都可能发生修改。

    -Briane2e.ti.com/.../5811.dtsi_5F00_files.zip

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

    崩溃停止后,您在 dmesg 中看到了什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    内核中止转储似乎处于无限循环中、因此我进行了下电上电。  如果/当我再次生成中止、我将让它运行更长的时间来查看它是否实际完成、或者在日志中保留更多的中断以向您发送一些片段。  下面是我在连接的 file.e2e.ti.com/.../6153.screenlog.0_5F00_bqcrash.txt 中的控制台捕获中在下电上电之前的内容

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

    当您说"但我所做的任何更改都阻止了内核中止的发生。" 我想您已经修复了此异常中断转储。 好的、让我检查一下这次崩溃的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我确实说过、但我想我们的消息会有一点不同步、因为我在提到这一点之后看到了您要求中止转储的消息。 您可能尚未在请求转储日志之前看到有关不再执行中止的消息。 如果您认为仔细查看日志很有帮助、当然、如果您想保留日志、这对我同样有用。

    我认为我遇到的问题是、平台驱动程序似乎与设备树条目没有任何关联、因此当我加载.ko 文件时、如果没有任何设备信息、则不会调用或调用其探测函数。 由于驱动程序源中没有指定兼容性,因此我现在不知道设备树如何创建该关联。 在我之前见过的驱动程序中、它们使用".compatible"字段来建立该关联。 查看其他引用 bq27***的设备树文件,可以看到创建关联的其他方式。 这就是我的最佳猜测。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    如果 drivers/power/folder 内没有.compatible =ti、bq27***,则可能需要考虑以旧的方式添加它。 请参阅内核文档中通过写入板级配置文件共享的第一种方法、并使用 I2C_Board_info
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dwarakesh、

    我已经对 i2c 进行了更多的读取、显然内核应该尝试与 i2c_device_id 表的内容匹配兼容性。 请参阅 bq27xxx_battery.c 中的以下内容


    静态常量结构 i2c_device_id bq27xxx_id[]={
    {"bq27200"、BQ27000}、
    {"bq27210"、BQ27010}、
    {"bq27500"、bq27500}、
    {"bq275100"、bq27500}、
    {"bq27520"、bq27500}、
    {"bq27530"、BQ27530}、
    {"bq27531"、BQ27530}、
    {"bq27541"、bq27541}、
    {"bq27542"、bq27541}、
    {"bq27546"、bq27541}、
    {"bq27742"、bq27541}、
    {"bq27545"、BQ27545}、
    {"bq27421"、BQ27421}、//<==== 请参阅此处
    {"bq27425"、BQ27421}、
    {"bq27441"、BQ27421}、
    {"bq27621"、BQ27421}、
    {}、
    };


    因为我的.dtsi 文件包含与其中之一匹配的兼容性字符串、所以内核应该会将该设备树元素的设备传递给驱动程序的探测函数。

    I2C@78ba000{
    时钟频率=<100000 >;

    bq27421@55{
    兼容="ti、bq27421";//<========== 请参阅此处
    reg =<0x55>;
    };
    };
    但是、就我所能说的而言、它不是。 我添加了一些调试语句以打印到驱动程序内的 dmesg 中、但在加载驱动程序的.ko 文件时、其中没有一个语句出现在 dmesg 中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    是否可以尝试将此修补程序修补到 drivers/power/bq27xxx_battery.c?

    +#ifdef CONFIG_of
    _device_id 的+static const 结构 bq27xxx_battery_i2c_for_match_table[]={
    +{.compatible ="ti、bq27200"}、
    +{.compatible ="ti、bq27210"}、
    +{.compatible ="ti、bq27500"}、
    +{.compatible ="ti、bq275100"}、
    +{.compatible ="ti、bq27520"}、
    +{.compatible ="ti、bq27530"}、
    +{.compatible ="ti、bq27531"}、
    +{.compatible ="ti、bq27541"}、
    +{.compatible ="ti、bq27542"}、
    +{.compatible ="ti、bq27546"}、
    +{.compatible ="ti、bq27742"}、
    +{.compatible ="ti、bq27545"}、
    +{.compatible ="ti、bq27421"}、
    +{.compatible ="ti、bq27425"}、
    +{.compatible ="ti、bq27441"}、
    +{.compatible ="ti、bq27621"}、
    +{}、
    +};
    +MODULE_DEVICE_TABLE (of、bq27xxx_battery_i2c_for_match_table);
    +#endif
    静态常量结构 i2c_device_id bq27xxx_id[]={
    {"bq27200"、BQ27000}、
    {"bq27210"、BQ27010}、
    @@-1198、6 +1219.7 @@ MODULE_DEVICE_TABLE (i2c、bq27xxx_id);
    静态结构 i2c_driver bq27xxx_battery_i2c_driver ={
    .driver ={
    .name ="bq27xxx-battery"、
    +.for_match_table = of _match_ptr (bq27xxx_battery_i2c_for_match_table)、
    }、
    .probe = bq27xxx_battery_i2c_probe、
    .remove = bq27xxx_battery_i2c_remove、

    并进行检查。

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

    e2e.ti.com/.../0181.archive2.zipHiDwarakesh、

    我应用了补丁、重建了内核、并重新创建了 SD 410的映像、但行为没有改变:DMSG 中没有相关消息、/sys/class/power_supply/.中没有内容  我已为您附加了修补文件、以确认我已正确应用它。  我还在最近的状态中包含了.dtsi 修改。  它来自 kernel/arch/arm64/boot/dts/qcom 下的4.4.9。  该目录中的所有其他.dts/.dtsi 文件都具有原始格式。  有一次、我对 msm8916.dtsi 应用了更改、但在修改 apq8016-var-sd410.dtsi 之前、我已经将这些更改备份出来。

    谢谢、

    Brian

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

    您好 Brian、

    您如何确认:i2c@78ba000

    bq27xxx_battery_platform_probe:这是否被调用?

    我现在怀疑设备树是问题所在。 请检查在特定设备的设备树中如何配置任何其他 i2c 客户端、并按照相同步骤操作。

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

    您好 Dwarakesh、

    [引用 user=""Dwarakesh"]

    您如何对此进行确认:i2c@78ba000

    e2e.ti.com/.../3704.archive3.zipI'm不确定我是否已确认已正确完成此器件树节点。  我刚刚遵循了其他器件树节点的约定。  78ba000是连接到 bq27421-G1的 I2C 的地址。  另一个文件 msm8916.dtsi 完全定义了 i2c、我在 apq8016-var-sd410.dtsi 中添加的节点将附加到该 i2c 配置。  

    在发布此消息之前、我将添加的器件树节点从 apq8016-var-sd410.dtsi 移到了 ms8916.dtsi、并获得了相同的结果。  请参见随附的。

    [引用 user=""Dwarakesh"]

    bq27xxx_battery_platform_probe:这是否被调用?

    调用时、probe 函数会立即打印到 dmesg、而这个 printk 不会显示在这里。  假设这样、我认为探针函数没有被调用。

    静态 int bq27xxx_battery_platform_probe (struct platform_device *pdev)

    struct bq27xxx_device_info *di;
    struct bq27xxx_platform_data *pdata = pdev->dev.platform_data;
    const char *名称;

    printk ("@@@ here-1.1\n");

    (笑声)

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

    您能不能尝试将驱动程序恢复为内置驱动程序。 =y 选项、并检查它是否提供了与模块相同的日志。 让我检查随附的文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否按照与同一 i2c6总线相连的 ov5645传感器的方式对齐 bq27xxx
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚才做了、我得到了:

    [4.324730] i2c i2c-1:for_i2c:/soc/i2c@78ba000/bq27421@55上的 MODALIAS 故障

    这似乎是一个好线索。 这是我在 archive3.zip 中向您发送的.dtsi 文件、上面有几条消息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    供参考、刚发送的此消息是为了响应将配置改回'y'。

    我现在将研究您有关 ov5645和 i2c6的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../0550.archive4.zipI具有相同的 dmesg 输出:

    [4.331626]  i2c i2c-1:for_i2c:/soc/i2c@78ba000/bq27421@55上的 MODALIAS 故障

    我附加了.dtsi。

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

    bq27421@55{
    兼容="ti、bq27421";
    reg =<0x55>;
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../6153.kernel_5F00_abort.txtThis时间、我认为这一匹配是有效的。  但我确实获得了内核中止。  这里是一些 dmesg 输出。

    [4.561208]  QCOM-camss 1b0ac00.camss:无法初始化 VFE 子器件^M

    [4.586278]  msm_CCI_INIT_GPIO_params:1371 GPIO 计数0^M

    [4.599364]  单线制达拉斯网络协议的驱动程序。^M

    [4.606146]  @@@此处-2.1^M

    [4.606348]  @@@此处-2.2^M

    [4.608098]  @@@此处-2.3^M

    [4.610334]  @@@此处-2.4^M

    [4.630561]  无法在虚拟地址000000c8^M 处处理内核 NULL 指针解除引用

    [4.561208]  QCOM-camss 1b0ac00.camss:无法初始化 VFE 子器件^M

    [4.586278]  msm_CCI_INIT_GPIO_params:1371 GPIO 计数0^M

    需要注意的两点:

    (1)我添加了"@@@此处-..." 发送到 bq27xxx_battery.c 的消息

    (2)这里是该文件的源代码片段、我认为可能发生了中止。

    printk ("@@@ here-2.4\n");

    RetVal = bq27xxx_powersupply_init (di、name);

    如果(重新评估)

    转至 batt_failed;

    /*在大约1分钟后安排轮询*/

    schedule_Delayed_work (&di->work、60 * Hz);

    printk ("@@@ here-2.5\n");

    请注意、"here-2.5"永远不会被写入 dmesg。

    我正在对整个内核进行干净的构建、以确保我已经涵盖了我的所有基础、我将在"here-2.4"和"here-2.5"之间添加更多打印消息。  我还将连接整个内核中止转储。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否认为删除"clock-frequency =<100000 >;"元素与中止有关?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您可以将其重新添加、但使用与我前面提到的相同的对齐方式进行检查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将时钟频率元素添加回.dtsi、但仍会发生内核中止。  我在这个存档中包含了三个方面。

    (1) bq27xxx_bat.pag.c 的源代码、其中包括我的打印语句

    (2)内核中止控制台转储

    (3)我使用的.dtsi 文件

    这是由全新构建的引导映像导致的。  该问题似乎在函数 bq27xxx_powersupply_init()内的某个位置发生。  如果您将中止转储中的"@@@"消息与附加的源相关联、我想您会看到我的 mean.e2e.ti.com/.../7563.archive5.zip

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

    他们提供了一些补丁、并在线讨论了类似的问题

    marc.info/

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

    e2e.ti.com/.../4670.archive6.zipHiDwarakesh、

    我手动应用了这些补丁、它们确实有所不同。  内核中止不再发生、但存在另一个问题。  正在以如此高的速率写入控制台(dmesg),使/dev/kmsg 遇到大量超支,从而导致消息丢失。  该警告使控制台变得非常繁忙,以至于我无法了解驱动程序是否正常工作,即用信息填充/sys/class/power_supply。  我删除了我添加的调试 printk 调用、因此不是这些调用。  我在存档中附加了两个文件:一个文件具有使其变为 dmesg 的控制台输出、另一个文件具有已修补的驱动程序源。  我仔细检查了修补源、我认为我没有错过任何东西。

    我找到了几个补丁、但我还没有尝试过这些补丁。  我可能直到明天才能实现这一目标。

    [v4、5/8]电源:bq27xxx_battery:添加 BQ27425芯片 ID -补丁

    [v3、4/7]电源:bq27xxx_battery:添加 BQ27425芯片 ID -补丁 

    [1/3]电源:bq27xxx_battery:fix platform probe - patchwork

    [v12.3、10/10]电源:bq27xxx_battery:删除重复项... -修补程序

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定这些修补程序是否会有所帮助。

    为了缩小范围、我建议您选择合适的选项、将其设置为 MOSALES =m、并检查哪个.ko 导致了什么以及消息将会发出什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我刚刚在将驱动程序设置为模块后尝试了。  SOM 启动正常、运行"insmod bq27xxx_battery.ko"后、错误消息的快速重复出现立即开始。

    [144.049378] systemd-journale[1489]:/dev/kmsg 缓冲区溢出,一些消息丢失。

    由于系统日志中没有来自该消息的其他消息、我无法分辨导致此消息的原因。  此消息会占用整个控制台、以至于我无法输入任何命令。  我必须对 SOM 进行硬复位。

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

    e2e.ti.com/.../2148.console.txtQuick后续操作:在 insmod .ko 之后,我成功地使用了 rmmod,然后运行了 dmesg。  rmmod 后,systemd-j古尔德 消息立即停止。  我连接了该控制台输出。

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

    尝试立即使用 rmmod bq27xxx_battery.ko

    比如
    #insmod bq27xxx_battery.ko && rmmod bq27xxx_battery.ko、如果这提供了有关正在填充的日志的一些线索。 如果可能、还会增大 dmesg 大小
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢、正是我想要尝试的。 看起来是用 uevent 消息填充缓冲区。 发送到 sysfs 条目的某种更新、包括温度、电池电量等 但为什么经常需要对此进行研究。 让我检查一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢。 顺便说一下、我非常感谢您努力参与这项工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来、

    bq27xxx_battery_IRQ_handler_thread ()-中断持续发生

    它调用 bq27xxx_battery_update ()-> power_supply_changed()调用此 uevent

    您能否通过添加日志来检查这是否是观察结果? 另请检查此条件,它是如何不同的:di->cache.capacity != cache.capacity
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另一个注意事项是、即使是泛洪 dmesg、驾驶员似乎仍在工作。 我至少可以看到它在/sys/class/power_supply 下创建了一个文件结构、并使用与电池状态相关的值填充这些文件。  为此、我将 SOM 连接到 Wi-Fi、并将 ssh 写入其中、因为加载模块后控制台不可用。  我必须将 POLL_INTERVAL 模块参数设置为"1"、可能是因为我只是不想等待360秒、我猜这是第一次更新。

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

    谢谢。 我的驱动器是使硬件正常工作。

    是的、它经常更新电池值。 可能是电量监测计、电池需要某种校准(我不确定)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、如果我理解正确、您认为 dmesg 泛洪是由硬件校准问题引起的? 这是您认为 TI 可以在几天内解决的问题、还是您认为需要更长时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想猜。 但是、有一个代码流用于指示电池是否已校准。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dwarakesh、

    我们是否可以从 TI 获得此缺陷的修复?

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

    您好 Brian、

    您可以将此查询发布到 e2e 的电池管理论坛。 您将获得帮助。

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

    如果您在 Linux 驱动程序中取得了进展、请关闭此问题、并在电池管理论坛中打开有关持续中断或 uevent 的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该论坛中的 TI 支持代表仅提供了以下答案:

    校准不会影响监测计将连续发出中断的中断。 您可以检查监测计配置和硬件是否有正确的中断信号。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找到了系统日志溢出问题的答案。 显然、内核配置项会在有 I2C 或电源设备时导致这种情况、bq27421-G1都是这两种情况。

    CONFIG_POWER_SUPPLY_DEBUG
    CONFIG_I2C_DEBUG_CORE

    bugs.freedesktop.org/show_bug.cgi

    此 URL 指示为避免这种情况,请禁用这两个配置项中的一个。 我仅启用了 CONFIG_POWER_SUPPLY_DEBUG、并且存在问题。 我必须禁用它、同时已禁用 CONFIG_I2C_DEBUG_CORE 以解决该问题。

    我仍然需要确定如何为我们将在系统中使用的电池配置此驱动程序、因此我还没有解决此问题、而是越来越近了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将发布此驱动程序工作的结果摘要。

    平台

    Variscite SD410运行 Debian Linaro 4.4.9、带 preemit-RT 补丁17

    项目1:设备树修改。

    在 BQ27421-G1所在的 i2c 节点内、添加以下内容

    (笑声)

    时钟频率=<100000 >;/*!!tng6-add *

    (笑声)

    bq27421@55{

    兼容="ti、bq27421";

    reg =<0x55>;

    };

    (笑声)

    };

    项目2:第一个应用于 bq27xxx_battery.c 的补丁

    添加以下行

    #ifdef CONFIG_of

    静态常量结构 of _device_id bq27xxx_battery_i2c_for_match_table[]={

    {.compatible ="ti、bq27200"}、

    {.compatible ="ti、bq27210"}、

    {.compatible ="ti、bq27500"}、

    {.compatible ="ti、bq275100"}、

    {.compatible ="ti、bq27520"}、

    {.compatible ="ti、bq27530"}、

    {.compatible ="ti、bq27531"}、

    {.compatible ="ti、bq27541"}、

    {.compatible ="ti、bq27542"}、

    {.compatible ="ti、bq27546"}、

    {.compatible ="ti、bq27742"}、

    {.compatible ="ti、bq27545"}、

    {.compatible ="ti、bq27421"}、

    {.compatible ="ti、bq27425"}、

    {.compatible ="ti、bq27441"}、

    {.compatible ="ti、bq27621"}、

    {}、

    };

    MODULE_DEVICE_TABLE (of、bq27xxx_battery_i2c_of _match_table);

    #endif

    添加带有注释符号的行。

    静态结构 i2c_driver bq27xxx_battery_i2c_driver ={
    .driver ={
    .name ="bq27xxx-battery"、
    .f_match_table = of _match_ptr (bq27xxx_battery_i2c_of _match_table)、//为补丁添加此行
    }、
    .probe = bq27xxx_battery_i2c_probe、
    .remove = bq27xxx_battery_i2c_remove、
    .id_table = bq27xxx_id、
    };

    项目3:应用于 bq27xxx_battery.c 的第二个补丁

    请参阅链接 :marc.info/

    请注意、如果您在这之前应用先前的修补程序、您的行号会有所不同、但您可能可以通过检查源代码来确定放置模板的位置。  这就是我所做的。

    项目4:应用于 bq27xxx_battery.c 的第三个补丁

    请参阅链接 :patchwork.kernel.org/.../

    同样、请注意、如果您应用此修补程序之前的修补程序、您的行号将有所不同。

    项目5:禁用电源和 i2c 调试内核选项

    请参阅链接 :bugs.freedesktop.org/show_bug.cgi

    这将避免导致 syslog 溢出的错误。

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

    感谢您分享详细的回复、解释您如何使其正常工作。 您能否以上述帖子作为答案来解决问题。