在从nxp网站上下的例子rpmsg_lite_pingpong_rtos_linux_remote在forlinx的板子上通信始终挂载不上,对比了一下发现是RESOURCE_TABLE_START设置的不对,修改成0x2001F000U就正常了,但是看着和dts里面配置的又对不上了


        rsc_table: rsc_table@2021f000 {
            reg = <0 0x2021f000 0 0x1000>;
            no-map;
        };

把内核的代码看了一遍发现好像是映射了一下,在

{ .compatible = "fsl,imx93-cm33", .data = &imx_rproc_cfg_imx93 },

static const struct imx_rproc_att imx_rproc_att_imx93[] = {
    /* dev addr , sys addr  , size        , flags */
    /* TCM CODE NON-SECURE */
    { 0x0FFC0000, 0x201C0000, 0x00020000, ATT_OWN | ATT_IOMEM },
    { 0x0FFE0000, 0x201E0000, 0x00020000, ATT_OWN | ATT_IOMEM },

    /* TCM CODE SECURE */
    { 0x1FFC0000, 0x201C0000, 0x00020000, ATT_OWN | ATT_IOMEM },
    { 0x1FFE0000, 0x201E0000, 0x00020000, ATT_OWN | ATT_IOMEM },

    /* TCM SYS NON-SECURE*/
    { 0x20000000, 0x20200000, 0x00020000, ATT_OWN | ATT_IOMEM },
    { 0x20020000, 0x20220000, 0x00020000, ATT_OWN | ATT_IOMEM },

    /* TCM SYS SECURE*/
    { 0x30000000, 0x20200000, 0x00020000, ATT_OWN | ATT_IOMEM },
    { 0x30020000, 0x20220000, 0x00020000, ATT_OWN | ATT_IOMEM },

    /* DDR */
    { 0x80000000, 0x80000000, 0x10000000, 0 },
    { 0x90000000, 0x80000000, 0x10000000, 0 },

    { 0xC0000000, 0xa0000000, 0x10000000, 0 },
    { 0xD0000000, 0xa0000000, 0x10000000, 0 },
};

将这些地址的sys addr也就是物理地址先映射了一下,然后又在dts里面把配置的0x2021f000也做了一次映射,可是还是和刚才m核里的对不上

        priv->mem[b].cpu_addr = devm_ioremap(&pdev->dev, res.start, resource_size(&res));
...
        if (!strncmp(node->name, "rsc_table", strlen("rsc_table")))
            priv->rsc_table = priv->mem[b].cpu_addr;
        b++;

对比手册好像因为刚开始m核还没有初始化内存 就使用了tcm的部分来共享数据,但是m核访问的地址并不是a核看到的地址,大概映射范围是
image.png


o_ra
6 声望4 粉丝

记录工作中碰到的问题