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/AM3354:设备树问题

Guru**** 2550940 points
Other Parts Discussed in Thread: TMS320C6746, AM3354

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/603828/linux-am3354-device-tree-issue

器件型号:AM3354
Thread 中讨论的其他器件:TMS320C6746

工具/软件:Linux

大家好、

我目前正在开发一个定制板、其中包含 ARM 处理器(AM3354)和 DSP (TMS320C6746)。 AM3354的 GPMC 连接到 DSP 的 UHPI 接口 (芯片选择为2)。 此外、AM33P4的 GPIO3[20]引脚连接到 DSP 的 RESETn 引脚。 我当前的目标是在每次电路板上电时自动复位 DSP。 为了为 UHPI 启动做好准备、必须进行此复位。

Linux 3.8.13安装在 ARM 上。 我为 UHPI 编写了驱动程序函数、一切都很好。 (器件读取、写入和 ioctl 函数都运行良好)直到今天上午、我修改了.dts 文件以设置 GPIO3[20]的 PINMUX。 基本上、我在"am33xx_pinmux: pinmux@44e10800"节点下添加了以下代码:

     pinctrl-0 =<... &DSP_CTRL_PINS>;

DSP_CTRL_PINS:DSP_CTRL_PINS{
    pinctrl-single、pins =<0x1A8 0x17>; //偏移为0x1A8、 模式7、输出、内部上拉*/
};

没有做任何其他事情。 生成了 DTB 文件、然后我重新启动了电路板、但 UHPI 器件消失了(不在/dev/folder 下列出)。 我追溯到我的驱动程序函数和 Linux 源代码,发现 GPMC_cs_request()失败。 看起来 CS 已经被其他东西声称了,我发现 没有调用 GPMC_probe ()来清除 GPMC_cs_map。 这真的很尴尬、因为我除了修改驱动程序源代码、配置文件或 Makefile 之外、没有做任何其他事情、除了器件树文件。

我感谢遇到类似问题的任何人提供帮助、或者为我提供有关如何将 GPMC 配置回正确方式的建议/提示。

注意:上周六、我尝试手动复位 DSP (即在/sys/class/gpio 下使用 echo 命令、一切正常)、但我肯定想在每次电路板上电时自动复位 DSP。

谢谢、

Charlie

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 请注意、Linux 3.8.13不是 TI 版本、因此 TI 不支持。 响应将限于配置中可能出现的语法错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Biser。

    我确认启动时没有调用 GPMC_PROBE ()。 因此,所有 CS 空间都处于忙状态,这就是 GPMC_cs_request()失败的原因。

    我在我的 Linux 内核源代码版本(版本3.8.13)中跟踪了以下调用链。 我相信 BeagleBone Black 也提供了此版本):  

    1)/arch/arm/mach-omap2/gpmc.c 中定义的 GPMC_init()

    2)/drivers/base/platform.c 中定义的 platform_driver_register (drv)

    3)/drivers/base/driver.c 中定义的 driver_register (drv)

    4)/drivers/base/bus.c 中定义的 bus_add_driver (drv)

    5)/drivers/base/dd.c 中定义的 driver_attach (drv)

    6) bus_for_each (drv->bus、NULL、drv、__driver_attach)在/drivers/base/bus.c 中定义

    7) 7)在/drivers/base/dd.c 中定义的__driver_attach (dev、drv)

    8) 8)在/drivers/base/dd.c 中定义的 driver_probe_device (drv、dev)

    9)/drivers/base/dd.c 中定义的 REAL_PROBE (dev、drv)

    10) drv->probe (dev)、它是驱动程序的探测成员函数。 我相信探测器功能是在步骤2中分配给 platform_driver_register()中的驱动程序的,这正是

    11) 11)在/drivers/platform.c 中定义的 platform_drv_probe (dev)

    12) platform_drv->probe (dev)、它是平台驱动程序的探测成员函数。 我希望此 prob()函数应该恰好是 GPMC_prob(),而实际上不是。 这就是问题所在。

    注:

    我想在整个呼叫链中有两个驱动器需要考虑。 一个是   在/arch/armgpmc.c 中定义的 GPMC_driver (结构 platform_driver)、我将其称为 platform_drv、而另一个是 GPMC_driver 的驱动程序成员、我只是将其称为 drvDEV 是连接到 GPMC 总线的引脚。 它们由 bus_for_each_dev()生成