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/DM388:访问4.4内核器件树中的计时器

Guru**** 2562120 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/609451/linux-dm388-access-to-timers-in-4-4-kernel-device-tree

器件型号:DM388

工具/软件:Linux

在介绍器件树之前、我正准备从之前的实施中移植。  在这个世界中、我能够调用 OMAP-dm_timer_request_specific (x)、其中"x"是选择8个通用计时器之一的整数。  在我的具体案例中、我请求的是 timer4和 timer5。  在"DM38x IPNC RDK GA 版本(v3.9.1)"定义的新环境中、有一个器件树、调用失败、并显示消息"请使用 OMAP-dm_timer_request_by_cap/node ()"。  作为第一个尝试、我尝试将调用更改为简单的 OMAP-dm_timer_request()、我认为它应该返回下一个可用的未声明计时器。  该函数似乎认为没有更多可用的计时器。

我的设备树是通过基于 dm38x-csk.dts 的".dts"定义的。  该文件包含仅定义 Timer1和 timer2的 ti81xx.dtsi。  在实验中,我在该文件中添加了计时器3-8的定义,但这不正确或不充分,因为我收到诸如"platform 48042000.timer: cannot lookup hwmod 'timer3'"和 OMAP-dm_timer_request()仍然失败的消息。

那么、我应该如何访问其他 DM388计时器?

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

    您可以探索在默认内核配置和 DTS 中如何使用 Timer1/2、并重复使用相同的方法。 应将附加计时器添加到 ti81xx.dtsi。 然后查看以下 wiki:

    processors.wiki.ti.com/.../IPNC_RDK_DM38x_,_DM8127

    使用函数 OMAP2_PM_WAKEUP_ON_TIMER ()。 您还应使用以下计时器驱动程序:

    kernel/arch/arm/mach-omap2/timer.c

    另请参阅以下指针:

    内核/文档/devicetree/bindings/arm/omap/timer.txt

    kernel/arch/arm/mach-omap2/remoteproc.c -> timer = omap_dm_timer_request_by_node (np);

    内核/arch/arm/plat-omap/include/plat/dmtimer.h
    kernel/arch/arm/plat-omap/dmtimer.c

    e2e.ti.com/.../464956
    e2e.ti.com/.../421917
    e2e.ti.com/.../506664
    e2e.ti.com/.../415079

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

    感谢您的回答、我肯定会详细研究、但是您的建议中有一个部分我已经尝试过、但这是有问题的、即"附加计时器应添加到 ti81xx.dtsi 中。"

    下面是我向 ti81xx.dtsi 添加 timer3的示例:

    timer3:计时器@42000{
       兼容="ti、dm814-timer";
       reg =<0x42000 0x2000>;
       中断=<69>;
       ti、hwmds ="timer3";
    };


    以下是 DTB 的相应解码输出:

    计时器@42000{
       兼容="ti、dm814-timer";
       REG =<0x00042000 0x00002000>;
       中断= 0x00000045>;
       ti、hwmds ="timer3";
    };

    最后、这是来自内核的错误消息、表明存在问题:

    Platform 48042000. timer:无法查找 hwmod "timer3"

    因此、无论我的.dtsi 条目不正确、还是我必须执行其他操作。

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

     您需要 timer3的 hwmod,将其添加到 arch/arm/mach-omap2/omap_hwmod_81xx_data.c 中

    您必须添加如下所示的内容,下面是您为 Timer1找到的条目

    静态结构 omap_hwmod_opc_if dm814x_l4_ls__timer1 ={
       .master    =&dm81xx_L4_ls_hwmod、
       .slave     =&dm814x_Timer1_hwmod、
       .clk       ="timer_sys_clk"、
       .user      = OCP_USER_MPU、
    };

    与添加到 hwmods 列表相同、

    静态结构 omap_hwmod_opc_if * ti81xx_hwmod_opc_ifs_dm38x[]__initdata ={

    谢谢、此致、

    Vishwanath Patil

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

    因此、兔子洞的位置稍微远一点。

    我已将其添加到计时器3的 omap_hwmod_81xx_data.c 中:

    静态结构 omap_hwmod_opc_if dm814x_l4_ls__timer3 ={
       .master   =&dm81xx_L4_ls_hwmod、
       .slave    =&dm814x_timer3_hwmod、
       .clk      ="timer_sys_clk"、
       .user     = OCP_USER_MPU、
    };


    只有 dm814x_timer3_hwmod 不存在、因此我还添加了以下内容:


    静态结构 omap_hwmod dm814x_timer3_hwmod ={
       .name      ="timer3"、
       clkdm_name ="alwin_l3s_clkdm"、
       main_clk   ="timer3_fck"、
       /dev/attr   =&capability alwin_dev_attr、
       .class     =&dm816x_timer_hwmod_class、
       flags     = HWMOD_NO_IDLEST、

    现在、我收到以下内核错误消息:

    Platform 48042000.timer:timer3_fck 的 CLK_get 失败
    ------ [在此处剪切]-----
    警告:CPU:0 PID:1在 arch/arm/mach-omap2/omap_hwmod.c:2119 _enable+0x340/0x350 ()
    OMAP-hwmod:GPIO1:启用状态只能从初始化、空闲或禁用状态进入
    链接的模块:
    CPU:0 PID:1 Comm:swapper 被污染:G       W      4.4.12 #1
    硬件名称:通用 TI81xx (平展器件树)
    回溯:
    [ ](dump_backtrace)从[ ](show_stack+0x18/0x1c)
     R6:c001f538 R5:00000009 R4:00000000 R3:00000000
    [ ](show_stack)从[ ](dump_stack+0x24/0x28)
    [ ](dump_stack)从[ ](warn_slESpath_common+0x8c/bb 8)
    [ ](warn_slowpath_common)、来自[ ](WARN_RASPH_FMt+0x38/0x40)
     R8:00000000 r7:00000004 R6:c4919200 R5:00000000 R4:c05a9668
    [ ](warn_slowpath_fmt)、来自[ ](_enable+0x340/0x350)
     r3:c05ae52c r2:c05a9668
     r4:c06a8b44
    [ ](_enable)从[ ](omap_hwmod_enable+0x20/0x30)
     R7:00000004 R6:c4919200 R5:00000000 R4:a0000093
    [ ](OMAP-hwmod_enable)、来自[ ](OMAP-DEVICE_ENABLE+0x48/0x98)
     R4:00000001 R3:c4919240
    [ ](OMAP-DEVICE_ENABLE)从[ ](_od_runtime_resume+0x18/0x2C)
     r6:c06add00 r5:c00210fc r4:c4915e10 r3:00000002
    [ ](_od_runtime_resume)从[ ](rpm_callback+b0/0xcc)
     R4:c4915e10 R3:00000002
    [ ](rpm_callback)、来自[ ](rpm_resume+0x310/0x4f4)
     R5:c00210fc R4:c490ce10
    [ ](rpm_resume)、从[ ](__pm_runtime_resume+0x3c/0x44)
     R10:c025121c R9:0000001e R8:c4915e10 r7:c04b6274 R6:c4915e00 R5:c4911850
     R4:60000013
    [ ](__pm_runtime_resume)从[ ](OMAP-GPIO_PROBLE+0x1e0/0x670)
     r4:c491a010 r3:00000001
    [ ](OMAP-GPIO_PROBE)、来自[ ](platform_drv_probe +0x54/b8)
     R10:00000000 R9:00000000 R8:c06b5874 r7:fffdfb R6:c06b5874 R5:c4915e10
     R4:c0711ec0
    [ ](platform_drv_probe)、来自[ ](DRIVER_PROBLE_DEVICE_0x238/0x480)
     R7:00000000 R6:c06da610 R5:c4915e10 R4:c0711ec0
    [ ](driver_probe_device)从[ ](_DEVICE_ATE_DRIVER+0x88/0x94)
     R9:00000000 R8:c0711e9c r7:00000001 R6:c4915e10 R5:c486bc88 R4:c06b5874
    [ ](_device_attach_driver)、来自[ ](BUS_TO_EASE_DRV+0x6c/0xa0)
     r6:c029df5c r5:c486bc88 r4:00000000 r3:c49072c0
    [ ](bus_for_each _drv)从[ ](_DEVICE_ATT+0xac/0x13c)
     R6:c4915e44 R5:c4915e10 R4:c4915e10
    [ ](_device_attach)从[ ](DEVICE_INPLET_PROBE +0x14/0x18)
     R7:00000000 R6:c06ba750 R5:c4915e10 R4:c4915e18
    [ ](DEVICE_INTERY_PROBE)从[ ](BUS_PROBLE_DEVICE_0x8c/0x94)
    [ ](bus_probe_device)、来自[ ](DEVICE_ADDE+0x418/0x5b0)
     R6:c4915e10 R5:c490ce10 R4:c4915e18 R3:c4801900
    [ ](device_add)从[ ](of _device_add+0x3c/0x44)
     R10:c490ce10 R9:00000000 R8:c0690414 r7:00000000 R6:c4915e10 R5:c4d2a3d4
     R4:c4915e00
    [ ](of _device_add)从[ ](of _platform_device_create_pdata+0x94/0xd4)
    [ ](of _platform_device_create_pdata)从[ ](of _平台_总线_创建+0x104/0x228)
     R7:00000001 R6:c068cfb8 R5:c4d2a3d4 R4:00000000
    [ ](of 平台总线创建)、来自[ ](of _平台_总线_创建+0x15c/0x228)
     r10:c490ce10 r9:c06dde68 r8:c0690414 r7:00000001 r6:c068cfb8 r5:c4cfede4
     r4:c4d2a3d4
    [ ](of 平台总线创建)、来自[ ](of _平台_总线_创建+0x15c/0x228)
     r10:c490cc10 r9:c06dde68 r8:c0690414 r7:00000001 r6:c068cfb8 r5:c4cfec48
     r4:c4cfede4
    [ ](of 平台总线创建)、来自[ ](of _platform_populate_0x64/0xc0)
     R10:00000000 R9:00000001 R8:00000000 r7:c068cfb8 R6:c0690414 R5:c4cfdb78
     r4:c4cfec48
    [ ](for_platform_populate)从[ ](pdata_quirks_init+0x64/0x7c)
     R9:c069c6d8 R8:00000060 r7:c064f940 R6:c4908600 R5:00000000 R4:c0690414
    [ ](pdata_quirks_init)、来自[ ](OMAP-general_init+0x1c/0x24)
     r4:36d61600 r3:c06842f0
    [ ](OMA_general_init)、来自[ ](customer_machine+0x28/0x48)
    [ ](customize_machine)从[ ](do_one _initcall+0x184/0x1f8)
    [ ](多个_initcall)、来自[ ](kernel_init_freeable +0x154/0x1f0)
     R10:c0685824 R9:c064d608 R8:00000060 r7:c0685838 R6:c06e03c0 R5:00000003
     r4:c0695e7c
    [ ](kernel_init_freable)从[ ](kernel_init+0x10/0xFC)
     R10:00000000 R9:00000000 R8:00000000 r7:00000000 R6:00000000 R5:c048b23c
     R4:00000000
    [ ](kernel_init)、来自[ ](RET_FANK_F叉+0x14/0x2C)
     R4:00000000 R3:c486a000
    --[结束线迹16675a450d09faff ]-->

    这看起来不是很好;-)

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

    您应该使用&dm814x_l4_ls_timer3更新* ti81xx_hwmod_opc_ifs_dm38x[](来自文件 OMAP-hwmod-81xx-data.c)

    您应该使用 timer3_fck 更新 drivers/clk/ti/clk-814x.c 文件

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

    还有一个诱杀装置正在等待我的腿被吹走。  我发布的示例都是针对计时器3的、但我实际上是增加了对计时器3-8的支持。  在进行最后一次更改后、当代码到达计时器4时、我再次遇到各种内核崩溃。  有一个 ti81xx-clocks.dtsi 定义了所有"_fck)时钟。  由于我不理解的原因、与计时器1-3和5-8不同、没有 timer4_fck。  相反、它称为 gpt4_fck!  在 clk-814x.c 中进行适当的更改后、我最终得到了一个不会被抛在整个位置的内核。

    但是,即使添加了所有这些计时器,OMAP-dm_timer_request()仍然无法找到一个;-( 某些 printk 的时间。

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

    [引用 user="David Olson61"]但是,即使添加了所有这些计时器,OMAP-dm_timer_request()仍然找不到一个;-( 某些 printk 的时间。

    根据我的理解、当器件树文件中描述计时器时、 omap_dm_timer_request_by_node() should be used

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

    在处理了一些干扰之后、我回到这个问题、发现 OMAP-dm_timer_request....()套件都不起作用、因为我描述的所有新计时器都没有注册。  这是因为我遵循了 ti81xx.dtsi 中现有计时器1和2的模型、并将新添加的计时器的"兼容"字符串设置为"ti、dm814-timer"。

    有两个文件引用了一组 TI 定时器兼容性字符串、arch/arm/mach-omap2/timer.c arch/arm/plat-omap/dmtimer.c  这两个都是我构建的一部分、并且都包含几乎完全相同的计时器兼容性字符串列表、唯一的区别是  dmtimer.c 中缺少"ti、dm814-timer"(和"ti、dm816-timer")

    我添加了这些字符串... 但事情仍然不起作用!  现在已注册这些计时器,OMAP-dm_timer_request()将找到一个计时器。  然后它将调用内部函数 OMAP-dm_timer_preped()。  该函数通过调用 OMAP-dm_timer_set_source (timer、OMAP-timer_SRC_32_kHz)来结束。  该函数将 OMAP-TIMER_SRC_32_kHz 转换为搜索名为 "TIMER_32k_ck "的时钟。  应通过引用 drivers/clk/ti/clk-814x.c 中的结构来解决该引用  该结构不包含此类条目。  它确实包含一个"timer_sys_ck "条目、该条目与常数 OMAP-timer_SRC_SYS_CLK 相关联、因此我更改了 OMAP-dm_timer_prepare()以将源设置为该值、最后我能够获得计时器的保持!

    整个过程涉及到很多" poke & Hope "、我并不声称我所做的是正确的。  我所知道的是、我将更改提交到我的存储库、并继续处理下一个问题。