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.

[参考译文] AM62L:LP5815 LED 控制器驱动器探测问题

Guru**** 2555630 points
Other Parts Discussed in Thread: LP5815

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1569362/am62l-lp5815-led-controller-driver-probing-issue

器件型号:AM62L
主题:LP5815 中讨论的其他器件

工具/软件:

您好、  

目前、我正在 Linux 环境中将 LP5815 LED 控制器驱动器与基于 AM62Lx 的定制电路板集成在一起。 我参考了[TIThread ]上提供的驱动程序文档。 我遵循了驱动程序随附的参考 DTS(器件树源代码)文件、需要在 LP5815 器件的 I2C 节点上添加 SCL 引脚配置。

器件的 DTS 节点:  

在驱动器代码中、请求了 GPIO 引脚来控制 LED 输出。 我已经修改了 DTS 绑定、以匹配我们电路板的 pinmux 和 GPIO 分配。 我在探测函数中添加了一些打印件。 我在此处共享它以进行调试:  

static int lp5815_probe(struct i2c_client *client)
{
        struct lp5815_chip *chip;
        int ret;
        printk("Hello from lp5815 kernel module!\n");
        chip = devm_kzalloc(&client->dev, sizeof(struct lp5815_chip),
                        GFP_KERNEL);
        if (!chip) {
                return -ENOMEM;
        }
        mutex_init(&chip->lock);
        chip->i2c_cl = client;
        chip->dev = &client->dev;
        chip->regs = &regs;
        chip->command = NONE;
        chip->total_leds = MAX_LEDS;
        chip->attr_group.name = "lp5815_chip_setup";
        chip->attr_group.attrs = lp5815_chip_attributes;
        i2c_set_clientdata(client, chip);
        printk("lp5815: Kernel default values are written\n");
        ret = sysfs_create_group(&chip->dev->kobj, &chip->attr_group);
        if (ret) {
                printk("lp5815 --> [DEBUG]: sysfs_create_group failed\n");
                pr_info("[DEBUG]: sysfs_create_group failed\n");
                return ret;
        }
        printk("lp5815 --> [DEBUG]: sysfs_create_group Done\n");

        ret = lp5815_led_init(chip);
        if (ret) {
                return ret;
        }
        /* Request 2 more gpio pins for scl sda */
        ret = of_property_read_u32(client->dev.of_node, "scl-pin",
                        &chip->scl_pin);
        if (ret) {
                printk("lp5815 --> [DEBUG]: Failed to read scl-pin from device tree\n");
                pr_info("[DEBUG]: Failed to read scl-pin from device tree\n");
                return ret;
        }
        printk("lp5815: [DEBUG]: Successfully read scl-pin from device tree\n");
        ret = devm_gpio_request_one(&client->dev, chip->scl_pin,
                        GPIOF_IN, "scl-pin");
        if (ret) {
                printk("lp5815: [DEBUG]: Failed to request SCL GPIO: %d\n", ret);
                pr_err("[DEBUG]: Failed to request SCL GPIO: %d\n", ret);
                return ret;
        }
        printk("lp5815: [DEBUG]: Successfully to request SCL GPIO: %d\n", ret);
        ret = of_property_read_u32(client->dev.of_node, "sda-pin",
                        &chip->sda_pin);
        if (ret) {
                printk("lp5815: [DEBUG]: Failed to read sda_pin from device tree\n");
                pr_info("[DEBUG]: Failed to read sda_pin from device tree\n");
                return ret;
        }
        printk("lp5815: [DEBUG]: Successfully to read sda_pin from device tree\n");
        ret = devm_gpio_request_one(&client->dev, chip->sda_pin,
                        GPIOF_IN, "sda-pin");
        if (ret) {
                printk("lp5815 --> [DEBUG]: Failed to request SDA GPIO: %d\n", ret);
                pr_err("[DEBUG]: Failed to request SDA GPIO: %d\n", ret);
                return ret;
        }
        printk("lp5815 --> [DEBUG]: Successfully to request SDA GPIO: %d\n", ret);
        /* disable charging and enable device as default */
        lp5815_write(chip, CHIP_EN_REG, 0x03);
        return 0;
}


根据 GPIO 引脚更新了 dts:  
ledController: lp5815@2D {
                compatible = "ti,lp5815";
                reg = <0x2D>;
                scl-pin = <&main_gpio0 98 GPIO_ACTIVE_HIGH>;
                sda-pin = <&main_gpio0 99 GPIO_ACTIVE_HIGH>;
//              scl-pin = <22>;  //corresponding pin 26 in rk3568 board
//              sda-pin = <16>;  //corresponding pin 25 in rk3568 board
        };

但是、在启动期间、LP5815 驱动程序无法进行探测。 内核日志显示一条错误消息、指示尝试请求 GPIO 时“Canto access GPIO“。 相关的 dmesg 输出如下所示:


此致、  
参数

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

    尊敬的 Parv:

    LED 控制器不是 TI 产品、因此我无法保证能找到一位了解这款芯片并能提供帮助的 TI 同事。 我遇到了下面的主题。 您能回顾一下它并告诉我这是否有帮助吗? 例如、我可以看到他们将 I2C 引脚配置为 INPUT_PULLUP。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1477632/am625-lp5521-driver-failed-to-load-with-error-–22?tisearch=e2e-sitesearch&keymatch=probe%25252525252525252520with%25252525252525252520driver%25252525252525252520failed%25252525252525252520with%25252525252525252520code%25252525252525252520-17#

    谢谢、

    Stan  

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

    HII Stan、

     LP5815 的数据表显示了 TI 产品。  

    此致、
    参数  

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

    尊敬的 Parv:

    抱歉、我误解了器件型号。  

    PCB 上是否有 I2C 上拉电阻器? 您能否检查硬件配置、以便排除硬件问题?

    【常见问题解答】LP5814:向 LP5814 / LP5815 / LP5816/LP5817 发送 I2C 命令时如何解决 NACK

    谢谢、

    Stan

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

    尊敬的 Stan:

    所有 I2C 上拉寄存器详细信息都是正确的、我们能够在 I2C 总线 0 的 2D 从器件地址检测器件。 我们的驱动程序不是在该位置进行探测。  

    是否可以通过 I2C 引脚配置访问 GPIO 引脚。 因为我已经确认驱动器正在使用 I2C 引脚在 GPIO 上发送数据。  

    此致、  
    参数  

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

    尊敬的 Parv:

    您是否可以尝试使用编号为 115 和 116 的针脚来代替 98 和 99?

    谢谢、

    Stan

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

    尊敬的 Stan:  

    将地址从 98 和 99 分别改为 115 和 116 的原因是什么?  

    此致、
    参数

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

    Parv,

    我可以看到工具和数据表之间存在这种不一致。  

    谢谢、

    Stan

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

    尊敬的 Stan:  

    我根据您建议更改值、但收到了 Failed to Request SCL GPIO 等消息、错误代码为–517

    root@am62lxx-EVM:~# dmesg | grep lp
    [ 0.013246]校准延迟环路(已跳过)、使用计时器频率计算值。 400.00 BogoMips (lpj=800000)
    [ 1.016034] sdHCi-pltfm:sdHCI 平台和驱动程序帮助程序
    [1.387362]您好,从 lp5815 内核模块!
    [ 1.391835] lp5815:写入内核默认值
    [ 1.397032] lp5815 -->[debug]:sysfs_create_group done
    [ 1.406609] lp5815:【调试】:已成功从器件树中读取 SCL 引脚
    [1.413424] lp5815:【调试】:无法请求 SCL GPIO:–517
    [2.961101]你好,从 lp5815 内核模块!
    [ 2.969041] lp5815:写入内核默认值
    [ 2.974148] sysfs:无法创建重复的文件名“/devices/platform/bus@f0000/20000000.i2c/i2c-1/1-002D/lp5815_chip_setup“
    [ 2.985637] lp5815_probe+0xb8/0x7a0
    [2.985761] lp5815 -->[debug]:sysfs_create_group failed
    [3.110710] lp5815 1-002d:带有驱动程序的探测器 lp5815 失败、错误为–17


    此致、  
    参数

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

    尊敬的 Parv:

    我已经通知了 软件专家。 他们很快就会答复。 如果几天没有听到、请随时 ping 通螺纹。

    谢谢、

    Stan

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

    尊敬的 Parv:

    这显然是由 lp5815 驱动程序中的一个错误引起的。 请向驱动程序提供商寻求帮助。

    下面是对 bug 的分析:

    root@am62lxx-evm:~# dmesg | grep lp
    [ 0.013246]校准延迟环路(已跳过)、使用计时器频率计算值。 400.00 BogoMips (lpj=800000)
    [ 1.016034] sdHCi-pltfm:sdHCI 平台和驱动程序帮助程序
    [1.387362]您好,从 lp5815 内核模块!
    [ 1.391835] lp5815:写入内核默认值
    [ 1.397032] lp5815 -->[debug]:sysfs_create_group done
    [ 1.406609] lp5815:【调试】:成功从器件树中读取 SCL 引脚

    到目前为止、在驱动器探头中表现良好、

    [1.413424] lp5815:【调试】:无法请求 SCL GPIO:–517

    然后由于 GPIO 模块尚未初始化、因此此处失败。 代码–517 为-EPROBE_DEDER。 这不是错误,内核稍后将再次调用 lp5815_probe ()。

    [2.961101]您好,来自 lp5815 内核模块!
    [ 2.969041] lp5815:写入内核默认值

    现在内核再次调用 lp5815_probe (),

    [2.974148] sysfs:无法创建重复的文件名'/devices/platform/bus@f0000/20000000.i2c/i2c-1/1-002D/lp5815_chip_setup'[/c引号]

    但在 sysfs_create_group() 中失败、因为首次调用 lp5815_probe() 时创建了 sysfs 组。

    有多种方法可以解析它,但最简单的方法是将 sysf_create_group() 移到 lp5815_probe () 的末尾。