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.

DM8148 uart3-5使用问题

各位好:

      最近使用DM8148,使用DVRRDK_02.80.00.10,需要使用uart3,uart4,uart5,例uart5管脚使用VOUT[1]_R_CR[8]/EMAC[1]_MTXD[7]/VIN[1]A_D[19]/UART5_RXD/GP3[18]和VOUT[1]_R_CR[9]/EMAC[1]_MTXEN/VIN[1]A_D[20]/UART5_TXD/GP3[19],kernel中添加

以及时钟配置,当rootfs启动后不跑m3和dsp时可以正常使用uart5,当运行init.sh和load.sh后,即加载m3核和dsp核,出现uar3-uart5不能使用的情况,请问谁遇到过这样的问题,谢谢

 

 

  • Xu Jun,

    你有检查过在加载dsp/m3的firmware后,相关pinmux寄存器是否有被修改?

    你的代码是否有VOUT1的输出?

  •  

    请问我怎么 pinmux寄存器是否被修改呢?有什么工具或者TI有什么接口提供测试吗?谢谢

  • Xu Jun,

    你使用的软件版本有点旧了。新的版本里面在文件系统下都有mem_rdwr.out可以直接读取寄存器值,例如文件系统路径\opt\dvr_rdk\ti814x\bin下。

  • 你好,我使用./mem_rdwr.out --rd 48140b84 1 在不load  M3和DSP的时候 读到的值是 0x48140b84: 00060020  当我load核心后读出的值是0x48140b84: 00050004说明这个值确实被改变了,我想问下这个dvr_rdk架构中M3核设置这些管脚复用是在那个位置,谢谢

  • 另外这个值只能读,我使用./mem_rdwr.out --wr 48140b84  00060020写入原来的值。但是不能写入返回ORG 0x48140b84: 50004        NEW 0x48140b84: 50004是怎么回事

  • Xu Jun,

    这个out文件是A8上用户态的可执行文件,但pinmux的修改必须是A8的supervior模式下才能修改,所以这个out文件不能写入pinmux寄存器是正常的。

    你能在M3或者DSP侧找到修改修改这个寄存器的地方么?或者在m3或者DSP的代码里面再次修改这个寄存器。

  •  

               非常感谢你的解答, 我根据你说的修改代码后可以读出和写入数据,但是发现数据收发不正确,测试代码如下:

    int main(int argc, char *argv[])

    {

        int iFd, i = 0;

        int len;

        unsigned char ucBuf[1000];

        unsigned char rBuf[1000];

        struct termios opt;

             char path[30] = {0};

     

             if(argc == 2){

                       iFd = open(argv[1], O_RDWR | O_NOCTTY);

                       if(iFd < 0) {

                perror(path);

                return -1;

                       }

             }

             else{

                       iFd = open(DEV_NAME, O_RDWR | O_NOCTTY);

                       if(iFd < 0) {

                perror(DEV_NAME);

                return -1;

                       }

             }

     

        tcgetattr(iFd, &opt);

        if (tcgetattr(iFd,   &opt)<0) {

                  return   -1;

        }

     

        opt.c_lflag        &= ~(ECHO | ICANON | IEXTEN | ISIG);

        opt.c_iflag        &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

        opt.c_oflag     &= ~(OPOST);

        opt.c_cflag      &= ~(CSIZE | PARENB);

        opt.c_cflag      |=  CS8;

     

        opt.c_cc[VMIN]      = 150;

        opt.c_cc[VTIME]      = 10;

     

             cfsetispeed(&opt, B19200);

        cfsetospeed(&opt, B19200);

     

        if (tcsetattr(iFd,   TCSANOW,   &opt)<0) {

                     return   -1;

        }

        tcflush(iFd,TCIOFLUSH);

     

        for (i = 0; i < 1000; i++){

                     ucBuf[i] = 0xff - i;

        }

     

        len = write(iFd, ucBuf, 0xff);

    while(1){

    #if 1

        len = read(iFd, rBuf, 0x1);

        printf("get data: %d \n", len);

        for (i = 0; i < len; i++){

                     printf("0x%x\n", rBuf[i]);

        }

    #endif

    }

        close(iFd);

        return 0;

    }

    程序运行后,接收到的数据如下

     

    内核中时钟添加

    static void __init init_uart3_clk(void){

      __raw_writel((2 << 3)|(__raw_readl(TI814X_PLL_CMGC_MCBSP_UART_CLKSRC)), TI814X_PLL_CMGC_MCBSP_UART_CLKSRC); /* sysclk10 as a reference clock */ }

    static void __init init_uart4_clk(void){

     __raw_writel((2 << 5)|(__raw_readl(TI814X_PLL_CMGC_MCBSP_UART_CLKSRC)), TI814X_PLL_CMGC_MCBSP_UART_CLKSRC); /* sysclk10 as a reference clock */ }

     static void __init init_uart5_clk(void){

     __raw_writel((2 << 7)|(__raw_readl(TI814X_PLL_CMGC_MCBSP_UART_CLKSRC)), TI814X_PLL_CMGC_MCBSP_UART_CLKSRC); /* sysclk10 as a reference clock */ }

  • 已经解决,谢谢

  • 你好 请问 可以发一份 mem_rdwr.out 或者给一下sdk新版的url么 谢谢 bsyw8984@qq.com