ti-rpmsg-char 中与处理器相关
通讯主要点:CPU ID+端口
git clone https://git.ti.com/git/rpmsg/ti-rpmsg-char.git
8.5. Developing IPC applications
./board-support/linux-kernel/drivers/virtio/virtio.c
register_virtio_device
virtio_dev_probe
驱动probe标记接口
static inline
void virtio_device_ready(struct virtio_device *dev)
{
unsigned status = dev->config->get_status(dev);
BUG_ON(status & VIRTIO_CONFIG_S_DRIVER_OK);
dev->config->set_status(dev, status | VIRTIO_CONFIG_S_DRIVER_OK);
}
驱动probe标记
./board-support/linux-kernel/drivers/rpmsg/virtio_rpmsg_bus.c:1048: virtio_device_ready(vdev);
./board-support/linux-kernel/include/uapi/linux/virtio_config.h
/* Status byte for guest to report progress, and synchronize features. */
/* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
/* We have found a driver for the device. */
#define VIRTIO_CONFIG_S_DRIVER 2
/* Driver has used its parts of the config, and is happy */
#define VIRTIO_CONFIG_S_DRIVER_OK 4
/* Driver has finished configuring features */
#define VIRTIO_CONFIG_S_FEATURES_OK 8
/* Device entered invalid state, driver must reset it */
#define VIRTIO_CONFIG_S_NEEDS_RESET 0x40
/* We've given up on this device. */
#define VIRTIO_CONFIG_S_FAILED 0x80
Wait for Linux VDev ready successfully.
Initialize Virtio successfully.
IPCDevice_Init RPMessage announce localendpoint(14), service(rpmsg_chrdev)
Initialize RPMessage successfully.
Z:\ti_sdk_8.4\ti-processor-sdk-rtos-j721e-evm-08_04_00_02\mcusw\mcuss_demos\profiling\can\ipcclient\ipc_device.c
int32_t IPCDevice_Init(const char* serviceChrDev, uint32_t localEndpoint)
/* Step2 : Wait for Linux VDev ready... */
for(i = 0; i < procNum; i++)
{
while(!Ipc_isRemoteReady(procs[i]))
{
TaskP_sleep(10);
}
}
UART_printf("Wait for Linux VDev ready successfully.\n");
Y:\tisdk8.4\ti-processor-sdk-rtos-j721e-evm-08_04_00_02\mcusw\mcuss_demos\profiling\can\main_tirtos.c
mcu1-0 打印
enter MCU IPC RX task
Set local device proc id(1) successfully.
Add device(MPU1_0) successfully.
Get an actived device proc(0).
Get all active devices number(1) successfully.
Initialize the multiproc (1) successfully.
Wait for Linux VDev ready successfully.
Initialize Virtio successfully.
IPCDevice_Init RPMessage announce localendpoint(14), service(rpmsg_chrdev)
Initialize RPMessage successfully.
#if defined(IPC_COMM)//defined(IPC_ENABLE)
TaskP_Params_init(&taskParams);
/* Set the task priority higher than the default priority (1) */
taskParams.name = "IPC RX task";
taskParams.priority = 6;
taskParams.stack = ipcdevice_RXStack;
taskParams.stacksize = sizeof (ipcdevice_RXStack);
task = TaskP_create(IPCdemo_taskFxn, &taskParams);
if(NULL == task)
{
OS_stop();
}
//
/* Step 5: Start receive task */
TaskP_Params_init(&taskParams);
taskParams.name = "IPC TX task";
taskParams.priority = 7;
taskParams.stack = ipcdevice_TXStack;
taskParams.stacksize = sizeof(ipcdevice_TXStack);
task = TaskP_create(IPCDevice_SendProc, &taskParams);
if(NULL == task)
{
OS_stop();
}
#endif
static void IPCdemo_taskFxn(void* a0, void* a1)
{
Boot_wait();
//AppUtils_Printf(MSG_NORMAL, "enter taskFxn Started !!!\n");
AppUtils_Printf(2, "enter MCU IPC RX task\r\n");
//Boot_post_10();
IPCDevice_SetLocalDevice(IPC_DEVICE_NAME_MCU1_0);
IPCDevice_AddDevice(IPC_DEVICE_NAME_MPU1_0, IPCDevice_MsgProcessProc);
IPCDevice_Init(NULL, 0);
Boot_post_0();
IPCDevice_RecvProc();
//IPCDevice_PrintPacket(1);
}
int32_t IPCDevice_Init(const char* serviceChrDev, uint32_t localEndpoint)
{
//TaskP_Params params;
RPMessage_Params rpmsgParams;
RPMessage_Params cntrlParam;
Ipc_VirtIoParams vqParam;
uint32_t procs[IPC_INVALID_PROCID];
int32_t procNum = 0;
int32_t i = 0;
int32_t iRet = IPC_SOK;
if (localEndpoint != 0)
{
ipcDeviceLocalEndpoint = localEndpoint;
}
if (serviceChrDev == NULL)
{
sprintf(ipcDeviceServerChrDev, "%s", IPC_DEVICE_SERVICE_CHRDEV);
}
else
{
sprintf(ipcDeviceServerChrDev, "%s", serviceChrDev);
}
/* Step0 : Get all active devices */
procNum = IPCDevice_GetActiveProc(procs);
if (procNum == 0)
{
UART_printf("Active devices number is 0.\n");
return -1;
}
UART_printf("Get all active devices number(%d) successfully.\n", procNum);
/* Step1 : Initialize the multiproc */
iRet = Ipc_mpSetConfig(ipcDeviceLocalProc, procNum, procs);
if (iRet != IPC_SOK)
{
UART_printf("Ipc_mpSetConfig failed with error(%d).\n", iRet);
return -1;
}
iRet = Ipc_init(NULL);
if (iRet != IPC_SOK)
{
UART_printf("Ipc_init failed with error(%d).\n", iRet);
return -1;
}
iRet = Ipc_loadResourceTable((void*)&ti_ipc_remoteproc_ResourceTable);
if (iRet != IPC_SOK)
{
UART_printf("Ipc_loadResourceTable failed with error(%d).\n", iRet);
return -1;
}
UART_printf("Initialize the multiproc (%d) successfully.\n", procNum);
/* Step2 : Wait for Linux VDev ready... */
for(i = 0; i < procNum; i++)
{
while(!Ipc_isRemoteReady(procs[i]))
{
TaskP_sleep(10);
}
}
UART_printf("Wait for Linux VDev ready successfully.\n");
/* Step3 : Initialize Virtio */
vqParam.vqObjBaseAddr = (void*)ipcdevice_sysVqBuf;
vqParam.vqBufSize = procNum * Ipc_getVqObjMemoryRequiredPerCore();
vqParam.vringBaseAddr = (void*)IPC_DEVICE_VRING_BASE_ADDR;
vqParam.vringBufSize = IPC_VRING_BUFFER_SIZE;
vqParam.timeoutCnt = 100; /* Wait for counts */
iRet = Ipc_initVirtIO(&vqParam);
if (iRet != IPC_SOK)
{
UART_printf("Ipc_initVirtIO failed with error(%d).\n", iRet);
return -1;
}
UART_printf("Initialize Virtio successfully.\n");
/* Step 4: Initialize RPMessage */
iRet = RPMessageParams_init(&cntrlParam);
if (iRet != IPC_SOK)
{
UART_printf("RPMessageParams_init_1 failed with error(%d).\n", iRet);
return -1;
}
cntrlParam.buf = ipcdevice_cntrlBuf;
cntrlParam.bufSize = RPMSG_DATA_SIZE;
cntrlParam.stackBuffer = &ipcdevice_taskStackBufs[0];
cntrlParam.stackSize = IPC_TASK_STACKSIZE;
iRet = RPMessage_init(&cntrlParam);
if (iRet != IPC_SOK)
{
UART_printf("RPMessage_init failed with error(%d).\n", iRet);
return -1;
}
iRet = RPMessageParams_init(&rpmsgParams);
if (iRet != IPC_SOK)
{
UART_printf("RPMessageParams_init_2 failed with error(%d).\n", iRet);
return -1;
}
rpmsgParams.requestedEndpt = ipcDeviceLocalEndpoint;
rpmsgParams.buf = ipcdevice_recvBuf;
rpmsgParams.bufSize = RPMSG_DATA_SIZE;
ipcDeviceHandle = RPMessage_create(&rpmsgParams, &ipcDeviceLocalEndpoint);
if(ipcDeviceHandle == NULL)
{
UART_printf("RPMessage_create failed to create endpoint(%d).\n", ipcDeviceLocalEndpoint);
return -1;
}
UART_printf("IPCDevice_Init RPMessage announce localendpoint(%d), service(%s)\n",
ipcDeviceLocalEndpoint, ipcDeviceServerChrDev);
iRet = RPMessage_announce(RPMESSAGE_ALL, ipcDeviceLocalEndpoint, ipcDeviceServerChrDev);
if (iRet != IPC_SOK)
{
UART_printf("RPMessage_announce failed with error(%d).\n", iRet);
return -1;
}
UART_printf("Initialize RPMessage successfully.\n");
///* Step 5: Start receive task */
//TaskP_Params_init(¶ms);
//params.instance->name = "IPC RX task";
//params.priority = IPC_DEVICE_SETUP_TASK_PRI;
//params.stack = &ipcdevice_RXStack;
//params.stackSize = sizeof(ipcdevice_RXStack);
//TaskP_create(IPCDevice_RecvProc, ¶ms, NULL);
///* Step 5: Start receive task */
//TaskP_Params_init(¶ms);
//params.instance->name = "IPC TX task";
//params.priority = IPC_DEVICE_SETUP_TASK_PRI;
//params.stack = &ipcdevice_TXStack;
//params.stackSize = sizeof(ipcdevice_TXStack);
//TaskP_create(IPCDevice_SendProc, ¶ms, NULL);
return 0;
}
IPC demo
ti-processor-sdk-rtos-j721e-evm-08_04_00_02\vision_apps\utils\iss\src\app_iss.c
status = appRemoteServiceRun(
APP_IPC_CPU_MCU2_0 ,
IMAGE_SENSOR_REMOTE_SERVICE_NAME,
IM_SENSOR_CMD_QUERY,
(void*)g_cmdPrm,
CMD_PARAM_SIZE,
0
);
appRemoteServiceRun
=》RPMessage_send
=》RPMessage_recv
/* send to destination */
status = RPMessage_send(
obj->rpmsg_tx_handle,
dst_ipc_cpu_id,
obj->prm.rpmsg_rx_endpt,
obj->rpmsg_tx_endpt,
obj->rpmsg_tx_msg_buf,
tx_payload_size
);
RPMessage_send=》
Virtio_getAvailBuf(vq, (void **)&msg, &length);
Virtio_addUsedBuf(vq, token, bufSize);
Virtio_kick(vq);
Virtio_kick=》
if (IPC_SOK != Ipc_mailboxSend(selfId, vq->procId, vq->id, vq->timeoutCnt))
RPMessage_recv=》
payload = (RPMessage_MsgElem *)IpcUtils_QgetHead(&obj->queue);
处理:
ti-processor-sdk-rtos-j721e-evm-08_04_00_02\imaging\sensor_drv\src\iss_sensors.c
ImageSensor_RemoteServiceHandler->
case IM_SENSOR_CMD_QUERY:
issLogPrintf("ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_QUERY \n");
sensor_name = (char*)(cmd_param);
issLogPrintf("Received Query for %s \n", sensor_name);
/*Copy sensor properties at prm, after sensor name*/
pSenParams = (IssSensor_CreateParams * )(cmd_param+ISS_SENSORS_MAX_NAME);
status = IssSensor_GetSensorInfo(sensor_name, pSenParams);
break;
ti-processor-sdk-rtos-j721e-evm-08_04_00_02\imaging\sensor_drv\src\iss_sensors.c
camera注册
IssSensor_Init
/*
Call init function of all supported sensors.
This will register the sensors with the framework
*/
status |= IssSensor_IMX390_Init();
status |= IssSensor_AR0233_Init();
status |= IssSensor_AR0820_Init();
// status |= IssSensor_rawtestpat_Init();
// status |= IssSensor_testpat_Init();
// status |= IssSensor_gw_ar0233_Init();
status |= IssSensor_max96701joc_yuv_Init();
status |= IssSensor_max9295_yuv3840x2160_Init();
status |= IssSensor_max9295_yuv_Init();
status |= IssSensor_ub933yuv_joc_a20_Init();
status |= IssSensor_ub933yuv_h002_Init();
int32_t IssSensor_IMX390_Init()
{
int32_t status;
int32_t chId;
status = IssSensor_Register(&imx390SensorHandle);
if(0 != status)
{
printf("IssSensor_IMX390_Init failed \n");
}
for(chId=0;chId<ISS_SENSORS_MAX_CHANNEL;chId++)
{
sp1hGainRegValueOld[chId] = 0;
redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
}
return status;
}
服务注册
ti-processor-sdk-rtos-j721e-evm-08_04_00_02\imaging\sensor_drv\src\iss_sensors.c
IssSensor_Init=》
status = appRemoteServiceRegister(
IMAGE_SENSOR_REMOTE_SERVICE_NAME,
ImageSensor_RemoteServiceHandler
);
ls /sys/kernel/debug/remoteproc/ -al
total 0
drwxr-xr-x 22 root root 0 Jan 1 1970 .
drwx------ 37 root root 0 Jan 1 1970 ..
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc0
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc1
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc10
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc11
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc12
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc13
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc14
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc15
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc16
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc17
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc18
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc19
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc2
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc3
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc4
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc5
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc6
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc7
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc8
drwxr-xr-x 2 root root 0 Mar 15 12:30 remoteproc9
ls /sys/bus/virtio/devices/ -al
total 0
drwxr-xr-x 2 root root 0 Mar 15 12:33 .
drwxr-xr-x 4 root root 0 Mar 15 12:33 ..
lrwxrwxrwx 1 root root 0 Mar 15 12:48 virtio0 -> ../../../devices/platform/bus@100000/bus@100000:bus@28380000/bus@100000:bus@28380000:r5fss@41000000/41000000.r5f/remoteproc/remoteproc3/remoteproc3#vdev0buffer/virtio0
lrwxrwxrwx 1 root root 0 Mar 15 12:33 virtio1 -> ../../../devices/platform/bus@100000/4d81800000.dsp/remoteproc/remoteproc1/remoteproc1#vdev0buffer/virtio1
lrwxrwxrwx 1 root root 0 Mar 15 12:33 virtio2 -> ../../../devices/platform/bus@100000/bus@100000:r5fss@5c00000/5d00000.r5f/remoteproc/remoteproc5/remoteproc5#vdev0buffer/virtio2
lrwxrwxrwx 1 root root 0 Mar 15 12:33 virtio3 -> ../../../devices/platform/bus@100000/4d80800000.dsp/remoteproc/remoteproc0/remoteproc0#vdev0buffer/virtio3
lrwxrwxrwx 1 root root 0 Mar 15 12:33 virtio4 -> ../../../devices/platform/bus@100000/bus@100000:r5fss@5c00000/5c00000.r5f/remoteproc/remoteproc4/remoteproc4#vdev0buffer/virtio4
lrwxrwxrwx 1 root root 0 Mar 15 12:33 virtio5 -> ../../../devices/platform/bus@100000/64800000.dsp/remoteproc/remoteproc2/remoteproc2#vdev0buffer/virtio5
/opt/vision_apps# ls /dev/rp* -al
crw------- 1 root root 236, 0 Mar 15 12:30 /dev/rpmsg_ctrl0
crw------- 1 root root 236, 1 Mar 15 12:30 /dev/rpmsg_ctrl1
crw------- 1 root root 236, 10 Mar 15 12:30 /dev/rpmsg_ctrl10
crw------- 1 root root 236, 2 Mar 15 12:30 /dev/rpmsg_ctrl2
crw------- 1 root root 236, 3 Mar 15 12:30 /dev/rpmsg_ctrl3
crw------- 1 root root 236, 4 Mar 15 12:30 /dev/rpmsg_ctrl4
crw------- 1 root root 236, 5 Mar 15 12:30 /dev/rpmsg_ctrl5
crw------- 1 root root 236, 6 Mar 15 12:30 /dev/rpmsg_ctrl6
crw------- 1 root root 236, 7 Mar 15 12:30 /dev/rpmsg_ctrl7
crw------- 1 root root 236, 8 Mar 15 12:30 /dev/rpmsg_ctrl8
crw------- 1 root root 236, 9 Mar 15 12:30 /dev/rpmsg_ctrl9
root@j7-evm:/opt/vision_apps#