/********************************************************************************************************* ** 函数名称: _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_PipeDevDelete ** 功能描述: 删除一个管道设备 ** 输 入 : ** pcName 管道名称 ** bForce 强制删除 ** 输 出 : ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_PipeDevDelete (PCHAR pcName, BOOL bForce) { REGISTER PLW_PIPE_DEV p_pipedev; PCHAR pcTail = LW_NULL; 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)iosDevFind(pcName, &pcTail); if ((p_pipedev == LW_NULL) || (pcName == pcTail)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if (bForce == LW_FALSE) { if (LW_DEV_GET_USE_COUNT(&p_pipedev->PIPEDEV_devhdrHdr)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n"); _ErrorHandle(EBUSY); return (PX_ERROR); } if (SEL_WAKE_UP_LIST_LEN(&p_pipedev->PIPEDEV_selwulList) > 0) { errno = EBUSY; return (PX_ERROR); } } iosDevFileAbnormal(&p_pipedev->PIPEDEV_devhdrHdr); iosDevDelete(&p_pipedev->PIPEDEV_devhdrHdr); SEL_WAKE_UP_LIST_TERM(&p_pipedev->PIPEDEV_selwulList); API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock); API_MsgQueueDelete(&p_pipedev->PIPEDEV_hMsgQueue); __SHEAP_FREE((PVOID)p_pipedev); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_CanDevRemove ** 功能描述: 移除一个 CAN 设备 ** 输 入 : ** pcName 需要移除的 CAN 设备 ** bForce 模式选择 ** 输 出 : ERROR_NONE or PX_ERROR ** 全局变量: ** 调用模块: ** API 函数 *********************************************************************************************************/ LW_API INT API_CanDevRemove (PCHAR pcName, BOOL bForce) { __PCAN_PORT pDevHdr; PCHAR pcTail = LW_NULL; if (LW_CPU_GET_CUR_NESTING()) { _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (PX_ERROR); } if (_G_iCanDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } pDevHdr = (__PCAN_PORT)iosDevFind(pcName, &pcTail); if ((pDevHdr == LW_NULL) || (pcName == pcTail)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if (bForce == LW_FALSE) { if (LW_DEV_GET_USE_COUNT(&pDevHdr->CANPORT_can.CAN_devhdr)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n"); _ErrorHandle(EBUSY); return (PX_ERROR); } if (SEL_WAKE_UP_LIST_LEN(&pDevHdr->CANPORT_can.CAN_selwulList) > 0) { errno = EBUSY; return (PX_ERROR); } } iosDevFileAbnormal(&pDevHdr->CANPORT_can.CAN_devhdr); iosDevDelete(&pDevHdr->CANPORT_can.CAN_devhdr); SEL_WAKE_UP_LIST_TERM(&pDevHdr->CANPORT_can.CAN_selwulList); __canDevDelete(&pDevHdr->CANPORT_can); __SHEAP_FREE((PVOID)pDevHdr); 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); }