u32 bsp_nvm_init(void) { u32 ret = NV_ERROR; struct nv_global_ddr_info_stru* ddr_info = (struct nv_global_ddr_info_stru*)NV_GLOBAL_INFO_ADDR; #ifdef BSP_CONFIG_HI3630 nv_printf("waiting for ap modem nv init ok .......\n"); BSP_SYNC_Wait(SYNC_MODULE_NV,0); #endif nv_debug(NV_FUN_NVM_INIT,0,0,0,0); if(ddr_info->ccore_init_state < NV_BOOT_INIT_OK) { nv_printf("[%s]:pre init fail,break here!\n",__FUNCTION__); nv_debug(NV_FUN_NVM_INIT,1,0,0,0); /*lint -save -e801*/ goto nv_init_fail; /*lint -restore*/ } g_nv_ctrl.shared_addr = (u32)NV_GLOBAL_INFO_ADDR; spin_lock_init(&g_nv_ctrl.spinlock); ret = nv_icc_chan_init(); if(ret) { nv_debug(NV_FUN_NVM_INIT,2,ret,0,0); /*lint -save -e801*/ goto nv_init_fail; /*lint -restore*/ } osl_sem_init(1,&g_nv_ctrl.rw_sem); osl_sem_init(0,&g_nv_ctrl.cc_sem); ret = bsp_nvm_read(NV_ID_MSP_FLASH_LESS_MID_THRED,(u8*)&g_nv_ctrl.mid_prio,sizeof(u32)); if(ret) { g_nv_ctrl.mid_prio = 20; nv_printf("read 0x%x error : 0x%x,use default count\n",NV_ID_MSP_FLASH_LESS_MID_THRED,ret); } ret = (u32)bsp_ipc_sem_create(IPC_SEM_NV_CRC); if(ret) { nv_debug(NV_FUN_KERNEL_INIT,3 ,ret ,0,0); /*lint -save -e801*/ goto nv_init_fail; /*lint -restore*/ } ddr_info->ccore_init_state = NV_INIT_OK; nv_printf("nv init ok !\n"); INIT_LIST_HEAD(&g_nv_ctrl.stList); return NV_OK; nv_init_fail: ddr_info->ccore_init_state = NV_INIT_FAIL; nv_printf("\n[%s]\n",__FUNCTION__); nv_help(NV_FUN_NVM_INIT); return ret; }
/***************************************************************************** Function : root Description: main function Input : void Return : void Other : *****************************************************************************/ VOS_VOID root( VOS_VOID) { Print("\n!!!!! VOS_Startup Begin !!!!!\n"); #ifdef BSP_CONFIG_HI3630 #if (VOS_OS_VER == VOS_VXWORKS) BSP_SYNC_Wait(SYNC_MODULE_MSP,0); #elif (VOS_OS_VER == VOS_LINUX) BSP_SYNC_Give(SYNC_MODULE_MSP); #endif #endif #if (VOS_WIN32 == VOS_OS_VER) VOS_SplInit(); #endif #ifndef VOS_SUPPORT_APP_MEM if ( VOS_OK != VOS_Startup( VOS_STARTUP_INIT_DOPRA_SOFEWARE_RESOURCE ) ) { Print("VOS_Startup Phase 0: Error.\n"); } #endif if ( VOS_OK != VOS_Startup( VOS_STARTUP_SET_TIME_INTERRUPT ) ) { Print("VOS_Startup Phase 1: Error.\n"); } if ( VOS_OK != VOS_Startup( VOS_STARTUP_CREATE_TICK_TASK ) ) { Print("VOS_Startup Phase2: Error.\n"); } if( VOS_OK != VOS_Startup( VOS_STARTUP_CREATE_ROOT_TASK ) ) { Print("VOS_Startup Phase 3: Error\n"); } if ( VOS_OK != VOS_Startup( VOS_STARTUP_SUSPEND_MAIN_TASK ) ) { Print("VOS_Startup Phase 4: Error\n"); } Print("\n!!!!! VOS_Startup End !!!!!\n"); return; }
/***************************************************************************** * 函 数 名 : IPF_Init * * 功能描述 : IPF初始化 内部使用,不作为接口函数 * * 输入参数 : void * 输出参数 : 无 * 返 回 值 : IPF_SUCCESS 初始化成功 * IPF_ERROR 初始化失败 * * 修改记录 :2011年1月21日 鲁婷 创建 * 1.修改日期 : 2012年11月29日 * 修改作者 : z00212992 * 修改记录 : 增加ADQ初始化 *****************************************************************************/ int IPF_Init(void) { int s32Ret = 0; /* IPF内存配置越界检查 */ if(IPF_MEM_USED_SIZE > IPF_AXI_MEM_SIZE) { IPF_PRINT_ERROR("memory overstep the boundary\n"); return IPF_ERROR; } hisi_io_memset((BSP_VOID*)&g_stIpfCtx, 0x0, sizeof(IPF_CONTEXT_S)); IPF_ULBD_MEM_ADDR = HISI_VA_ADDRESS(IPF_AXI_MEM_ADDR); if (0 == (IPF_REGBASE_ADR = (unsigned long)ioremap(REG_BASE_IPF,REG_IPF_IOSIZE))){ BUG_ON(1); return IPF_ERROR; } /* 为上行BD、RD描述符分配一段连续的物理地址 */ g_stIpfUl.pstIpfBDQ = (IPF_BD_DESC_S*)IPF_ULBD_MEM_ADDR; g_stIpfUl.pstIpfRDQ = (IPF_RD_DESC_S*)IPF_ULRD_MEM_ADDR; /* 为上行AD描述符分配一段连续内存(首地址8字节对齐)*/ g_stIpfUl.pstIpfADQ0 = (IPF_AD_DESC_S*)IPF_ULAD0_MEM_ADDR; g_stIpfUl.pstIpfADQ1 = (IPF_AD_DESC_S*)IPF_ULAD1_MEM_ADDR; /* 为下行BD、RD描述符分配一段连续的物理地址 */ g_stIpfDl.pstIpfBDQ = (IPF_BD_DESC_S*)IPF_DLBD_MEM_ADDR; g_stIpfDl.pstIpfRDQ = (IPF_RD_DESC_S*)IPF_DLRD_MEM_ADDR; /* 为下行AD描述符分配一段连续内存(首地址8字节对齐)*/ g_stIpfDl.pstIpfADQ0 = (IPF_AD_DESC_S*)IPF_DLAD0_MEM_ADDR; g_stIpfDl.pstIpfADQ1 = (IPF_AD_DESC_S*)IPF_DLAD1_MEM_ADDR; /* 为下行CD描述符分配一段连续的物理地址 */ g_stIpfDl.pstIpfCDQ = (IPF_CD_DESC_S*)IPF_DLCD_MEM_ADDR; /* 记录IPF上行空闲BD个数 */ g_stIpfUl.pu32IdleBd = (unsigned int*)IPF_ULBD_IDLENUM_ADDR; #ifdef __BSP_IPF_DEBUG__ /* 记录IPF debug信息 */ g_stIPFDebugInfo = (IPF_DEBUG_INFO_S*)IPF_DEBUG_INFO_ADDR; /* 记录IPF 下行CDdebug信息 */ g_stIpfDl.pstIpfDebugCDQ = (IPF_CD_DESC_S*)IPF_DEBUG_DLCD_ADDR; #endif /* 记录IPF 下行CD读写指针 */ g_stIpfDl.u32IpfCdRptr = (unsigned int*)IPF_DLCD_PTR_ADDR; g_stIpfDl.u32IpfCdWptr = (unsigned int*)(IPF_DLCD_PTR_ADDR+4); /* 挂接IPF中断 */ IPF_Int_Connect(); /* 注册IPF设备 */ s32Ret = platform_device_register(&ipf_pfdev); if(s32Ret) { IPF_PRINT_ERROR("ipf device register fail\n"); return s32Ret; } /* 注册IPF驱动 */ s32Ret = platform_driver_register(&ipf_pfdrv); if(s32Ret) { platform_device_unregister(&ipf_pfdev); IPF_PRINT_ERROR("ipf driver register fail\n"); return s32Ret; } ipf_peri_ctrl_base = (unsigned long)HISI_VA_ADDRESS(SOC_PERI_SCTRL_BASE_ADDR); if (!ipf_peri_ctrl_base) { IPF_PRINT_ERROR("unable to ioremap ipf peri ctrl\n"); } /* 打开IPF hclk时钟、axi总线时钟 */ IPF_REG_WRITE(SOC_PERI_SCTRL_SC_PERIPH_CLKEN2_ADDR(ipf_peri_ctrl_base), \ (0x1 << SOC_PERI_SCTRL_SC_PERIPH_CLKEN2_periph_clken2_ipf_acpu_START)); /* 等待另外一个core ipf初始化同步完成 */ s32Ret = BSP_SYNC_Wait(SYNC_MODULE_IPF, 5000); if(s32Ret != BSP_OK) { IPF_PRINT_ERROR("BSP_SYNC_Wait timeout\n"); return IPF_ERROR; } /* IPF初始化完成 */ g_stIpfCtx.isInit = BSP_TRUE; IPF_PRINT_ERROR("success\n"); return IPF_SUCCESS; }
int mdrv_sync_wait(SYNC_MODULE_E u32Module, unsigned int u32TimeOut) { return BSP_SYNC_Wait(u32Module, u32TimeOut); }