打开Cdd_Ipc配置界面Outline窗口,分为CddIpcGeneral、CddIpcVirtIoConfig、CddIpcProcIDs和CddIpcCommChannels四个部分,需要依次配置。
- CddIpcGeneral配置基本选项,如下:
CddDevErrorDetect | 决定是否使用Det_ReportError汇报错误,是否做额外参数检查 |
CddIrqType | 中断类型选择:CAT2 |
NewMsgNtfyFunc | CddIpc消息有两类,分别是消息和控制消息;该选项是新消息的通知函数;需要按照驱动声明的原型定义出来; |
NewControlMsgNtfyFunc | 新的控制消息通知函数;需要按照驱动声明的原型定义出来; |
CddIpcOsCounterRef | 超时Counter用到的时钟源,OS提供配置项; |
CddIpcOSCounterId | 超时Counter用到的时钟源; |
CddIpcDeviceVariant | 选择TDA4不同的处理器型号,J721E或者J7200 |
CddVersionInfoApi | Cdd_IpcGetVersionInfo是否可用 |
CddIpcAnnounceApi | Cdd_IpcAnnounce是否可用,该Api用来发送控制消息; |
CddIsInitDoneApi | Cdd_IpcIsInitDone是否可用,该Api用来查询Ipc模块是否初始化成功; |
CddDeinitApi | Cdd_IpcDeinit是否可用 |
CddRegisterReadBackApi | Cdd_IpcRegisterReadBack是否可用 |
CddGetMsgMaxSizeApi | Cdd_IpcGetMaxMsgSize是否可用 |
2. CddIpcVirtIoConfig配置VirtIO的地址和对齐方式,也就是和其他核共享的内存空间定义:
VertIoRingAddr | 共享空间的起始地址,每个核心的配置必须相同,否则无法通信; |
VertIoRingSize | 共享空间的大小; |
VertIoObjSize | 对齐字节数,VRing对齐 |
3. CddIpcProcIDs选择哪个CPU跑当前配置,有哪些CPU参与通讯;
当前CPU选择MCU1_0;
位于Outline->CddIpcProcIDs->RemoteProcID,列出参与IPC通讯的CPU编号,无顺序要求;
4. CddIpcCommChannels配置通讯通道;
位于Outline->CddIpcCommChs;
每一条记录是一条通讯链路,调用Cdd_IpcSendMsg,Cdd_IpcReceiveMsg、Cdd_IpcAnnounce等函数时使用的参数chId对应表中CommId列;每条链路需要提供以下信息:
CommId | 如上描述,对应chId |
LocalEp | 本地CPU的消息ID |
RemoteEp | 远端CPU的消息ID |
RemoteProcID | 远端CPU的编号 |
MaxNumMsgQueued | 本地缓存消息条数,固定256条 |
MaxMsgSize | 消息字节数限制,固定最大512字节 |
5. 使用:
调用初始化函数:Cdd_IpcInit();
查询是否初始化成功:Cdd_IpcIsInitDone();
发送控制消息:Cdd_IpcAnnounce(pbuf, chId);pbuf是控制消息的buffer,以'\0'作为结尾的字符串(因此消息内部不应该包含0x0,否则发送不完全),chId是第4节配置的CommId;
发送消息:Cdd_IpcSendMsg(chId, pbuf, bufLen);chId是第4节配置的CommId,pbuf是数据buffer,bufLen代表要发送数据的字节数;
当收到消息时,中断会触发一系列处理流程,最终回调第1节配置的函数NewMsgNtfyFunc、NewControlMsgNtfyFunc中;可根据需要在该函数中调用Cdd_IpcReceiveMsg和Cdd_IpcReceiveCtrlMsg进行接收;
Cdd_IpcReceiveMsg(chId, pbuf, bufLen);chId是NewMsgNtfyFunc回调传入的chId,bufLen是本地提供消息拷贝的buffer长度,如小于接收消息长度会报错,接收完成为收到字符数。
Cdd_IpcReceiveCtrlMsg(pRemoteProcId, pRemoteEndPt, pBuf, bufLen); pRemoteProcId是传出参数,携带CoreId信息,bufLen传出控制消息长度,固定值;pRemoteEndPt为传出参数,固定值。