/********************************************************************************************************* ** 函数名称: __canDevDelete ** 功能描述: 删除 CAN 设备资源 ** 输 入 : ** pcanDev CAN 设备 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID __canDevDelete (__CAN_DEV *pcanDev) { __canDeleteQueue(pcanDev->CAN_pcanqRecvQueue); __canDeleteQueue(pcanDev->CAN_pcanqSendQueue); API_SemaphoreBDelete(&pcanDev->CAN_ulRcvSemB); API_SemaphoreBDelete(&pcanDev->CAN_ulSendSemB); API_SemaphoreMDelete(&pcanDev->CAN_ulMutexSemM); }
/********************************************************************************************************* ** 函数名称: _JobQueueDelete ** 功能描述: 删除一个工作队列 ** 输 入 : pjobq 工作队列控制块 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _jobQueueDelete (PLW_JOB_QUEUE pjobq) { if (pjobq->JOBQ_ulSync) { API_SemaphoreBDelete(&pjobq->JOBQ_ulSync); } __KHEAP_FREE(pjobq); }
/********************************************************************************************************* ** 函数名称: _evtfdClose ** 功能描述: 关闭 eventfd 文件 ** 输 入 : pevtfdfil eventfd 文件 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT _evtfdClose (PLW_EVTFD_FILE pevtfdfil) { if (pevtfdfil) { SEL_WAKE_UP_TERM(&pevtfdfil->EF_selwulist); if (LW_DEV_GET_USE_COUNT(&_G_evtfddev.ED_devhdrHdr)) { LW_DEV_DEC_USE_COUNT(&_G_evtfddev.ED_devhdrHdr); } API_SemaphoreBDelete(&pevtfdfil->EF_ulReadLock); API_SemaphoreBDelete(&pevtfdfil->EF_ulWriteLock); __SHEAP_FREE(pevtfdfil); return (ERROR_NONE); } else { return (PX_ERROR); } }
/********************************************************************************************************* ** 函数名称: _evtfdOpen ** 功能描述: 打开 eventfd 设备 ** 输 入 : pevtfddev eventfd 设备 ** pcName 名称 ** iFlags 方式 ** iMode 方法 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static LONG _evtfdOpen (PLW_EVTFD_DEV pevtfddev, PCHAR pcName, INT iFlags, INT iMode) { PLW_EVTFD_FILE pevtfdfil; if (pcName == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device name invalidate.\r\n"); _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH); return (PX_ERROR); } else { if (iFlags & O_CREAT) { _ErrorHandle(ERROR_IO_FILE_EXIST); return (PX_ERROR); } pevtfdfil = (PLW_EVTFD_FILE)__SHEAP_ALLOC(sizeof(LW_EVTFD_FILE)); if (!pevtfdfil) { _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } pevtfdfil->EF_iFlag = iFlags; pevtfdfil->EF_ulReadLock = API_SemaphoreBCreate("evtfd_rlock", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pevtfdfil->EF_ulReadLock == LW_OBJECT_HANDLE_INVALID) { __SHEAP_FREE(pevtfdfil); return (PX_ERROR); } pevtfdfil->EF_ulWriteLock = API_SemaphoreBCreate("evtfd_wlock", LW_TRUE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pevtfdfil->EF_ulWriteLock == LW_OBJECT_HANDLE_INVALID) { API_SemaphoreBDelete(&pevtfdfil->EF_ulReadLock); __SHEAP_FREE(pevtfdfil); return (PX_ERROR); } pevtfdfil->EF_u64Counter = 0ull; lib_bzero(&pevtfdfil->EF_selwulist, sizeof(LW_SEL_WAKEUPLIST)); pevtfdfil->EF_selwulist.SELWUL_hListLock = _G_hEvtfdSelMutex; LW_SPIN_INIT(&pevtfdfil->EF_slLock); LW_DEV_INC_USE_COUNT(&_G_evtfddev.ED_devhdrHdr); return ((LONG)pevtfdfil); } }
/********************************************************************************************************* ** 函数名称: 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); }
/********************************************************************************************************* ** 函数名称: ls1xLedClose ** 功能描述: LED 关闭 ** 输 入 : pfdentry 设备表结构地址 ** 输 出 : 错误号 *********************************************************************************************************/ static INT ls1xLedClose (PLW_FD_ENTRY pfdentry) { PLS1XLED_DEV pled = (PLS1XLED_DEV)pfdentry->FDENTRY_pdevhdrHdr; PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode; if (pfdentry && pfdnode) { API_IosFdNodeDec(&pled->LED_fdNodeHeader, pfdnode); if (LW_DEV_DEC_USE_COUNT(&pled->LED_devhdr) == 0) { pled->LED_bQuit = LW_TRUE; API_SemaphoreBPostEx(pled->LED_hSemaphoreB, (VOID *)0); API_ThreadJoin(pled->LED_hThread, LW_NULL); pled->LED_hThread = 0; API_SemaphoreBDelete(&pled->LED_hSemaphoreB); pled->LED_hSemaphoreB = 0; gpioFree(pled->LED_uiGpio); } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: _hotplugClose ** 功能描述: 关闭热插拔消息文件 ** 输 入 : photplugfil 热插拔消息文件 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT _hotplugClose (PLW_HOTPLUG_FILE photplugfil) { if (photplugfil) { HOTPLUG_DEV_LOCK(); _List_Line_Del(&photplugfil->HOTPFIL_lineManage, &_G_hotplugdev.HOTPDEV_plineFile); HOTPLUG_DEV_UNLOCK(); _bmsgDelete(photplugfil->HOTPFIL_pbmsg); if (LW_DEV_GET_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr)) { LW_DEV_DEC_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr); } API_SemaphoreBDelete(&photplugfil->HOTPFIL_ulReadSync); __SHEAP_FREE(photplugfil); return (ERROR_NONE); } else { return (PX_ERROR); } }
/********************************************************************************************************* ** 函数名称: _jobQueueFinit ** 功能描述: 销毁一个工作队列 (静态销毁) ** 输 入 : pjobq 工作队列控制块 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _jobQueueFinit (PLW_JOB_QUEUE pjobq) { if (pjobq->JOBQ_ulSync) { API_SemaphoreBDelete(&pjobq->JOBQ_ulSync); } }
/********************************************************************************************************* ** 函数名称: 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); }
/********************************************************************************************************* ** 函数名称: __canDevInit ** 功能描述: 创建 CAN 设备 ** 输 入 : ** pcanDev CAN 设备 ** uiRdFrameSize 接收缓冲区大小 ** uiWrtFrameSize 发送缓冲区大小 ** 输 出 : ERROR_NONE or PX_ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __canDevInit (__CAN_DEV *pcanDev, UINT uiRdFrameSize, UINT uiWrtFrameSize) { REGISTER INT iErrLevel = 0; pcanDev->CAN_ulSendTimeout = LW_OPTION_WAIT_INFINITE; /* 初始化为永久等待 */ pcanDev->CAN_ulRecvTimeout = LW_OPTION_WAIT_INFINITE; /* 初始化为永久等待 */ pcanDev->CAN_pcanqRecvQueue = __canInitQueue(uiRdFrameSize); /* 创建读缓冲区 */ if (pcanDev->CAN_pcanqRecvQueue == LW_NULL) { /* 创建失败 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } pcanDev->CAN_pcanqSendQueue = __canInitQueue(uiWrtFrameSize); /* 创建读缓冲区 */ if (pcanDev->CAN_pcanqSendQueue == LW_NULL) { /* 创建失败 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); iErrLevel = 1; goto __error_handle; } pcanDev->CAN_canstatWriteState.CANSTAT_bBufEmpty = LW_TRUE; /* 发送队列空 */ pcanDev->CAN_uiBusState = CAN_DEV_BUS_ERROR_NONE; /* 发送队列空 */ pcanDev->CAN_ulRcvSemB = API_SemaphoreBCreate("can_rsync", LW_FALSE, LW_OPTION_WAIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); /* 读同步 */ if (!pcanDev->CAN_ulRcvSemB) { iErrLevel = 2; goto __error_handle; } pcanDev->CAN_ulSendSemB = API_SemaphoreBCreate("can_wsync", LW_TRUE, LW_OPTION_WAIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); /* 写同步 */ if (!pcanDev->CAN_ulSendSemB) { iErrLevel = 3; goto __error_handle; } pcanDev->CAN_ulMutexSemM = API_SemaphoreMCreate("can_lock", LW_PRIO_DEF_CEILING, (LW_OPTION_WAIT_FIFO | LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL), LW_NULL); /* 互斥访问控制信号量 */ if (!pcanDev->CAN_ulMutexSemM) { iErrLevel = 4; goto __error_handle; } SEL_WAKE_UP_LIST_INIT(&pcanDev->CAN_selwulList); /* 初始化 select 等待链 */ LW_SPIN_INIT(&pcanDev->CAN_slLock); /* 初始化自旋锁 */ return (ERROR_NONE); __error_handle: if (iErrLevel > 3) { API_SemaphoreBDelete(&pcanDev->CAN_ulSendSemB); /* 删除写同步 */ } if (iErrLevel > 2) { API_SemaphoreBDelete(&pcanDev->CAN_ulRcvSemB); /* 删除读同步 */ } if (iErrLevel > 1) { __canDeleteQueue(pcanDev->CAN_pcanqSendQueue); /* 删除读缓冲区 */ } if (iErrLevel > 0) { __canDeleteQueue(pcanDev->CAN_pcanqRecvQueue); /* 删除写缓冲区 */ } return (PX_ERROR); }