MAILBOX_EXTERN int mailbox_process_register( unsigned int channel_id, int (*cb)(unsigned int channel_id), void *priv) { struct mb_vx_work *work = MAILBOX_NULL; struct mb_vx_cfg *cfg = &g_mailbox_vx_cfg_tbl[0]; struct mb_vx_proc *proc = &g_mailbox_vx_proc_tbl[0]; struct mb_vx_cfg* cfg_find = MAILBOX_NULL; unsigned int count = sizeof(g_mailbox_vx_proc_tbl)/sizeof(struct mb_vx_proc); while (MAILBOX_MAILCODE_INVALID != cfg->channel_id) { /*找到与传入邮箱ID最适配的系统邮箱配置*/ if (cfg->channel_id == channel_id) { cfg_find = cfg; break; } cfg++; } if (cfg_find) { /*加入邮箱任务对应的邮箱工作队列*/ while (count) { if (cfg_find->proc_style == proc->id) { if (proc->vxqueue) { work = proc->vxqueue; while (MAILBOX_NULL != work->next) { work = work->next; } work->next = (struct mb_vx_work *)calloc( sizeof(struct mb_vx_work), 1); if (MAILBOX_NULL == work->next) { return mailbox_logerro_p0(MAILBOX_ERR_VXWORKS_ALLOC_MEMORY); } work->next->channel_id = cfg_find->channel_id; work->next->cb = cb; work->next->mb_priv = priv; } else { proc->vxqueue = (struct mb_vx_work *)calloc( sizeof(struct mb_vx_work), 1); if (MAILBOX_NULL == proc->vxqueue) { return mailbox_logerro_p0(MAILBOX_ERR_VXWORKS_ALLOC_MEMORY); } proc->vxqueue->channel_id = cfg_find->channel_id; proc->vxqueue->cb = cb; proc->vxqueue->mb_priv = priv; } } count--; proc++; } return MAILBOX_OK; } return mailbox_logerro_p1(MAILBOX_ERR_VXWORKS_CHANNEL_NOT_FIND, channel_id); }
/*lint -save -e774 -e944 -e506*/ MAILBOX_GLOBAL int mailbox_init(void) { if (MAILBOX_INIT_MAGIC == g_mailbox_handle.init_flag) { /*考虑到单核下电重启,静态数据不会丢失,这里只打印告警, 返回错误的话,后面的平台初始化将调不到,IPC中断无法注册*/ return mailbox_logerro_p1(MAILBOX_ERR_GUT_ALREADY_INIT, g_mailbox_handle.init_flag); } /*TODO:进行单核下电重启特性开发时,这行需要删除*/ (void)mailbox_memset(&g_mailbox_handle, 0x00, sizeof(struct mb)); #ifdef MAILBOX_OPEN_MNTN if ((MAILBOX_HEAD_BOTTOM_ADDR > (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN)) || (MAILBOX_MEMORY_BOTTOM_ADDR > (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_LENGTH))) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MBX, "mailbox address overflow: headbuttom valid(0x%x), config(0x%x)!\n\ \r databuttom valid(0x%x), config(0x%x)!"RT, (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN), MAILBOX_HEAD_BOTTOM_ADDR, (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_LENGTH), MAILBOX_MEMORY_BOTTOM_ADDR); return mailbox_logerro_p0(MAILBOX_CRIT_GUT_MEMORY_CONFIG); } #endif /*初始化邮箱主体部分,创建邮箱总句柄。*/ if (MAILBOX_OK != mailbox_create_box(&g_mailbox_handle, &g_mailbox_global_cfg_tbl[0], MAILBOX_LOCAL_CPUID)) { return mailbox_logerro_p0(MAILBOX_ERR_GUT_CREATE_BOX); } /*初始化平台差异部分*/ if (MAILBOX_OK != mailbox_init_platform()) { return mailbox_logerro_p0(MAILBOX_ERR_GUT_INIT_PLATFORM); } g_mailbox_handle.init_flag = MAILBOX_INIT_MAGIC; #ifndef _DRV_LLT_ // mailbox_ifc_test_init(); #endif bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MBX, "mb init OK!"RT); return MAILBOX_OK; }
/***************************************************************************** 函 数 名 : mailbox_create_box 接口类型 : 对内接口 功能描述 : 创建邮箱操作句柄,申请邮箱总操作句柄空间,并初始化邮箱通道资源. 输入参数 : struct mb_cfg *config -- 邮箱通道的全局配置表。 unsigned long cpu_id -- 注册此通道的CPU号。 输出参数 : 无 返 回 值 : 邮箱操作句柄 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年9月7日 作 者 : 莫南 00176101 修改内容 : 新生成函数 *****************************************************************************/ MAILBOX_LOCAL long mailbox_create_box( struct mb *mb, struct mb_cfg *config, unsigned long cpu_id) { mb->local_id = cpu_id; /*第一次循环检查通道号的有效性,并统计每个核间通道数组的空间*/ if(MAILBOX_OK != mailbox_calculate_space(mb, config, cpu_id)) { return mailbox_logerro_p0(MAILBOX_ERR_GUT_CALCULATE_SPACE); } /*第二次循环对每个通道句柄分配空间,并赋值。*/ /*初始化每个邮箱的控制句柄*/ return mailbox_init_all_handle(mb, config, cpu_id); }
MAILBOX_GLOBAL long mailbox_init(void) { unsigned long offset = 0; int i = 0; struct mb_head *head = NULL; if (MAILBOX_INIT_MAGIC == g_mailbox_handle.init_flag) { /*考虑到单核下电重启,静态数据不会丢失,这里只打印告警, 返回错误的话,后面的平台初始化将调不到,IPC中断无法注册*/ return mailbox_logerro_p1(MAILBOX_ERR_GUT_ALREADY_INIT, g_mailbox_handle.init_flag); } printk("func = %s, line = %d baseaddr = 0x%x\n", __func__, __LINE__, MAILBOX_MEM_BASEADDR); g_shareMemBase = ioremap(MAILBOX_MEM_BASEADDR, MAILBOX_MEM_LENGTH); /*初始化邮箱中的数据*/ //memset(g_shareMemBase,0x0,MAILBOX_MEM_LENGTH); if(NULL == g_shareMemBase) { printk("func = %s, mmap mailbox mem error!!\n", __func__); return mailbox_logerro_p0(MAILBOX_CRIT_GUT_MEMORY_CONFIG); } offset = (unsigned long)g_shareMemBase - MAILBOX_MEM_BASEADDR; for(i = 0; i < MAILBOX_GLOBAL_CHANNEL_NUM; i++) { g_mailbox_global_cfg_tbl[i].head_addr = g_mailbox_global_cfg_tbl[i].head_addr + offset; g_mailbox_global_cfg_tbl[i].data_addr = g_mailbox_global_cfg_tbl[i].data_addr + offset; printk("i = %d, head_addr = 0x%lx, data_addr = 0x%lx\n", i, g_mailbox_global_cfg_tbl[i].head_addr, g_mailbox_global_cfg_tbl[i].data_addr); /*初始化邮箱头*/ head = (struct mb_head *)g_mailbox_global_cfg_tbl[i].head_addr; head->ulFront = 0x0; head->ulRear = 0x0; head->ulFrontslice = 0x0; head->ulRearslice = 0x0; } /*TODO:进行单核下电重启特性开发时,这行需要删除*/ mailbox_memset(&g_mailbox_handle, 0x00, sizeof(struct mb)); #ifdef MAILBOX_OPEN_MNTN if ((MAILBOX_HEAD_BOTTOM_ADDR > (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN)) || (MAILBOX_MEMORY_BOTTOM_ADDR > (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_LENGTH))) { mailbox_out(("mailbox address overflow: headbuttom valid(0x%x), config(0x%x)!\n\\r databuttom valid(0x%x), config(0x%x)!\n", (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN), MAILBOX_HEAD_BOTTOM_ADDR, (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_LENGTH), MAILBOX_MEMORY_BOTTOM_ADDR)); return mailbox_logerro_p0(MAILBOX_CRIT_GUT_MEMORY_CONFIG); } #endif /*初始化邮箱主体部分,创建邮箱总句柄。*/ if (MAILBOX_OK != mailbox_create_box(&g_mailbox_handle, &g_mailbox_global_cfg_tbl[0], MAILBOX_LOCAL_CPUID)) { return mailbox_logerro_p0(MAILBOX_ERR_GUT_CREATE_BOX); } /*初始化平台差异部分*/ if (MAILBOX_OK != mailbox_init_platform()) { return mailbox_logerro_p0(MAILBOX_ERR_GUT_INIT_PLATFORM); } g_mailbox_handle.init_flag = MAILBOX_INIT_MAGIC; #ifndef _DRV_LLT_ //mailbox_ifc_test_init(); #endif //fixme: there isn't go to unremap g_slice_reg = (void*)ioremap(SLICE_REG, 0x4); if (NULL == g_slice_reg) { printk("ioremap of slice reg fail.\n"); } mailbox_out(("mb init OK!\n")); return MAILBOX_OK; }