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.

[参考译文] AM623:AM3356的 PRU 软件可以用于 AM62x?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1208196/am623-pru-sw-of-am3356-can-be-used-in-am62x

器件型号:AM623
主题中讨论的其他器件:AM3356

亲爱的香榭丽舍大街,

我的客户正在尝试将其基于 AM3356的产品升级到 AM623x、并且有 PRU 软件可使用 PRU-GPIO 发送数据。

当仅使用 PRU-GPIO 时、他们想要检查 AM3356的 PRU SW 是否可在 AM623x 中使用而不必更改。

如果不是、他们想要检查以下场景是否只需更改寄存器地址即可在 AM623x 中使用。 您能否检查以下场景可以在 AM623x 上正常工作?

它们在 A53上的目标 OS 是 Llinux。

我 担心他们的 AM3356 SDK 版本太旧、无法在 AM62x 中使用。

~~~~~~~μ A

1. pru_init

-使用电源复位模块外设寄存器的 PRU 复位(0x44e0 0c00)

2. PRU_DISABLE

- PRU_DISABLE 使用 PRU_ICSS_START_ADDR (0x4A30 0000)+ OFFSET_PRU_ICSS_PRU0_CONTROL (0x2 2000)寄存器

3. pru_upload

-使用电源复位模块外设寄存器的 PRU 复位(0x44e0 0c00)

-使用 时钟模块外设寄存器(0x44e00000)+ CM_PER_ICSS_CLKCTRL (0xe8)的模块启用。

-使用 时钟模块外设寄存器(0x44e00000) + CM_PER_ICSS_CLKSTCTRL (0x140)激活 OCP 时钟。

-激活 OCP 时钟后,用户空间应用程序将通过内核设备驱动程序(字符)和"/dev/pru_control 的 mmap/remap_pfn_range 读取 PRU0.bin 文件,并将这个 PRU 二进制文件写入 PRU_ICSS_START_ADDR (0x4a30_0000)+ 0x3_4000 = 0x4A33_4000。

 

4.PRU_ENABLE

- PRU_ENABLE 使用 PRU_ICSS_START_ADDR (0x4a30_0000)+ OFFSET_PRU_ICSS_PRU0_CONTROL (0x2_2000) 寄存器

谢谢、此致、

SI

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

    主题专家目前不在办公室。 请在几天内回复。 谢谢。

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

    您好、 SI:

    对于此处的延迟响应、我们深表歉意。 可以、在 AM335x PRU-ICSS 上开发的 PRU 代码也可以在 AM62x PRUSS 上运行。 您可在此处找到我们的 PRU 资源:

    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_06_00_42/exports/docs/common/PRU-ICSS/Overview.html

    我不确定您为什么要通过直接寄存器写入来启用 PRU。 Linux 使用 RemoteProc 驱动程序初始化远程内核、包括 PRU 内核。

    需要注意的另一点:像 AM62x 这样的较新处理器不需要您先启用 OCP 端口、然后 PRU 内核才能访问 PRU 子系统之外的存储器区域。

    此致、

    Nick

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

    您好、Nick、

    感谢您的答复。

    是否有任何器件树示例来运行 AM62x 中的 PRU 中断?

    当他们尝试通过引用 AM335x 来修改器件树以在 AM62x 中使用 PRU 时、未能编译该树、并遇到编译器错误。

    您能否在 AM62x 中共享 PRU 的器件树?  

    谢谢、此致、

    SI

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

    您好、SI:

    请参考 INTC 配置文件中有关以下 PRU 软件支持包示例的注释:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am62x/PRU_RPMsg_Echo_Interrupt0/intc_map_0.h
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am62x/PRU_RPMsg_Echo_Interrupt0/intc_map_0.h

    您可以在 Linux 内核5.10和更高版本中找到更多有关 INTC 配置的文档:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_06_00_42/exports/docs/common/PRU-ICSS/INTC_Configuration.html

    如果客户无法运行其示例、请提供:
    1)使用的是 Linux 的哪个版本
    2) 2)正在对哪个 Linux devicetree 进行哪些更改?
    3) 3)编译的步骤是什么、以及观察到的错误?

    此致、

    Nick

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

    您好、Nick、

    SDK:ti-processor-sdk-linux-am62xx-evm-08.05.00.21.

    PRU:可编程实时单元(PRU)软件支持包 v6.1.0

    当它们按如下所示添加中断父节点时、

    KKK_COMMON{

           PINCCTRL-0 =<&KISAN_SYSTEM_PINS>;

     

           兼容="kisan_common";

           状态="可以";

           

            udp_port =<7890>;

           SIG_NUM =<44>;

     

           INTERRUPT-PARENT =<&icssg0_INTC>;

           interrupts =<21 2 2>、<22 3 3>;

           中断名称="PRU_ICSS_evtout0"、"PRU_ICSS_evtout1";

       };

    他们面临一个错误、即没有"icssg0_INTC"、如下所示。

    DTC    arch/arm64/boot/dts/ti/k3-am625-sk.dtb

    arch/arm64/boot/dts/ti/k3-am625-sk.dts:45.15-57.4:错误(phandle_references):/kkk_common:引用不存在的节点或标签"icssg0_intc"

    通过引用"k3-am62-main.dtsi"、他们在 interrupt_parent 中更改为 pruss_intc、并成功构建。

    KKK_COMMON

           PINCCTRL-0 =<&KISAN_SYSTEM_PINS>;

     

           兼容="kisan_common";

           状态="可以";

           

            udp_port =<7890>;

           SIG_NUM =<44>;

     

           interrupt-parent =<&pruss_intc>

           interrupts =<21 2 2>、<22 3 3>;

           中断名称="PRU_ICSS_evtout0"、"PRU_ICSS_evtout1";

       };

    构建成功后、他们尝试通过 IRQ_OF_PARSE_and_MAP 获取 IRQ 分配、如下所示、并在下面的中遇到错误。

    静态 int kkkk_common_probe (struct platform_device * pdev)

       struct StructKisanCommonData *pdata = NULL;

       struct device_node *np = pdev->dev.of_node;

       int nErr = 0;

    int nIrq = 0;

     

       pdata = devm_kzalloc (&pdev->dev、sizeof (struct StructKisanCommonData)、gfp_kernel);

       if (!pdata){

           printk (Kern_ERR "[%s:%4d] devm_kzalloc...\n"、__filename__、__line__);

           返回-ENOMEM;

       }

     

    pdata->pdev = pdev;

       pdata->mdev.minor = MISC_DYNAMIC _MINOR;

       pdata->mdev.name ="kisan_common";

       pdata->mdev.FOPS=&kisan_common_FOPS;

     

    nERROR = MISC_REGISTER (&pdata->mdev);

       如果(nErr){

           dev_err (&pdev->dev,"注册 MISC 设备失败\n");

           devm_kfree (&pdev->dev, pdata);

           返回 nErr;

       }

     

    platform_set_drvdata (pdev、pdata);

     

       nIrq = IRQ_of_parse_and_map (NP、0);

       printk (Kern_debug "[%s:%4D] PRU_ICSS_evtout%d PRU IRQ#%d \n"、___文件名__、_行_、0、nIrq);

       IRQ_SET_IRQ_TYPE (nIrq、IRQ_TYPE_DEFAULT);

     

    他们在下面遇到了错误。

    您能帮助他们解决这个问题吗?

    [0.755474]   IRQ:找不到中断控制器的 IRQ 域@20000 !

    [0.762061]   [kkkk_common.c:641] PRU_ICSS_evtout0 PRU IRQ# 0

    谢谢、此致、

    SI

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

    您好、SI:

    我们正开始进入我本人没有进行实验的地区。 请告诉我、当客户确定解决方案时、该解决方案是什么。

    一个可能的模板是其他 PRU 器件上的 PRU 以太网驱动程序。 例如、在 AM64x 上:

     arch/ARM64/boot/dts/ti/k3-am642-evm.dts 中的 devicetree 信息:  

    icssg1_eth: icssg1-eth {
                    compatible = "ti,am642-icssg-prueth";
                    pinctrl-names = "default";
                    pinctrl-0 = <&icssg1_rgmii1_pins_default>;
    
    ...
                    interrupt-parent = <&icssg1_intc>;
                    interrupts = <24 0 2>, <25 1 3>;
                    interrupt-names = "tx_ts0", "tx_ts1";
    

     drivers/net/Ethernet/ti/icssg_prueth.c 中可能有用的驱动程序信息:

            irq_name = "tx_ts0";
            if (emac->port_id == PRUETH_PORT_MII1)
                    irq_name = "tx_ts1";
            emac->tx_ts_irq = platform_get_irq_byname_optional(prueth->pdev, irq_name);
            if (emac->tx_ts_irq < 0) {
                    ret = dev_err_probe(prueth->dev, emac->tx_ts_irq, "could not get tx_ts_irq\n");
                    goto free;
            }
    ...
            if (!emac->is_sr1) {
                    ret = request_threaded_irq(emac->tx_ts_irq, NULL, prueth_tx_ts_irq,
                                               IRQF_ONESHOT, dev_name(dev), emac);
                    if (ret)
                            goto stop;
            }
    

    此致、

    Nick