/********************************************************************************************************* ** 函数名称: _hotplugDevCreate ** 功能描述: 安装 hotplug 消息设备 ** 输 入 : NONE ** 输 出 : 设备是否创建成功 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ INT _hotplugDevCreate (VOID) { if (_G_iHotplugDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } _G_hotplugdev.HOTPDEV_plineFile = LW_NULL; _G_hotplugdev.HOTPDEV_ulMutex = API_SemaphoreMCreate("hotplug_lock", LW_PRIO_DEF_CEILING, LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (_G_hotplugdev.HOTPDEV_ulMutex == LW_OBJECT_HANDLE_INVALID) { return (PX_ERROR); } SEL_WAKE_UP_LIST_INIT(&_G_hotplugdev.HOTPDEV_selwulList); if (iosDevAddEx(&_G_hotplugdev.HOTPDEV_devhdrHdr, LW_HOTPLUG_DEV_PATH, _G_iHotplugDrvNum, DT_CHR) != ERROR_NONE) { API_SemaphoreMDelete(&_G_hotplugdev.HOTPDEV_ulMutex); SEL_WAKE_UP_LIST_TERM(&_G_hotplugdev.HOTPDEV_selwulList); return (PX_ERROR); } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_EventfdDevCreate ** 功能描述: 安装 eventfd 设备 ** 输 入 : NONE ** 输 出 : 设备是否创建成功 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_EventfdDevCreate (VOID) { if (_G_iEvtfdDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } if (iosDevAddEx(&_G_evtfddev.ED_devhdrHdr, LW_EVTFD_DEV_PATH, _G_iEvtfdDrvNum, DT_CHR) != ERROR_NONE) { return (PX_ERROR); } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_RomFsDevCreate ** 功能描述: 创建 romfs 文件系统设备. ** 输 入 : pcName 设备名(设备挂接的节点地址) ** pblkd romfs 物理设备. ** 输 出 : < 0 表示失败 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_RomFsDevCreate (PCHAR pcName, PLW_BLK_DEV pblkd) { PROM_VOLUME promfs; if (_G_iRomfsDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "romfs Driver invalidate.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } if ((pblkd == LW_NULL) || (pblkd->BLKD_pcName == LW_NULL)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "block device invalidate.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if ((pcName == LW_NULL) || __STR_IS_ROOT(pcName)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "mount name invalidate.\r\n"); _ErrorHandle(EFAULT); /* Bad address */ return (PX_ERROR); } promfs = (PROM_VOLUME)__SHEAP_ALLOC(sizeof(ROM_VOLUME)); if (promfs == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } lib_bzero(promfs, sizeof(ROM_VOLUME)); /* 清空卷控制块 */ promfs->ROMFS_bValid = LW_TRUE; promfs->ROMFS_hVolLock = API_SemaphoreMCreate("romvol_lock", LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_FIFO | LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (!promfs->ROMFS_hVolLock) { /* 无法创建卷锁 */ __SHEAP_FREE(promfs); return (PX_ERROR); } promfs->ROMFS_pblkd = pblkd; /* 记录物理设备 */ promfs->ROMFS_ulSectorSize = pblkd->BLKD_ulBytesPerSector; if (promfs->ROMFS_ulSectorSize == 0) { if (pblkd->BLKD_pfuncBlkIoctl(pblkd, LW_BLKD_GET_SECSIZE, &promfs->ROMFS_ulSectorSize) < ERROR_NONE) { API_SemaphoreMDelete(&promfs->ROMFS_hVolLock); __SHEAP_FREE(promfs); return (PX_ERROR); } } promfs->ROMFS_ulSectorNum = pblkd->BLKD_ulNSector; if (promfs->ROMFS_ulSectorNum == 0) { if (pblkd->BLKD_pfuncBlkIoctl(pblkd, LW_BLKD_GET_SECNUM, &promfs->ROMFS_ulSectorNum) < ERROR_NONE) { API_SemaphoreMDelete(&promfs->ROMFS_hVolLock); __SHEAP_FREE(promfs); return (PX_ERROR); } } promfs->ROMFS_pcSector = (PCHAR)__SHEAP_ALLOC((size_t)promfs->ROMFS_ulSectorSize); if (promfs->ROMFS_pcSector == LW_NULL) { API_SemaphoreMDelete(&promfs->ROMFS_hVolLock); __SHEAP_FREE(promfs); _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } promfs->ROMFS_ulCurSector = (ULONG)-1; /* 当前窗口无效 */ if (__rfs_mount(promfs)) { API_SemaphoreMDelete(&promfs->ROMFS_hVolLock); __SHEAP_FREE(promfs->ROMFS_pcSector); __SHEAP_FREE(promfs); _DebugHandle(__ERRORMESSAGE_LEVEL, "format unknown.\r\n"); _ErrorHandle(ERROR_IO_VOLUME_ERROR); return (PX_ERROR); } promfs->ROMFS_uid = getuid(); promfs->ROMFS_gid = getgid(); lib_time(&promfs->ROMFS_time); /* 获得当前时间 */ if (iosDevAddEx(&promfs->ROMFS_devhdrHdr, pcName, _G_iRomfsDrvNum, DT_DIR) != ERROR_NONE) { /* 安装文件系统设备 */ API_SemaphoreMDelete(&promfs->ROMFS_hVolLock); __SHEAP_FREE(promfs->ROMFS_pcSector); __SHEAP_FREE(promfs); return (PX_ERROR); } __fsDiskLinkCounterAdd(pblkd); /* 增加块设备链接 */ _DebugFormat(__LOGMESSAGE_LEVEL, "target \"%s\" mount ok.\r\n", pcName); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_PipeDevCreate ** 功能描述: 创建一个管道设备 ** 输 入 : ** pcName 管道名称 ** ulNMessages 管道中消息数量 ** stNBytes 每一条消息的最大字节数 ** 输 出 : ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_PipeDevCreate (PCHAR pcName, ULONG ulNMessages, size_t stNBytes) { REGISTER PLW_PIPE_DEV p_pipedev; if (LW_CPU_GET_CUR_NESTING()) { _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (PX_ERROR); } if (_G_iPipeDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } p_pipedev = (PLW_PIPE_DEV)__SHEAP_ALLOC(sizeof(LW_PIPE_DEV)); if (p_pipedev == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } lib_bzero(p_pipedev, sizeof(LW_PIPE_DEV)); p_pipedev->PIPEDEV_iAbortFlag = 0; p_pipedev->PIPEDEV_ulRTimeout = LW_OPTION_WAIT_INFINITE; /* 初始化为永久等待 */ p_pipedev->PIPEDEV_ulWTimeout = LW_OPTION_WAIT_INFINITE; /* 初始化为永久等待 */ p_pipedev->PIPEDEV_hWriteLock = API_SemaphoreBCreate("pipe_wsync", LW_TRUE, _G_ulPipeLockOpt | LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (!p_pipedev->PIPEDEV_hWriteLock) { __SHEAP_FREE((PVOID)p_pipedev); return (PX_ERROR); } p_pipedev->PIPEDEV_hMsgQueue = API_MsgQueueCreate("pipe_msg", ulNMessages, stNBytes, _G_ulPipeLockOpt | LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (!p_pipedev->PIPEDEV_hMsgQueue) { API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock); __SHEAP_FREE((PVOID)p_pipedev); return (PX_ERROR); } SEL_WAKE_UP_LIST_INIT(&p_pipedev->PIPEDEV_selwulList); if (iosDevAddEx(&p_pipedev->PIPEDEV_devhdrHdr, pcName, _G_iPipeDrvNum, DT_FIFO) != ERROR_NONE) { API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock); API_MsgQueueDelete(&p_pipedev->PIPEDEV_hMsgQueue); SEL_WAKE_UP_LIST_TERM(&p_pipedev->PIPEDEV_selwulList); __SHEAP_FREE((PVOID)p_pipedev); _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } p_pipedev->PIPEDEV_timeCreate = lib_time(LW_NULL); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_CanDevCreate ** 功能描述: 创建 can 设备 ** 输 入 : pcName 设备名 ** pcanchan 通道 ** uiRdFrameSize 接收缓冲区大小 ** uiWrtFrameSize 发送缓冲区大小 ** 输 出 : 是否成功 ** 全局变量: ** 调用模块: ** API 函数 *********************************************************************************************************/ LW_API INT API_CanDevCreate (PCHAR pcName, CAN_CHAN *pcanchan, UINT uiRdFrameSize, UINT uiWrtFrameSize) { __PCAN_PORT pcanport; INT iTemp; if ((!pcName) || (!pcanchan)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n"); _ErrorHandle(EINVAL); return (PX_ERROR); } if ((uiRdFrameSize < 1) || (uiWrtFrameSize < 1)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n"); _ErrorHandle(EINVAL); return (PX_ERROR); } if ((!pcanchan->pDrvFuncs->callbackInstall) || (!pcanchan->pDrvFuncs->txStartup)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n"); _ErrorHandle(EINVAL); return (PX_ERROR); } if (_G_iCanDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "can Driver invalidate.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } pcanport = (__PCAN_PORT)__SHEAP_ALLOC(sizeof(__CAN_PORT)); if (!pcanport) { _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } lib_bzero(pcanport, sizeof(__CAN_PORT)); iTemp = __canDevInit(&pcanport->CANPORT_can, uiRdFrameSize, uiWrtFrameSize); /* 初始化设备控制块 */ if (iTemp != ERROR_NONE) { __SHEAP_FREE(pcanport); _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } __canFlushRd(pcanport); __canFlushWrt(pcanport); pcanport->CANPORT_pcanchan = pcanchan; pcanchan->pDrvFuncs->callbackInstall(pcanchan, CAN_CALLBACK_GET_TX_DATA, (CAN_CALLBACK)__canITx, (PVOID)pcanport); pcanchan->pDrvFuncs->callbackInstall(pcanchan, CAN_CALLBACK_PUT_RCV_DATA, (CAN_CALLBACK)__canIRx, (PVOID)pcanport); pcanchan->pDrvFuncs->callbackInstall(pcanchan, CAN_CALLBACK_PUT_BUS_STATE, (CAN_CALLBACK)__canSetBusState, (PVOID)pcanport); iTemp = (INT)iosDevAddEx(&pcanport->CANPORT_can.CAN_devhdr, pcName, _G_iCanDrvNum, DT_CHR); if (iTemp) { __canDevDelete(&pcanport->CANPORT_can); __SHEAP_FREE(pcanport); _DebugHandle(__ERRORMESSAGE_LEVEL, "add device error.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } else { return (ERROR_NONE); } }