接上一篇在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,
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。