/********************************************************************************************************* ** 函数名称: _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); } }
/********************************************************************************************************* ** 函数名称: _JobQueueCreate ** 功能描述: 创建一个工作队列 ** 输 入 : uiQueueSize 队列大小 ** bNonBlock 执行函数是否为非阻塞方式 ** 输 出 : 工作队列控制块 ** 全局变量: ** 调用模块: *********************************************************************************************************/ PLW_JOB_QUEUE _jobQueueCreate (UINT uiQueueSize, BOOL bNonBlock) { PLW_JOB_QUEUE pjobq; pjobq = (PLW_JOB_QUEUE)__KHEAP_ALLOC((size_t)(sizeof(LW_JOB_QUEUE) + (uiQueueSize * sizeof(LW_JOB_MSG)))); if (pjobq == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "kernel low memory.\r\n"); _ErrorHandle(ERROR_KERNEL_LOW_MEMORY); return (LW_NULL); } pjobq->JOBQ_pjobmsgQueue = (PLW_JOB_MSG)(pjobq + 1); pjobq->JOBQ_uiIn = 0; pjobq->JOBQ_uiOut = 0; pjobq->JOBQ_uiCnt = 0; pjobq->JOBQ_uiSize = uiQueueSize; pjobq->JOBQ_stLost = 0; if (bNonBlock == LW_FALSE) { pjobq->JOBQ_ulSync = API_SemaphoreBCreate("job_sync", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pjobq->JOBQ_ulSync == LW_OBJECT_HANDLE_INVALID) { __KHEAP_FREE(pjobq); return (LW_NULL); } } LW_SPIN_INIT(&pjobq->JOBQ_slLock); return (pjobq); }
/********************************************************************************************************* ** 函数名称: _hotplugOpen ** 功能描述: 打开热插拔消息设备 ** 输 入 : photplugdev 热插拔消息设备 ** pcName 名称 ** iFlags 方式 ** iMode 方法 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static LONG _hotplugOpen (PLW_HOTPLUG_DEV photplugdev, PCHAR pcName, INT iFlags, INT iMode) { PLW_HOTPLUG_FILE photplugfil; 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); } photplugfil = (PLW_HOTPLUG_FILE)__SHEAP_ALLOC(sizeof(LW_HOTPLUG_FILE)); if (!photplugfil) { __nomem: _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } photplugfil->HOTPFIL_iFlag = iFlags; photplugfil->HOTPFIL_iMsg = LW_HOTPLUG_MSG_ALL; photplugfil->HOTPFIL_pbmsg = _bmsgCreate(LW_CFG_HOTPLUG_DEV_DEFAULT_BUFSIZE); if (photplugfil->HOTPFIL_pbmsg == LW_NULL) { __SHEAP_FREE(photplugfil); goto __nomem; } photplugfil->HOTPFIL_ulReadSync = API_SemaphoreBCreate("hotplug_rsync", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (photplugfil->HOTPFIL_ulReadSync == LW_OBJECT_HANDLE_INVALID) { _bmsgDelete(photplugfil->HOTPFIL_pbmsg); __SHEAP_FREE(photplugfil); return (PX_ERROR); } HOTPLUG_DEV_LOCK(); _List_Line_Add_Tail(&photplugfil->HOTPFIL_lineManage, &_G_hotplugdev.HOTPDEV_plineFile); HOTPLUG_DEV_UNLOCK(); LW_DEV_INC_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr); return ((LONG)photplugfil); } }
/********************************************************************************************************* ** 函数名称: _JobQueueInit ** 功能描述: 初始化一个工作队列 (静态创建) ** 输 入 : pjobq 需要初始化的工作队列控制块 ** pjobmsg 消息缓冲区 ** uiQueueSize 队列大小 ** bNonBlock 执行函数是否为非阻塞方式 ** 输 出 : 工作队列控制块 ** 全局变量: ** 调用模块: *********************************************************************************************************/ ULONG _jobQueueInit (PLW_JOB_QUEUE pjobq, PLW_JOB_MSG pjobmsg, UINT uiQueueSize, BOOL bNonBlock) { pjobq->JOBQ_pjobmsgQueue = pjobmsg; pjobq->JOBQ_uiIn = 0; pjobq->JOBQ_uiOut = 0; pjobq->JOBQ_uiCnt = 0; pjobq->JOBQ_uiSize = uiQueueSize; pjobq->JOBQ_stLost = 0; if (bNonBlock == LW_FALSE) { pjobq->JOBQ_ulSync = API_SemaphoreBCreate("job_sync", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pjobq->JOBQ_ulSync == LW_OBJECT_HANDLE_INVALID) { return (errno); } } LW_SPIN_INIT(&pjobq->JOBQ_slLock); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: ls1xLedOpen ** 功能描述: LED 打开 ** 输 入 : pled LED 设备地址 ** pcName 设备名 ** iFlags 标志 ** iMode 模式 ** 输 出 : 错误号 *********************************************************************************************************/ static LONG ls1xLedOpen (PLS1XLED_DEV pled, CHAR *pcName, INT iFlags, INT iMode) { LW_CLASS_THREADATTR threadattr; PLW_FD_NODE pfdnode; BOOL bIsNew; if (pcName == LW_NULL) { _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH); return (PX_ERROR); } else { pfdnode = API_IosFdNodeAdd(&pled->LED_fdNodeHeader, (dev_t)pled, 0, iFlags, iMode, 0, 0, 0, LW_NULL, &bIsNew); if (pfdnode == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "ls1xLedOpen(): failed to add fd node!\r\n"); return (PX_ERROR); } if (LW_DEV_INC_USE_COUNT(&pled->LED_devhdr) == 1) { if (gpioRequestOne(pled->LED_uiGpio, (pled->LED_bIsOutPutHigh ? LW_GPIOF_OUT_INIT_LOW :LW_GPIOF_OUT_INIT_HIGH), "led")) { LW_DEV_DEC_USE_COUNT(&pled->LED_devhdr); API_IosFdNodeDec(&pled->LED_fdNodeHeader, pfdnode); return (PX_ERROR); } pled->LED_bQuit = LW_FALSE; threadattr = API_ThreadAttrGetDefault(); threadattr.THREADATTR_pvArg = (VOID *)pled; threadattr.THREADATTR_ucPriority = LED_THREAD_PRIO; threadattr.THREADATTR_ulOption |= LW_OPTION_OBJECT_GLOBAL; pled->LED_hSemaphoreB = API_SemaphoreBCreate("sem_led", LW_FALSE, LW_OPTION_DEFAULT, LW_NULL); pled->LED_hThread = API_ThreadCreate("t_led", (PTHREAD_START_ROUTINE)ls1xLedThread, &threadattr, LW_NULL); } return ((LONG)pfdnode); } }
/********************************************************************************************************* ** 函数名称: 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); }