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/processor-SDK-AM437X:PRU 使用问题

Guru**** 2952510 points

Other Parts Discussed in Thread: AM4372

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/675001/linux-processor-sdk-am437x-pru-usage-question

器件型号:PROCESSOR-SDK-AM437X
主题中讨论的其他器件:AM4372

工具/软件:Linux

团队、

我正在尝试切换 PRU0上的几个 GPIO。 我使用的是最新的 SDK。 配置如下:

DTS:

AM4372_IOPAD (0x9d0、PIN_OUTPUT | MUX_MODE3)/* CAM1_DATa8模式3 PRU*/

AM4372_IOPAD (0x9f0、PIN_OUTPUT | MUX_Mode4)/* CAM1_DATa2模式4 PRU *

 AM4372_IOPAD (0x9f4、PIN_OUTPUT | MUX_Mode4) /* CAM1_DATa3模式4 PRU *

PRU0_1固件:

#define HOST_INT                       (((uint32_t) 1 << 31)
#define OUT_S                       (1 << 0)                        /*(AD24) CAM1_data8.pr0_pru1_GPO[0]*/
#define OUT_D                      (1 << 11)            /*AE22 (CAM1_data3、pr0_pru1_gpo11、模式0x4)*/

#define OUT_C                        (1 << 10)            /* AD21 (CAM1_data2、pr0_pru1_gpo10、模式0x4)*/

#define PRU_OUT_SET (x)             {_R30 |=(x);}
#define PRU_OUT_CLR (x)             {_R30 &&~(x);}
#define PRU_IN (x)                (_R31和(x))


#define TO_ARM_HOST                    18.
#define From_arm_host                  19

/*
 *使用名称'rpmsg-PRU'将探测找到的 rpmsg_PRU 驱动程序
 *位于 linux-x.y.z/drivers/rpmsg/rpmsg_pru.c
 *
#define CHAN_NAME                      "rpmsg-PRU"
#define CHAN_DESC                      "通道31"
#define CHAN_PORT                      31

主(){

…………

…

    PRU_rpmsg_init (&transport、&resourceTable.rpmsg_vring0、&resourceTable.rpmsg_vring1、TO_ARM_HOST、From_ARM_HOST);                                                                                    

       /*使用传输结构在 PRU 和 ARM 用户空间之间创建 RPMsg 通道。 *
       while (PRU_rpmsg_channel (RPMSG_NS_create、&transport、CHAN_NAME、CHAN_DESC、CHAN_PORT)!= PRU_RPMSG_SUCCESS);                                                                                        
       while (1){
               /*检查寄存器 R31的位30以查看 ARM 是否已启动我们*/                                                                                                                           
               如果(__R31和 host_INT){                
                       /*清除事件状态*/   
                       CT_INTC.SICR_BIT.STATUS_CLR_INDEX = From_ARM_HOST;
                       /*接收所有可用消息,每次启动时可以发送多条消息*/
                       while (PRU_rpmsg_receive (&transport、&src、&dst、PAYLOAD、&len)== PRU_RPMSG_Success){
                               /*将邮件回送至我们刚刚收到的同一地址*/
                      //        pru_rpmsg_send (&transport、dst、src、payload、len);                                                                                                                        
  
    
                       对于(i = 0;i < len;i++){           
                               if (PAYLOAD[i]="S"|| PAYLOAD[i]="S"){
                               PRU_OUT_SET (OUT_S);
                               PRU_rpmsg_send (传输、dst、src、有效负载、len);                                                                                                                          
                               }                              
                               否则、如果(PAYLOAD[i]='d'|| PAYLOAD[i]='D'){
                                       PRU_OUT_SET (OUT_D);
                                       PRU_rpmsg_send (传输、dst、src、有效负载、len);                                                                                                                  
                                       }                      
                               否则、如果(PAYLOAD[i]='c'|| PAYLOAD[i]='C'){
                                       PRU_OUT_SET (OUT_C);  
                                       PRU_rpmsg_send (传输、dst、src、有效负载、len);                                                                                                                  
                                       }              
                       }    

}

资源配置:

struct ch_map PRU_intc_map[]={18、3}、
                                {19、1}、
};

struct my_resource_table resourceTable ={

三、会议的结果

三、会议的报告

       {
               type_custom_type_pru_ints、
               sizeof (struct fw_RSC_custom_ints)、
               {/* PRU_INTS 版本*/
                       0x0000、
                       /*通道到主机映射,255表示未使用
                       * 通道0到主机0的映射(PRU0/1 R31位30)
                       *
                       host_unused、1、host_unused、3、host_unused、
                       host_unused、host_unused、host_unused、host_unused、host_unused、
                       /*映射到通道的设备数*/
                       (sizeof (PRU_INTC_MAP)/ sizeof (struct ch_map))、
                       /*指向包含映射事件的结构的指针*/
                       PRU_INTC_MAP、
               }、

…………

…………

尝试从 Linux 用户空间发送命令 s、c、d (通过/dev/rpmsg_31)。 我能够发送每条命令(并且在 Linux 中也可以读回)、但这些行没有被切换。 我是否遗漏了什么?

此致、

四

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注意:我使用的是 AM437x EVM 和连接器 J3 (1_5a)、可以在其中监控上述线路。
    此致、
    四
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对未来读者的跟进:问题似乎已经解决、但 GPO 输出最初不切换的确切原因仍然不清楚。 如果有更新、我将发布更新。

    此致、
    Nick