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/AM4376:RT 下的 PRU 移植

Guru**** 2609955 points
Other Parts Discussed in Thread: AM4376, AM4372

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/655187/linux-am4376-pru-porting-under-rt

器件型号:AM4376
主题中讨论的其他器件: AM4372

工具/软件:Linux

您好!

我们使用主线内核4.9.61和 AM4376在定制板上的 RT 补丁。  

目标是使用 PRU:全部4个内核(不含 PRU ETH)

我已经移植了 TI BSP 中的 PRU 相关内容:AM437X-EVM-Linux-RT-SDK-src-04.02.00.09

在这里、PRU 子系统开始处的 dmesg 输出为:

[87.545684] ti-pruss 54400000。pruss:创建 PRU 内核和其他子平台设备
[87.582027] ti-pruss 54440000.pruss:创建 PRU 内核和其他子平台设备
[88.085916] PRU-rproc 54434000.pru0:内存 IRAM:PA 0x54434000大小0x3000 va e0b2c000
[88.085950] PRU-rproc 54434000.pru0:内存控制:PA 0x54422000大小0x400 va e0b5d000
[proc 085961] PRU-rproc 54434000.pru0:内存调试:PA 0x54422000大小0x400V e0b548240.000[proc 0458r400.pru852001.pru85400] PRU-r85400.pru852001.pru85240.pru85240.pru85240.pru85240.pru85240.pru85240.pru85240.pru85240.pru85240.pru85240.pru1.pru1.pru1.pru1.pru400]


PRU rproc 节点/OCP@44000000/pruss_soc_bus@54426000/pruss@54400000/PRU@54434000成功探测
[88.093318] PRU-rproc 54438000.pru1:内存 IRAM:PA 0x54438000大小0x3000 va e0b64000
[88.093365] PRU-rproc 54438000。pru1:内存控制:PA 0x54424000大小0x400 va e0b61000
[proc 09332] PRU-rproc 54438000。pru1:内存调试:PA 0x54424000 vr
08458r400_pru4001:pru400 rprupru4001:rpru400 rpru400 rpru400 rpru400 rproc 0488.24u1:rpru400 rpru400 rpru400 rpru400 rpru400 rpru400 rpru400 rpru400 rpru400 rpru400 rpru1:rpru400 rpru400 rpru400 rpru400 r 

PRU rproc 节点/OCP@44000000/pruss_soc_bus@54426000/pruss@54400000/PRU@54438000成功探测
[88.101376] PRU-rproc 54474000.pru0:内存 IRAM:PA 0x54474000大小0x1000 va e0b6a000
[88.101424] PRU-rproc 54474000.pru0:内存控制:PA 0x54462000大小0x400 va e0b6c000
[proc 101440] PRU-rproc 54474000.pru0:内存调试:PA 0x54462400大小0x400004b0b6c000 [proc 8524] prupru8524] prupru85240.pru8524_pru85240.pru8524] pru4000.pru85u8524_pru4000.pru4000.pru8524_pru4000.pru85u85u4000.pru4000.pru85u8524]


PRU rproc 节点/OCP@44000000/pruss_soc_bus@54426000/pruss@54440000/PRU@54474000已成功探测
[88.112675] PRU-rproc 54478000.pru1:内存 IRAM:PA 0x54478000大小0x1000 va e0b70000
[88.114844] PRU-rproc 54478000.pru1:存储器控制:PA 0x54464000大小0x400 va e0b72000
[88.114869] PRU-rproc 54478000.pru1:存储器控制:PA 0x54464000-pru85808.2480 pruprupruprupru1.pru85248r1r85248r85801.prupruprupruprupruprupruprupruprupru1.prupruprupru1.pru1.pru1.prupru1.pru85248upruprupruprupru1.pruprupruprupru1.pr


PRU rproc 节点/OCP@44000000/pruss_SoC_bus@54426000/prusss@54440000/PRU@54478000探测成功 

似乎是设备树问题(请参阅/drivers/mailbox/mailbox.c):

struct mbox_chan * mbox_request_channel (struct mbox_client * cl、int index)
{
struct device * dev = cl->dev;
struct mbox_controller * mbox;
struct of_phandle_args spec;
struct mbox_chan * chan;
unsigned long flags;
int ret;

if (!dev ||!dev->of _node){
pr_debug ("%s":无所有者设备节点\n"、__func__);
return ERR_ptr (-ENODEV);
}

mutex_lock (&con_mutex);

if (of _parse_phandle_with _args (dev->node) "mbox"、
"#mbox-cells"、INDEX、&spec){
DEV_dbg (dev、"%s":无法解析\"mbox\" property\n"、__func_);
mutex_unlock (&con_mutex);
返回 ERR_PTR (-ENODEV);

下面是我们的 DTS 补丁:

diff -urwN a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi
-- a/sarch/arm/boot/dts/am4372.dtsi2018-01-03:26:14.553435200 ++ b/ti/arm/boot/boot/dts/am4372.04

@@






=+mbox= 015"@@;<m400"+mpr1 = 014"+mrm 框;<1:+m01"=m1340"+mrx = 01";+mpr-mb =+m1340"+mb = 01";+mb = 01"=mpr-mb = 01";+mpr-mb =+mcr = 01";+mpr-mb = 2、mcr = 01";+mr = 2、mr = 015m = 015m = 01";mb = 015m = 01";+mb = 01";+mb = 01";+mr = 015m 01"
mbox_pru1_1






@@+ ti、mbox-TX =<4 0="">;+ ti、mbox-Rx =<5 0="">;+};};Timer1:计时器@44e31000{@@-92.6 + 934,140
中断= ;













reg;+ pruss_soc_bus:pruss_soc_bus@@54426000{+ compatible ="ti、am4376-prusso-bus";+ reg =<0x54426000 0x2000="">;+ ti、hwmods ="pruss";+#address-cells =<1>;+#size-1000 = 0x54000+ pruss ="prus";+"prus";+"prus"= 0x54376+"prus";+"prus"="prus"=+"prusbegri+"prus"
0x54402000 0x2000="">
、+0x54410000 0x8000="">
、+0x54426000 0x2000="">
、+0x5442e000 0x31c="">
、+0x54432000 0x58="">;
+reg 名称="dram0"、"dram1"、"shrdram2"、"cfg"、
+"IEP"、"MII_RT";
+#address-cells =<1>;
+#size-cells =<1>;
+ranges;
+status ="disabled";
+
pruss1_INTC:INTC@54420000{
+compatible ="ti、am4376-pruss-intC";
+reg = 0x54420000
;"INTC"=
"+ interrupts"
;
+中断名称="host2"、"host3"、
+"host4"、"host5"、
+"host6"、 "host8"
、+"host9";
+中断控制器;
+#interrupt-cells =<1>;
+};
+
pru1_0:PRU@54434000{
+compatible ="ti、am4376-PRU";
+reg =<0x54434000 0x3000="">、
+0x54422000 0x400="">、
+<0x54422400 0x100="">;
+reg 名称="IRAM"、"控制"、"调试";
+标签="pru0";
+中断父名称=<&pruss1_intc>;
+中断=<16>、<17>;
+中断名称="vring "、"kind";
+状态="pruss1_intc"
;

@+"0x4376+"pru";+"pru4376+"pru"= 0x5438000+"pru";+"pru"+"pru4376+"pru"+"pru"+"pru"+"pr4376+"pru"+"pru"+"pr


0x54424000 0x400="">
、+<0x54424400 0x100="">;
+reg 名称="IRAM"、"控制"、"调试";
+标签="pru1";
+interrupt-parent =<&pruss1_intc>;
+中断=<18>、<19>;
+中断名称="vring"、"ti";
+
状态=



@0x440000";+"prus"=
0x44376+"+"pruss";+"prus"= 0x440000"=+"prus";+"prus"=+"prus"
= 0x54376+"prus";+"prus"=+"prus";+"prus"+"prus"= 0x440000
0x54442000 0x1000="">
、+0x54466000 0x2000="">
、+0x5446e000 0x31c="">
、+0x54472000 0x58="">;
+reg 名称="dram0"、"dram1"、"cfg"
、+"IEP"、"MII_RT";
+#address-cells =<1>;
+#size-cells =<1>;
+ranges;
+status ="disabled";
+
pruss0_intc:intc@54460000{
+compatible ="ti、am4376-pruss-intC";
+reg =<0x54460000"
;"intc"+
interrupts = 0x460000"
;
+中断名称="host2"、"host3"、
+"host4"、"host5"、
+"host6"、 "host8"
、+"host9";
+中断控制器;
+#interrupt-cells =<1>;
+};
+
pru0_0:PRU@54474000{
+compatible ="ti、am4376-PRU";
+reg =<0x54474000 0x1000="">、
+0x54462000 0x400="">、
+<0x54462400 0x100="">;
+reg 名称="IRAM"、"控制"、"调试";
+标签="pru0";
+interrupt-parent =<&pruss0_intc>;
+中断=<16>、<17>;
+中断名称="vring"、"kti";
+状态=


0x54376+"pru";@+"pru4376+"PRU"= 0x47000";+"pru64000+"pru"+"pru"pru"+"pru"pru"+"pru"+"pru"pru"+"pru"pru40"


0x54464000 0x400="">
、+<0x54464400 0x100="">;
+reg 名称="IRAM"、"控制"、"调试";
+标签="pru1";
+interrupt-parent =<&pruss0_intc>;
+中断=<18>、<19>;
+中断名称="vring"、"kind";
+"McASP




@
、"33000";+"McASP、"+ McAsp"=";+"mofti +"mware";+"mcams";+"mcams"="mcamdams"}+"mcamdams+"mcams";"mcams+"mcamdamdams

在我看来,缺少"mboxs"语句。 但在哪种形状中呢?

请帮助我们集成 PRU。

P.S.:我没有使用 TI 板和 BSP 进行测试、但我认为问题也存在。

此致

Walter Wagner ABB

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

    此论坛仅支持 TI 发布的 Processor SDK: software-dl.ti.com/.../index_FDS.html 最新发布的 Linux-RT 内核版本为 v4.9.28。 此处不支持其他版本。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Biser、

    PRU 是否在最新支持的 v4.9.28下工作?

    此致
    Walter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    据我所知,到目前为止还没有报告任何问题。 我也请 PRU 专家发表评论。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Walter、  

    1) 1)您是否在上面的代码中编程了=""、或者在您将代码添加到您的帖子中时意外添加了该代码? 我不熟悉器件树中=""的用法。

    2) 2)邮箱子节点(ti、mbox-tx 和 ti、mbox-Rx)的描述符属性应各具有3个数据单元、而不是2个。 本文档来自 Linux RT 处理器 SDK -其中包含的绑定文档介绍了如何在器件树中对邮箱进行编程:

    TI-processor-sdk-linux-rt-AM437X-EVM-04.02.00.09/board-support/linux-rt-4.9.59+gitAUTOINC+273202a0d3-g273202a0d3/Documentation/devicetree/bindings/smailbox/omap-mailbox.txt

    子邮箱描述符数据
    -------------------------------------------------------
    上述每个 ti、mbox-TX 和 ti、mbox-Rx 属性都应具有3个
    数据单元、这些单元表示以下内容:
    Cell #1 (fifo_id)-邮箱 fifo id 用于传输
    (TI、mbox-TX)或用于接收(ti、mbox-Rx)
    Cell #2 (IRQ_id)-要从父项使用的 IRQ 标识符索引号
    中断数据。 对于大多数情况、A 应该为0
    正索引值只在具有的邮箱上看到
    多条中断线路连接到 MPU 处理器。
    Cell #3 (usr_id)-用于标识中断行的邮箱用户 ID
    与生成 TX/Rx FIFO 中断相关联。
    

    本文档可能包含有关设置 PRU 邮箱的其他有用信息。

    下面是4.02 Linux RT SDK 中的 am4372.dtsi 示例:

    邮箱:邮箱@480C8000{
    兼容="ti、OMAP4-mailbox";
    reg =<0x480C8000 0x200>;
    中断= ;
    ti、hwmds ="邮箱";
    #mbox-cells =<1>;
    ti、mbox-num-users =<4>;
    ti、mbox-num-FIFOs =<8>;
    mbox_wkupm3:wkup_m3{
    ti、mbox-send-noirq;
    ti、mbox-tx =<0 0>;
    ti、mbox-Rx =<0 0 3>;
    };
    mbox_pru1_0:mbox_pru1_0{
    ti、mbox-TX =<2 0>;
    
    
    mbox 0
    =<1、mbox_0
    
    };mbox 0 = mbox 0;mbox 0 = mrx 1;mbox 0
    
    

    此致、  

    Nick

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

    您好、Nick、

    非常感谢您的回答。

    很抱歉,设备树片段的 HTML 视图错误。

    希望在以下位置正确:

    邮箱:邮箱@480C8000{
    兼容="ti、OMAP4-mailbox";
    reg =<0x480C8000 0x200>;
    中断= ;
    ti、hwmds ="邮箱";
    #mbox-cells =<1>;
    ti、mbox-num-users =<4>;
    ti、mbox-num-FIFOs =<8>;
    mbox_wkupm3:wkup_m3{
    ti、mbox-send-noirq;
    ti、mbox-tx =<0 0>;
    ti、mbox-Rx =<0 0 3>;
    };
    mbox_pru1_0:mbox_pru1_0{
    ti、mbox-TX =<2 0>;
    
    
    mbox 0
    =<1、mbox_0
    
    };mbox 0 = mbox 0;mbox 0 = mrx 1;mbox 0
    


    我的问题是、探测器上出现一条调试消息:mbox_request_channel failed:-19。
    因此、我想、这将导致稍后的误差。
    这不正确:PRU 工作正常。
    我不明白为什么在器件树中定义了 mbox_pru1_0和 mbox_pru1_1。
    我认为可以省略这些内容。
    无论如何,我的问题都得到了解决。
    Mane 感谢您的支持。

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

    您好、Walter、

    简短答案:正确、Processor SDK 04.02中的 mbox_PRU 代码仅用于向后兼容。 您的代码使用 PRU 中断。 mbox_request_channel failed:-19是内核调试级别输出、这意味着您的 PRU 没有使用邮箱来实现 rpmsg 功能。

    答案很长:  

    Sitara 器件最初使用 邮箱进行 RPMsg 处理。 较新的处理器 SDK 使用 PRU 事件。  为了实现向后兼容性、包含了示例 PRU 代码中的邮箱、但可能会逐步淘汰未来的示例。

    您的代码指定了中断父级和中断、因此它使用 PRU 中断。 根据 pruicss 绑定文档的"PRU 子节点"部分:(TI-processor-sdk-linux-rt-AM437X-EVM-04.02.00.09/board-support/linux-rt-4.9.59+gitAUTOINC+273202a0d3-g273202a0d3/Documentation/devicuss/bteetree-remotes/远程绑定
    Remoteproc.txt)

    可选属性:
    --------------------------------------------------------
    MPU 和 PRU 内核之间基于 Virtio 的通信_需要定义
    'mboxs'属性或'interrupt-parent'、'interrupts'
    和'interrupt-names'属性集。 "mbox"属性不
    适用于66AK2G SoC。 

    调试输出来自驱动程序代码的以下部分:

    (TI-processor-sdk-linux-rt-AM437X-EVM-04.02.00.09/board-support/linux-rt-4.9.59+gitAUTOINC+273202a0d3-g273202a0d3/drivers/remoteproc/pru_rproc.c)

    该代码 只检查 是否使用了 mbox、 是否使用了 PRU 中断、 或者是否同时启用了这两个中断。  

     

    如果(is _ERR(PRU->mbox)){
    
    ret = PTR_ERR(PRU->mbox);
    
    PRU->mbox = NULL;
    
    dev_dbg (dev,"mbox_request_channel failed:%d\n", ret);
    
    }
    
    PRU->IRQ_vring = platform_get_IRQ_Byname (pdev、"vring ");
    
    if (PRU->IRQ_vring <= 0){
    
    ret = PRU->IRQ_vring;
    
    if (kick =-EPROBE_DED)
    
    gto free_rIRQ;
    
    d_dbg (dev、"unable to get = pru_ret =
    
    ret、pru_ret = ret = pirq-rt、}p_rt = pru_ret = pirq_de+
    
    
    
    (pret =
    
    );
    
    
    
    
    
    (prt = prt = prrrrrrrrrrrrrrrrrrrrrt =);(如果 prrrrrrrrrrrrrrrrrrrrrrrr
    
    DEV_dbg (dev、"无法获取 KICK 中断、状态=%d\n"、
    
    ret);
    
    }
    
    if (PRU->mbox &&(PRU->IRQ_vring > 0 || PRU->IRQ_KICK > 0) DEV_warn
    
    (dev、"邮箱和 Vring / KICK 系统事件均已定义"n);
    
    if (IS _ERR (PRU->mbox)){
    RET = PTR_ERR (PRU->Mbox);
    PRU->mbox =空;
    dev_dbg (dev、"mbox_request_channel failed:%d\n"、ret);
    }
    
    PRU->IRQ_vring = platform_get_IRQ_Byname (pdev、"vring);
    if (PRU->IRQ_vring <= 0){
    RET = PRU->IRQ_vring;
    如果(ret ==-EPROBE_DEPRE)
    转到 free_rproc;
    DEV_dbg (dev、"无法获取振铃中断、状态=%d\n"、
    RET);
    }
    
    PRU->IRQ_KICK = platform_get_IRQ_Byname (pdev、"king");
    if (PRU->IRQ_KICK <= 0){
    RET = PRU->IRQ_KICK;
    如果(ret ==-EPROBE_DEPRE)
    转到 free_rproc;
    DEV_dbg (dev、"无法获取 KICK 中断、状态=%d\n"、
    RET);
    }
    
    if (PRU->mbox &&(PRU->IRQ_vring >0 || PRU->IRQ_KICK >0))
    DEV_WARN (DEV、"邮箱和振铃/启动系统事件均已定义\n");
    

     

    此致、

    Nick