你好,
我正在使用
STM32MP153C,我想使用虚拟 Uart(OPENAMP 和 IPCC)在 A7 和 M4 之间进行
通信。
我正在使用使用 Yocto 创建的自定义分发版。
当我在 M4 中初始化虚拟 uart 时,/dev/ttyRPMSG0 在 A7 中被实例化。
[142.543903]remoteproc remoteproc0:启动m4
[ 142.649727] remoteproc remoteproc0: 启动 fw 映像 DHCOR_MBM_GEN_3_v4.1_CM4.elf,大小 3518900
[142.661217]remoteproc0#vdev0buffer:分配保留内存节点vdev0buffer@10042000
[142.669330]remoteproc0#vdev0buffer:注册的vir
tio0(类型7)
[142.674309]remoteproc remoteproc0:远程处理器m4现在启动
[142.722658]virtio_rpmsg_bus virtio0:rpmsg主机在线
[148.575929]virtio_rpmsg_bus virtio0:创建通道rpmsg-tty-通道地址0x400
[149.074414]virtio_rpmsg_bus virtio0:创建通道rpmsg-sdb-channel addr 0x401
但是当我使用这个命令时:
stty -onlcr -echo -F /dev/ttyRPMSG0
Linux 返回:
[ 366.375280] rpmsg_tty virtio0.rpmsg-tty-channel.-1.1024:无效消息:大小 34,类型 67
[ 366.384280] rpmsg_tty virtio0.rpmsg-tty-channel.-1.1024:无效消息:大小 34,类型 67
我看到这个错误是由函数rpmsg_tty_cb在if条件下返回的(驱动rpmsg_tty.c的第109行):
- static int rpmsg_tty_cb(struct rpmsg_device *rpdev, void *data, int len,
- void *priv, u32 src)
- {
- struct rpmsg_tty_payload *rbuf = data;
- if (len <= sizeof(*rbuf) || rbuf->cmd >= NUM_RPMSG_TTY_TYPE)
- {
- dev_err(&rpdev->dev, "Invalid message: size %d, type %d
- len, rbuf->cmd);
- return -EINVAL;
- }
- rpmsg_tty_handler[rbuf->cmd](rpdev, &rbuf->data,
- len - sizeof(rbuf->cmd), priv, src);
- return 0;
- }
错误是因为rbuf->cmd大于NUM_RPMSG_TTY_TYPE。在这种情况下:
rbuf->cmd = 67
NUM_RPMSG_TTY_TYPE = 2
NUM_RPMSG_TTY_TYPE这个参数是什么意思?
它在第 21 行的驱动程序中声明而没有初始化(我找不到它):
- enum rpmsg_tty_type_t {
- RPMSG_DATA,
- RPMSG_CTRL,
- NUM_RPMSG_TTY_TYPE
- };
问题是由A7或M4代码引起的?因为即使我没有使用命令“stty -onlcr -echo -F /dev/ttyRPMSG0”发送任何东西,M4 似乎收到了一些东西并且(我认为)它试图将它发回(M4 代码发回收到的东西).
我还尝试从 A7 直接向 M4 发送一个简单的“hello”:
echo "你好" > /dev/ttyRPMSG0
[ 105.752908] rpmsg_tty virtio0.rpmsg-tty-channel.-1.1024:无效消息:大小 34,类型 67
[ 105.782157] rpmsg_tty virtio0.rpmsg-tty-channel.-1.1024:无效消息:大小 33,类型 67
[105.810142]rpmsg_tty virtio0.rpmsg-tty-channel.-1.1024:无效消息:大小 34,类型 67
有什么建议可以解决我的沟通问题吗?