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/BQ25898D:BQ25898D

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/589850/linux-bq25898d-bq25898d

器件型号:BQ25898D
主题中讨论的其他器件:BQ25890BQ25898

工具/软件:Linux

您好!

我们有一个 bq25898D 连接到运行 Linaro 4.5.9的 Variscite SD410开发套件板。  我们通过 i2c 线将其连接到电路板、并使用 i2cdetect 验证其是否存在。  我们查看了主线中提供的驱动程序、并找到了 bq25890_charger.c  我们将其构建为.ko 并通过 insmod 加载、加载后、控制台上显示以下 syslog 消息。

[710.815822] bq25890-CHARGER 1-006a:ID=2的芯片、不受支持!

bq25898D 具有 ID 3。  查看驱动程序的代码后、我可以轻松地删除 if 语句检查以允许探头函数继续、但即使这样、我们仍需要修改驱动程序、因为 bq25898D 和 bq25890之间的寄存器存在一些差异、即 REG01、REG03和 REG0A。  对于 REG01、我们只需禁用任何写入操作、因为 bq25898D 默认提供所需的值。  只要这些值不发生变化、这对我们来说就行了。  不同之处与不同之处 REG03和 REG0A 变化不大、对我们没有影响。

我的问题:

(1)是否存在专为内核4.4.9上运行的 bq25898D 编写的驱动程序?  如果是、我如何获取它?

(2)如果专门用于 bq25898D 的驱动程序不存在、那么在修改 bq25890_charger.c 驱动程序以接受 ID=3的芯片并避免对 REG01进行任何写入操作时、我是否需要知道任何地雷或 gotchas?

谢谢、

Brian

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

    我们没有 bq25898D 驱动程序。  最接近 的驱动器是 bq25898。 这两个器件的主要区别在于 bq25898D 使用 D+/D-进行输入限制检测、而 bq25898使用 PSEL。 这些驱动程序位于 https://github.com/tibms?tab=repositories。 希望这些信息能有所帮助。 谢谢!

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

    您好、Ning、

    您是否尝试使用 Linux 4.4.9内核编译此驱动程序?  如果不是、您使用了哪个内核?  我针对4.4.9构建此驱动程序的尝试失败。  见附件。  它具有我使用的 Makefile 和编译错误。

    谢谢、

    Brian

    e2e.ti.com/.../ning_2D00_archive1.zip

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

    给定驱动程序的内核版本似乎很旧、主要是 TI 拥有的2.6.x 系列。 您需要将驱动程序移植到最新内核。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    我现在检查到4.0、struct power_supply 是结构。 之后、他们将其拆分为结构 power_supply_desc 并将其移动到其中

    您能否尝试不在 power_supply 中的任何变量、将它们更改为
    例如,将 bq->usb.num_properties 添加到中

    struct power_supply ps = bq->usb

    ps.desc.num_properties= array_size (bq2589x_charger_props);

    我尚未进行测试。 看看它是否正常工作。

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

    您好 Dwarakesh、

    我尝试使用 bq25890_charger.c 的修改版本运行、因为它位于主线中。  我只需要进行一些小改动即可成功构建。  但是、当我尝试加载.ko 时、我会收到此错误消息。

    [10726.835113] bq25890-CHARGER 1-006a:无法探测 IRQ 引脚。

    [10726.840166] bq25890-CHARGER 1-006a:未找到 IRQ 资源。

    [10726.846329] bq25890-CHARGER:1-006a 的探头失败、错误-2

    对 devm_gpiod_get_index()的函数调用失败,我不确定原因。

    FWiw、这是我的器件树配置的一个片段。

    blsp_i2c6:I2C@78ba000{

    (笑声)

    bq25890@6a{

    兼容="ti、bq25890";
    reg =<0x6a>;
    TI、电池稳压电压=<4200000>;
    TI、充电电流=<1000000>;
    TI、端接电流=<50000 >;
    TI、预充电电流=<128000>;
    ti、minimum-sys-voltage =<3600000>;
    TI、BOOST-VOLTAGE =<5000000>;
    TI、BOOST-max-current =<1000000>;
    TI、use-ILIM 引脚;
    TI、热调节阈值=<120>;
    };

    };

    您是否认为最好采用 bq25890驱动程序路由或 bq25898路由。  如果很容易解决该 GPIO 错误、则后者似乎要做更多的工作。

     

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

    似乎需要使用 bq25890_IRQ 的 dtsi 条目。 最好尝试使用上述驱动程序、因为它是由 TI 人员提供的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    看起来有一个 INT PINT 引脚可以连接到主机。 我想您需要在器件树中使用 bq25890_IRQ 名称提供 INT 引脚连接到的 GPIO。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将尝试将 bq25898驱动程序移植到4.4.9。 我发现的东西和我在自由电子(即在线的内核源)中搜索时发现的一样多。 同时、我认为我仍然需要解决您提出的设备树问题。 我们将芯片连接到 GPIO 62、但我不知道将其分配给 IRQ 标签的语法对于器件树是什么。 您碰巧知道吗? 我正在阅读 Linux 器件树文档、但我没有找到任何与此类似的内容。

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

    您好 Brian、

    您是否仔细阅读过以下文档: documentation/GPIO/board.txt

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

    是的、以及 Documentation/devicetree/bindings/sinterrupt-controller/interrupts.txt、但是我没有看到任何将 IRQ 标签与特定 GPIO 中断引脚相关联的东西、至少在符合语法标准的示例中没有看到。

    TI 是否有适用于其 BQ25898驱动器的器件树配置的一些工作示例?

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

    您能否显示(显示的是 DTS 和代码错误日志)您尝试过的内容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    鉴于之前对 bq25890驱动程序的评论、我已经放弃了处理该问题的努力。 我第一次尝试将其移植到4.5.9。 它编译为树外模块、但它有一个未解析的符号、我认为要解析该符号、我必须将该模块放入树内。 我目前正试图让它在我的命令下建立在树中。 尽管进行了更改以将其添加到树中,但 make 过程仍会跳过它。 我现在想弄清楚为什么。

    因为一旦我成功完成树内构建、这就是我正在使用的 DTS 配置。 它直接来自 bq2589x 驱动程序的 GitHub 页面。

    bq25898d@6a{
    兼容="ti、bq2589x-1";
    reg =<0x6a>;

    TI、bq2589x、充电电压=<4208>;
    TI、bq2589x、充电电流=<2048>;
    TI、bq2589x、TERM-CURRENT =<256>;

    TI、bq2589x、enable-auto-dpdm;
    TI、bq2589x、使能端接;
    ti、bq2589x、enable-ico;
    TI、bq2589x、use-absolute-vindpm;

    TI、bq2589x、VBUS 电压-高电平=<8700>;/*将适配器调谐至输出9V *
    TI、bq2589x、VBUS 电压-低电平=<4400>;/*将适配器调谐至输出5V *
    TI、bq2589x、VBAT-最小电压至调谐=<3000>;
    };

    请注意、它没有任何 GPIO 引脚编号或 IRQ 值的参考。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它现在成功构建在树中、我已经使用驱动程序构建引导到该映像中。 在驱动程序的探测功能中、它会在启动时中止。 我将探测器函数的内容注释掉、但单个 printk 除外、重新编译、重新创建映像和重新引导。 会发生相同的中止、printk 永远不会将其放入 syslog (dmesg)中。 这使我怀疑仅调用探测器方法所需的设备树中缺少或格式错误的内容。

    FWiw、这里是系统日志的一些输出。

    [4.679845] bq2589x_charger_init、bq2589x_charger2_driver 寄存器已成功!
    [4.683811] bq2589x-1 1-006a:bq2589x_charger1_probe:检测到充电器器件 bq25898D、版本:1
    [4.709656]无法在虚拟地址00000000处处理内核 NULL 指针解除引用
    [4.709844] PgD = ffffffffc000e0f000
    [4.716932][000000000000]* PgD=000000008eb06003、* Pud=00008eb06003、* PMD=00008eb07003、* Pte=00e800000b000707
    [4.730208]内部错误:Oops:96000045 [#1]抢占 SMP
    [4.730261]模块链接在:
    [4.730336] CPU:2 PID:1 Comm:swapper/0未被污染4.4.9.9-linaro-lt-QCOM #5
    [4.730353]硬件名称:Variscite VAR-SD410CustomBoard (DT)
    [4.730379]任务:ffffffc00eb68000 ti: ffffffc00eb70000 task.ti: ffffffc00eb70000
    [4.730530] PC 位于 bq2589x_charger1_probe +0x154/0x58c
    [4.730537] LR 位于 bq2589x_charger1_probe +0x130/0x58c
    (笑声)
    [4.731301]呼叫追踪:
    [4.731316][ ] bq2589x_charger1_probe +0x154/0x58c
    [4.731385][ ] i2c_device_probe +0x184/0x23c
    [4.731546][ ] driver_probe_device+0x21c/0x450
    [4.731561][ ]__DRIVER_ATT+0x9C/0xa0
    [4.731590][ ] BUS_TO_EASE_DEV_0x58/0x98
    [4.731607][ ] driver_attach+0x20/0x28
    [4.731619][ ] BUS_ADD_DRIVER+0x1ec/0x290
    [4.731642][ ] driver_register+0x68/0x108
    [4.731685][ ] i2c_register_driver+0x34/0x98
    [4.731708][ ] bq2589x_charger_init+0x88/0xc4
    [4.731781][ ] do_one _initcall+0xc8/0x1c4
    [4.731870][ ] kernel_init_freeable +0x150/0x1F4
    [4.731970][ ] kernel_init+0x10/0xd8
    [4.732030][ ] RET_FANK_+0x10/0x40
    [4.732073]代码:a9067fbf f9002fb3 90002d81 9110e021 (f9000001)
    [5.230295]-[结束线迹0000000000000001 ]-->
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、

    您能否在探测功能中添加日志。 其中一个指针是 NULL。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、在我上一篇文章中的内核跟踪中、探测器方法添加了 printk 调用、其中第一个调用作为函数的第一条指令执行。  这就是我怀疑器件树文件中存在问题的原因。

    -Brian

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

    我执行以下操作来调试内核崩溃。
    1.在内核 Makefile 中启用-g 选项
    2.构建源并运行以查看崩溃日志
    3.检查 PC:bq2589x_charger1_probe +0x154/0x58c
    将会注意到、从函数 bq2589x_charger1_probe 开始、崩溃偏移为0x154
    arm -linux*-objdump -sd 驱动程序/power/bq2589x_charger.o (假设源文件为 bq2589x_charger.c 并使用相同的目标文件名构建)
    6.转至函数 bq2589x_charger1_probe。 从函数起始地址(例如0x123000)添加0x154 (例如0x123154)
    7、如果高于0x123154线、将会得到崩溃的线。 然后检查该行中的变量以验证它们是否为 NULL。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dwarakesh、

    (1)

    首先、我偶然发现了一些我认为应该明确声明的东西、以确保我们位于同一页上。  我为该驱动程序克隆了此 repo。

    我还找到了该驱动程序。

    它们在年龄方面看起来都差不多、每个示例器件树都有一个 BQ25898D 示例。  TI 是否会推荐其中一个?

    (2)

    我找到了为什么 syslog 未包含我的任何 printk 消息。  我最初创建了一个树外构建、然后对该驱动程序进行树内构建、我在构建树内源时错误地修改了树外源。  我现在已经解决了这个问题、并在之前发布的堆栈跟踪中找到了 NULL 指针异常的原因。  但是、在完成更多的调试后、我有另一个。

    [4.697776]  bq2589x-1 1-006a:bq2589x_charger1_probe:IRQ = 95

    [4.706432]  无法在虚拟地址00000002处处理内核 NULL 指针解除引用

    (笑声)

    [4.803500]  PC 位于 i2c_smbus_read_Byte_data+0x10/0x3c

    [4.803569]  LR 位于 bq2589x_read_Byte.isra.4+0x44/0xa0

    (笑声)

    [5.652932]  [ ] el1_da+0x18/0x70

    [5.652990]  [ ] bq2589x_read_Byte.isra.4+0x50/0xac

    [5.653034]  [ ] bq2589x_GET_VBUS_TYP+0x1c/0x3c

    [5.653037][   ] bq2589x_USB_get_property+0x20/0xa8

    [5.653056]  [ ] power_supply_get_property+0x20/0x30

    [5.653087]  [ ] POWER_SUPPLY_UPDATE_LEDs+0x2C/0x190

    [5.653109]  [ ] power_supply_changed_work + 0x6c/0xdc

    [5.653159][   ] Process_One_Work+0x138/0x304

    [5.653194][   ] worker_thread+0x160/0x440

    [5.653205]  [ ] kthread+0xe0/0xf4

    [5.653235]  [ ] RET_FANK_+0x10/0x40

    bq->client member data points to NULL at this location in the source。

    静态 int bq2589x_read_Byte (struct bq2589x *bq、u8 *数据、u8 reg)

    内转台;

    mutex_lock (&bq2589x_i2c_lock);
    RET = i2c_smbus_read_Byte_data (bq->client、reg);

    因此、bq2589x_charger1_probe ()中的 i2c_set_clientdata (client、bq)调用似乎没有实际设置该数据成员。

    静态 int bq2589x_charger1_probe (struct i2c_client *客户端、
    const 结构 i2c_device_id *id)

    (笑声)

    bq->dev =&client->dev;

    bq->client = client;
    I2C_SET_clientdata (client、bq);

    这就是我现在的位置。  但是、在继续进行#2之前、我认为我应该先检查一下#1。

    谢谢、

    Brian

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

    很抱歉,我不知道。 希望 TI 代表能对这个问题做一些答复。 但我不确定 D 是否代表双通道。 您可以尝试所有可用的驱动程序、直到在此处得到回复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已将 bq25898_DUAL 驱动程序移植到 Linaro 4.5.9。  它已成功加载、但遗憾的是、它会使用包含 syslog 消息的控制台、从而使控制台无法使用。 例如

    **9 printk 消息丢失**[30.236967] systemd-journale[1493]:/dev/kmsg 缓冲区溢出,一些消息丢失。

    我在对 BQ27421-D 的驱动程序进行补丁以使其在 Linaro 4.5.9上正常工作后、观察到了 BQ27421-D 的类似行为。  作为参考、我有两个针对该芯片的未决案例。

    但是、对于 BQ25898D、我尚未确认它正在执行核心任务 、因为此模块依赖于一个外部符号、内核构建过程仅在构建树时导出、因此无法将其构建为.ko、并在发起无线连接后插入。  我没有有线网络支持。  我尝试向/etc/init.d 添加脚本以启动无线连接、但没有任何效果。  我还尝试在启动时将驱动程序列入黑名单、以便在加载驱动程序之前可以使用 ssh、但到目前为止也不起作用。

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

    我找到了系统日志溢出问题的答案。  很明显、内核配置项会在有 I2C 或电源设备的情况下导致这种情况、bq25898d 就是这两种情况。

    CONFIG_POWER_SUPPLY_DEBUG
    CONFIG_I2C_DEBUG_CORE 

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

    我移植的驱动程序 bq25898_dual.c 在系统关断时中止、即当系统取消注册驱动程序时、因此我仍未完全解决此问题。

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

    很高兴听到您取得了进展。 感谢您回复此处的超记录消息修复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW、BQ25898驱动程序的 REPO 为空、单个文本文件除外。

    github.com/.../bq25898