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;
}
Ejemplo n.º 3
0
/*****************************************************************************
 函 数 名  : 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);
}
Ejemplo n.º 4
0
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;
}