接上一篇在linux发现在发现dts中的


static const struct of_device_id imx_rproc_of_match[] = {
    { .compatible = "fsl,imx7ulp-cm4", .data = &imx_rproc_cfg_imx7ulp },
    { .compatible = "fsl,imx7d-cm4", .data = &imx_rproc_cfg_imx7d },
    { .compatible = "fsl,imx6sx-cm4", .data = &imx_rproc_cfg_imx6sx },
    { .compatible = "fsl,imx8mq-cm4", .data = &imx_rproc_cfg_imx8mq },
    { .compatible = "fsl,imx8mm-cm4", .data = &imx_rproc_cfg_imx8mq },
    { .compatible = "fsl,imx8mn-cm7", .data = &imx_rproc_cfg_imx8mn },
    { .compatible = "fsl,imx8mp-cm7", .data = &imx_rproc_cfg_imx8mn },
    { .compatible = "fsl,imx8qxp-cm4", .data = &imx_rproc_cfg_imx8qxp },
    { .compatible = "fsl,imx8qm-cm4", .data = &imx_rproc_cfg_imx8qm },
    { .compatible = "fsl,imx8ulp-cm33", .data = &imx_rproc_cfg_imx8ulp },
    { .compatible = "fsl,imx93-cm33", .data = &imx_rproc_cfg_imx93 },
    {},
};

配置之后调用imx_rproc_probe将dts的配置先解析出来,然后在rproc_add里面一直调用到rproc_boot里的rproc_attach attach已经在运行的m核的程序,这里就到了解析上一篇中写到的rsc信息,如果没有运行就要加载elf文件,需要将elf的地址信息,在这里完成重新映射rsc信息里的物理地址到虚拟地址
准备好这些信息之后就rproc_start_subdevices调用rproc_vdev_do_start在virtio_bus上注册了一个虚拟设备

这部分的驱动是使用


static struct virtio_driver virtio_ipc_driver = {
    .feature_table    = features,
    .feature_table_size = ARRAY_SIZE(features),
    .driver.name    = KBUILD_MODNAME,
    .driver.owner    = THIS_MODULE,
    .id_table    = id_table,
    .probe        = rpmsg_probe,
    .remove        = rpmsg_remove,
};

在驱动加载rpmsg_probe的时候会在rpmsg_bus上创建rpmsg_virtio_add_ctrl_dev一个内部服务的设备,当需要动态创建通道的时候使用这个设备来创建
他的驱动


static struct rpmsg_driver rpmsg_ns_driver = {
    .drv.name = KBUILD_MODNAME,
    .probe = rpmsg_ns_probe,
};
...
#define RPMSG_NS_ADDR            (53)
...
ns_ept = rpmsg_create_ept(rpdev, rpmsg_ns_cb, NULL, ns_chinfo);

注册了一个地址是53的通道,在这个通道收到消息之后会根据消息的内容创建virtio_rpmsg_create_channel一个新的channel设备

在m核里面是往0x35u发送了一个字符串

    #define RL_NS_EPT_ADDR (0x35u)
...
    #define RPMSG_LITE_NS_ANNOUNCE_STRING "rpmsg-openamp-demo-channel"
...
    (void)rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, (uint32_t)RL_NS_CREATE);

这样在linux内核里rpmsg_bus上就有个一个rpmsg-openamp-demo-channel设备了,如果使用的虚拟串口驱动就需要挂在上


static struct rpmsg_device_id rpmsg_driver_tty_id_table[] = {
    { .name    = "rpmsg-virtual-tty-channel-1" },
    { .name    = "rpmsg-virtual-tty-channel" },
    { .name = "rpmsg-openamp-demo-channel" },
    { },
};

static struct rpmsg_driver rpmsg_tty_driver = {
    .drv.name    = KBUILD_MODNAME,
    .drv.owner    = THIS_MODULE,
    .id_table    = rpmsg_driver_tty_id_table,
    .probe        = rpmsg_tty_probe,
    .callback    = rpmsg_tty_cb,
    .remove        = rpmsg_tty_remove,
};

o_ra
6 声望4 粉丝

记录工作中碰到的问题