BSP_S32 BSP_ICC_Open(BSP_U32 u32ChanId, ICC_CHAN_ATTR_S *pChanAttr) { u32 func_id = ICC_DEFAULT_SUB_CHANNEL; /* 除ifc通道外,其他通道只有一个回调 */ u32 channel_id = u32ChanId << 16 | func_id; u32 i = 0; u32 real_channel_size = bsp_icc_channel_size_get(); /* coverity[REVERSE_INULL] */ if(!pChanAttr) { icc_print_error("pChanAttr is null!\n"); goto out; } else if(pChanAttr->u32FIFOOutSize != pChanAttr->u32FIFOInSize || u32ChanId >= ICC_CHN_ID_MAX) { icc_print_error("invalid param u32ChanId[%d],pChanAttr[%p],fifo_in[0x%x],fifo_out[0x%x]\n", u32ChanId, pChanAttr, pChanAttr->u32FIFOInSize, pChanAttr->u32FIFOOutSize); goto out; } for(i = 0; i < real_channel_size; i++) { if(u32ChanId == g_icc_init_info[i].real_channel_id) { break; } } if(i >= real_channel_size) { icc_print_error("channel_id[%d] cannot find in g_icc_init_info array\n", u32ChanId); goto out; } else { if(pChanAttr->u32FIFOInSize > g_icc_init_info[i].fifo_size)/*lint !e574 */ { icc_print_error("user fifo_size(%d) > fifo_size(%d) defined in bsp(g_icc_init_info)\n", pChanAttr->u32FIFOInSize, g_icc_init_info[i].fifo_size); goto out; } } return (BSP_S32)bsp_icc_event_register(channel_id, icc_read_cb_wraper, (void*)pChanAttr->read_cb, icc_write_cb_wraper, (void*)pChanAttr->write_cb); out: return BSP_ERR_ICC_INVALID_PARAM; }
s32 bsp_icc_test_init(void) { u32 i = 0; s32 ret = ICC_OK; if(ICC_TEST_CASE_INITILIZED == g_icc_test.state) { icc_print_error("icc_test has intilized\n"); return ICC_OK; } memset(&g_icc_test, 0, sizeof(g_icc_test)); /*lint !e665 */ icc_print_debug("icc_test initilizing\n"); for(i = 0; i < ICC_VALIDE_CHN_NUM; i++) { ret = icc_test_channel_reinit(g_icc_init_info[i].real_channel_id, ICC_TEST_CHANNEL_SIZE); if(ICC_OK != ret) { icc_print_error("icc_test_channel_reinit error\n"); return ICC_ERR; } ret = icc_test_sub_chn_init(g_icc_init_info[i].real_channel_id, ICC_TEST_CHANNEL_SIZE/2, ICC_TEST_CHANNEL_START); if(ICC_OK != ret) { icc_print_error("icc_test_sub_chn_init error\n"); return ICC_ERR; } } #ifdef ICC_HAS_DEBUG_FEATURE /* 测试打开打印开关 */ icc_dbg_print_sw(0); #endif ret = icc_test_channel_reinit(ICC_CHN_CSHELL, SUPPORT_ICC_READ_IN_OTHER_TASK); if(ICC_OK != ret) { icc_print_error("cshell_channel_reinit error\n"); return ICC_ERR; } ret = icc_test_sub_chn_init(ICC_CHN_CSHELL, SUPPORT_ICC_READ_IN_OTHER_TASK, 0); if(ICC_OK != ret) { icc_print_error("cshell_test_sub_chn_init error\n"); return ICC_ERR; } bsp_icc_event_unregister(ICC_CHN_CSHELL << 16 | 0); bsp_icc_event_unregister(ICC_CHN_CSHELL << 16 | 1); bsp_icc_event_unregister(ICC_CHN_CSHELL << 16 | 2); bsp_icc_event_register(ICC_CHN_CSHELL << 16 | 0, (read_cb_func)icc_send_test_cb0_new, NULL, NULL, NULL); bsp_icc_event_register(ICC_CHN_CSHELL << 16 | 1, (read_cb_func)icc_send_test_cb1_new, NULL, NULL, NULL); bsp_icc_event_register(ICC_CHN_CSHELL << 16 | 2, (read_cb_func)icc_send_test_cb2_new, NULL, NULL, NULL); osl_sem_init(ICC_SEM_EMPTY, &g_icc_test.recv_task_sem); /*lint !e40 */ g_icc_test.recv_task_flag = 1; if(ICC_ERR == osl_task_init("icc_read_test", ICC_TEST_TASK_PRI+1, ICC_TASK_STK_SIZE, (task_entry)icc_read_task_entry, (void *)(ICC_CHN_CSHELL << 16 | 2), (u32 *)&g_icc_test.recv_task_id)) { icc_print_error("create icc_read_test task error\n"); return ICC_ERR; } icc_debug_init(bsp_icc_channel_size_get()); /* 状态最后更新 */ g_icc_test.state = ICC_TEST_CASE_INITILIZED; return ICC_OK; }