zhwa

zhwa

0个粉丝

32

问答

0

专栏

1

资料

zhwa  发布于  2020-12-31 11:48:49
采纳率 0%
32个问答
1720

核间通信

 
打算构造一个函数,控制sensor的休眠,需要传递命令到liteos端,就用ipmsg吧
我来回答
回答2个
时间排序
认可量排序

zhwa

0个粉丝

32

问答

0

专栏

1

资料

zhwa 2020-12-31 12:01:04
认可0
本帖最后由 zhwa 于 2020-12-31 14:12 编辑

我的理解核间通信实现如上图所示,
在linux端实现了:
HI_S32 HI_MAPI_VCAP_SetSensorSleep(HI_HANDLE SensorHdl, int* pSensorSleep)
{
        HI_S32 s32Ret;
        HI_U32 u32ModFd;
        printf("%s:%d \n", __FILE__, __LINE__);

        CHECK_MAPI_VCAP_HANDLE_RET("SensorSleep", SensorHdl, (HI_MAPI_VCAP_MAX_DEV_NUM - 1));
        u32ModFd = MODFD(HI_MAPI_MOD_VCAP, SensorHdl, 0);
        s32Ret = MAPI_SendSync(u32ModFd, MSG_CMD_VCAP_SET_SENSOR_SLEEP, pSensorSleep, sizeof(int), HI_NULL);
       
        CHECK_MAPI_VCAP_RET(s32Ret, "MSG_CMD_VCAP_SET_SENSOR_SLEEP fail\n");

        return HI_SUCCESS;
}

在liteos端增加紫色部分:
static MSG_MODULE_CMD_S g_stModuleCmdTable[] = {
    { MSG_CMD_SENSOR_INIT,              MSG_VCAP_InitSensor },
    { MSG_CMD_SENSOR_DEINIT,            MSG_VCAP_DeinitSensor },
    { MSG_CMD_SENSOR_GETATTR,           MSG_VCAP_GetSensorAttr },
    { MSG_CMD_SENSOR_SET_FRAMERATE,     MSG_VCAP_SetSensorFrameRate },
    { MSG_CMD_SENSOR_GET_FRAMERATE,     MSG_VCAP_GetSensorFrameRate },
    { MSG_CMD_SENSOR_GET_MODESCNT,      MSG_VCAP_GetSensorModesCnt },
    { MSG_CMD_SENSOR_GET_ALLMODES,      MSG_VCAP_GetSensorAllModes },
    { MSG_CMD_VCAP_SET_ATTR,            MSG_VCAP_SetAttr },
    { MSG_CMD_VCAP_GET_ATTR,            MSG_VCAP_GetAttr },
    { MSG_CMD_VCAP_START_DEV,           MSG_VCAP_StartDev },
    { MSG_CMD_VCAP_STOP_DEV,            MSG_VCAP_StopDev },
    { MSG_CMD_VCAP_SET_PIPE_VCNUMBER,   MSG_VCAP_SetPipeVCNumber },
    { MSG_CMD_VCAP_GET_PIPE_VCNUMBER,   MSG_VCAP_GetPipeVCNumber },
    { MSG_CMD_VCAP_START_PIPE,          MSG_VCAP_StartPipe },
    { MSG_CMD_VCAP_STOP_PIPE,           MSG_VCAP_StopPipe },
    { MSG_CMD_VCAP_START_CHN,           MSG_VCAP_StartChn },
    { MSG_CMD_VCAP_STOP_CHN,            MSG_VCAP_StopChn },
    { MSG_CMD_VCAP_INIT_ISP,            MSG_VCAP_InitISP },
    { MSG_CMD_VCAP_DEINIT_ISP,          MSG_VCAP_DeInitISP },
    { MSG_CMD_VCAP_START_ISP,           MSG_VCAP_StartISP },
    { MSG_CMD_VCAP_STOP_ISP,            MSG_VCAP_StopISP },
    { MSG_CMD_VCAP_SET_SNAPATTR,        MSG_VCAP_SetSnapAttr },
    { MSG_CMD_VCAP_GET_SNAPATTR,        MSG_VCAP_GetSnapAttr },
    { MSG_CMD_VCAP_SET_SNAPATTR_EX,     MSG_VCAP_SetSnapAttrEx },
    { MSG_CMD_VCAP_GET_SNAPATTR_EX,     MSG_VCAP_GetSnapAttrEx },
    { MSG_CMD_VCAP_START_TRIGGER,       MSG_VCAP_StartTrigger },
    { MSG_CMD_VCAP_STOP_TRIGGER,        MSG_VCAP_StopTrigger },
    { MSG_CMD_VCAP_SET_STITCHATTR,      MSG_VCAP_SetStitchAttr },
    { MSG_CMD_VCAP_GET_STITCHATTR,      MSG_VCAP_GetStitchAttr },
    { MSG_CMD_VCAP_STITCH_TRIGGER,      MSG_VCAP_StitchTrigger },
    { MSG_CMD_VCAP_SET_ATTR_EX,         MSG_VCAP_SetAttrEx },
    { MSG_CMD_VCAP_GET_ATTR_EX,         MSG_VCAP_GetAttrEx },
    { MSG_CMD_VCAP_SET_CROPATTR,        MSG_VCAP_SetChnCropAttr },
    { MSG_CMD_VCAP_GET_CROPATTR,        MSG_VCAP_GetChnCropAttr },
    { MSG_CMD_VCAP_SETEXIF,             MSG_VCAP_SetExifInfo },
    { MSG_CMD_VCAP_GETEXIF,             MSG_VCAP_GetExifInfo },
    { MSG_CMD_VCAP_SET_DISATTR,         MSG_VCAP_SetChnDISAttr },
    { MSG_CMD_VCAP_GET_DISATTR,         MSG_VCAP_GetChnDISAttr },
    { MSG_CMD_VCAP_SET_DUMP_RAW,        MSG_VCAP_SetDumpRawAttr },
    { MSG_CMD_VCAP_GET_DUMP_RAW,        MSG_VCAP_GetDumpRawAttr },
    { MSG_CMD_VCAP_START_DUMP_RAW,      HI_NULL },
    { MSG_CMD_VCAP_SET_DUMP_BNRRAW,     HI_NULL },
    { MSG_CMD_VCAP_GET_DUMP_BNRRAW,     HI_NULL },
    { MSG_CMD_VCAP_START_DUMP_BNRRAW,   HI_NULL },
    { MSG_CMD_VCAP_GET_RAWFRAME,        MSG_VCAP_GetRawFrame },
    { MSG_CMD_VCAP_RELEASE_RAWFRAME,    MSG_VCAP_ReleaseRawFrame },
    { MSG_CMD_VCAP_INIT_MOTIONSENSOR,   MSG_VCAP_InitMotionSensor },
    { MSG_CMD_VCAP_DEINIT_MOTIONSENSOR, MSG_VCAP_DeInitMotionSensor },
    { MSG_CMD_VCAP_AHD_GET_STATUS,      MSG_VCAP_GetAhdStatus },
    { MSG_CMD_VCAP_AHD_CHANGE_CHN,      MSG_VCAP_ChangeChn },
    { MSG_CMD_VCAP_REG_SERDES_MODULE,   MSG_VCAP_RegSerdesModule },
    { MSG_CMD_VCAP_UNREG_SERDES_MODULE, MSG_VCAP_UnRegSerdesModule },
    { MSG_CMD_VCAP_SET_SENSOR_SLEEP,    MSG_VCAP_SetSensorSleep },
};

HI_S32 HI_MAPI_VCAP_SetSensorSleep(HI_HANDLE SensorHdl, int* pSensorSleep)
{
        HI_S32 s32Ret;
        HI_U32 u32ModFd;
        printf("%s:%d \n", __FILE__, __LINE__);

        CHECK_MAPI_VCAP_HANDLE_RET("SensorSleep", SensorHdl, (HI_MAPI_VCAP_MAX_DEV_NUM - 1));

        printf("%s:%d SensorNum:%d sleep\n", __FILE__, __LINE__, SensorNum);
               
        return HI_SUCCESS;
}。


可是linux端调用HI_MAPI_VCAP_SetSensorSleep()显示上面的红色部分出错,调试发现MAPI_SendSync()没有出错,只是下面的红色部分pResp->pBody为空,pResp->u32BodyLen为8,linux段出错没有到liteos去,
HI_S32 MAPI_SendSync(HI_U32 u32Module, HI_U32 u32CMD, HI_VOID *pBody, HI_U32 u32BodyLen,
                     MAPI_PRIV_DATA_S *pstPrivData)
{
    HI_S32 s32Ret;
    HI_IPCMSG_MESSAGE_S *pReq = NULL;
    HI_IPCMSG_MESSAGE_S *pResp = NULL;
       
        printf("%s:%d\n", __FILE__, __LINE__);
    pReq = HI_IPCMSG_CreateMessage(u32Module, u32CMD, pBody, u32BodyLen);
    if (pReq == NULL) {
        MAPI_ERR_TRACE(HI_MAPI_MOD_SYS, "HI_IPCMSG_CreateMessage return NULL.\n");
        return HI_MAPI_SYS_ENULL_PTR;
    }
    if (pstPrivData != NULL) {
        memcpy(pReq->as32PrivData, pstPrivData->as32PrivData, sizeof(HI_S32) * HI_IPCMSG_PRIVDATA_NUM);
    }
       
        printf("%s:%d\n", __FILE__, __LINE__);
    s32Ret = HI_IPCMSG_SendSync(MAPI_MEDIA_MSG_GetSiId(), pReq, &pResp, HI_IPCMSG_SEND_SYNC_TIMEOUT);
    if (s32Ret != HI_SUCCESS) {
        MAPI_ERR_TRACE(HI_MAPI_MOD_SYS, "HI_IPCMSG_SendSync fail s32Ret:%x\n", s32Ret);
        HI_IPCMSG_DestroyMessage(pReq);
        HI_IPCMSG_DestroyMessage(pResp);
        return s32Ret;
    }
       
    s32Ret = pResp->s32RetVal;
    if (s32Ret == HI_SUCCESS && (pResp->u32BodyLen > 0)) {
        memcpy(pBody, pResp->pBody, pResp->u32BodyLen);
printf("%s:%d  pBody:%s  pResp->pBody:%s  pResp->u32BodyLen:%d\n", __FILE__, __LINE__, pBody, pResp->pBody, pResp->u32BodyLen);
        if (pstPrivData != NULL) {
            memcpy(pstPrivData->as32PrivData, pResp->as32PrivData, sizeof(HI_S32) * HI_IPCMSG_PRIVDATA_NUM);
        }
    }
       
        printf("%s:%d %d\n", __FILE__, __LINE__);
    HI_IPCMSG_DestroyMessage(pReq);
    HI_IPCMSG_DestroyMessage(pResp);

    return s32Ret;
}

原因不清楚

zhwa

0个粉丝

32

问答

0

专栏

1

资料

zhwa 2020-12-31 18:51:34
认可0
可以将linux的的信息传到liteos了,原因是在liteos端的static HI_S32 MSG_VCAP_SetSensorSleep(HI_S32 siId, HI_IPCMSG_MESSAGE_S *pstMsg)
{
        HI_HANDLE SensorHdl;
        HI_HANDLE SensorSleep;
        HI_S32 s32Ret;
        HI_IPCMSG_MESSAGE_S *respMsg = HI_NULL;
                printf("%s:%d\n", __FILE__, __LINE__);
        SensorHdl = GET_DEV_ID(pstMsg->u32Module);
    //SensorSleep = GET_CHN_ID(pstMsg->u32Module);
        s32Ret = HI_MAPI_VCAP_SetSensorSleep(SensorHdl, (int *)pstMsg->pBody);
    if (s32Ret != HI_SUCCESS) {
        MAPI_ERR_TRACE(HI_MAPI_MOD_VCAP, "Failed : %#x!\n", s32Ret);
    }

        respMsg = HI_IPCMSG_CreateRespMessage(pstMsg, s32Ret, NULL, 0);
        CHECK_MAPI_VCAP_NULL_PTR_RET(respMsg);
       
        s32Ret = HI_IPCMSG_SendAsync(siId, respMsg, NULL);

        if (s32Ret != HI_SUCCESS) {
          MAPI_ERR_TRACE(HI_MAPI_MOD_VCAP, "VCAP_StartChn call SendAsync fail,ret:[%#x]\n", s32Ret);
          HI_IPCMSG_DestroyMessage(respMsg);
          return s32Ret;
        }

        HI_IPCMSG_DestroyMessage(respMsg);

        return HI_SUCCESS;
}
部分,函数的实参传错了。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区