/********************************************************************************************************* ** 函数名称: ls1xWDTOpen ** 功能描述: 打开 WATCH_DOG 设备 ** 输 入 : pwdt WATCH_DOG 设备地址 ** pcName 设备名 ** iFlags 标志 ** iMode 模式 ** 输 出 : 错误号 *********************************************************************************************************/ static LONG ls1xWDTOpen (PLS1X_WDT_DEV pwdt, CHAR *pcName, INT iFlags, INT iMode) { 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(&pwdt->WDT_fdNodeHeader, (dev_t)pwdt, 0, iFlags, iMode, 0, 0, 0, LW_NULL, &bIsNew); if (pfdnode == LW_NULL) { printk(KERN_ERR "ls1xWDTOpen(): failed to add fd node!\n"); return (PX_ERROR); } if (LW_DEV_INC_USE_COUNT(&pwdt->WDT_devhdr) == 1) { if (ls1xWDTHwInit(pwdt, TIMEOUT_DEFAULT) != ERROR_NONE) { LW_DEV_DEC_USE_COUNT(&pwdt->WDT_devhdr); API_IosFdNodeDec(&pwdt->WDT_fdNodeHeader, pfdnode); return (PX_ERROR); } } return ((LONG)pfdnode); } }
/********************************************************************************************************* ** 函数名称: _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); } }
/********************************************************************************************************* ** 函数名称: _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); } }
/********************************************************************************************************* ** 函数名称: __canOpen ** 功能描述: CAN 设备打开 ** 输 入 : ** pcanDev CAN 设备 ** pcName 设备名称 ** iFlags 打开设备时使用的标志 ** iMode 打开的方式,保留 ** 输 出 : CAN 设备指针 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static LONG __canOpen (__CAN_DEV *pcanDev, PCHAR pcName, INT iFlags, INT iMode) { __CAN_PORT *pcanport = (__CAN_PORT *)pcanDev; if (LW_DEV_INC_USE_COUNT(&pcanDev->CAN_devhdr) == 1) { if (pcanport->CANPORT_pcanchan->pDrvFuncs->ioctl) { pcanport->CANPORT_pcanchan->pDrvFuncs->ioctl(pcanport->CANPORT_pcanchan, CAN_DEV_OPEN, LW_NULL); /* 打开端口 */ } } return ((LONG)pcanDev); }
/********************************************************************************************************* ** 函数名称: 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); } }
/********************************************************************************************************* ** 函数名称: __romFsOpen ** 功能描述: 打开或者创建文件 ** 输 入 : promfs romfs 文件系统 ** pcName 文件名 ** iFlags 方式 ** iMode mode_t ** 输 出 : < 0 错误 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static LONG __romFsOpen (PROM_VOLUME promfs, PCHAR pcName, INT iFlags, INT iMode) { INT iError; PROM_FILE promfile; PLW_FD_NODE pfdnode; size_t stSize; BOOL bIsNew; struct stat *pstat; INT iFollowLinkType; PCHAR pcTail, pcSymfile, pcPrefix; if (pcName == LW_NULL) { /* 无文件名 */ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH); return (PX_ERROR); } else { stSize = sizeof(ROM_FILE) + lib_strlen(pcName); promfile = (PROM_FILE)__SHEAP_ALLOC(stSize); if (promfile == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } lib_bzero(promfile, stSize); lib_strcpy(promfile->ROMFIL_cName, pcName); /* 记录文件名 */ promfile->ROMFIL_promfs = promfs; if (__ROMFS_VOL_LOCK(promfs) != ERROR_NONE) { _ErrorHandle(ENXIO); return (PX_ERROR); } if (__STR_IS_ROOT(promfile->ROMFIL_cName)) { promfile->ROMFIL_iFileType = __ROMFS_FILE_TYPE_DEV; goto __file_open_ok; /* 设备打开正常 */ } if (promfs->ROMFS_bValid == LW_FALSE) { __ROMFS_VOL_UNLOCK(promfs); __SHEAP_FREE(promfile); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } iError = __rfs_open(promfs, pcName, &pcTail, &pcSymfile, &promfile->ROMFIL_romfsdnt); if (iError) { __ROMFS_VOL_UNLOCK(promfs); __SHEAP_FREE(promfile); if (iFlags & O_CREAT) { _ErrorHandle(EROFS); /* 只读文件系统 */ } return (PX_ERROR); } /* * 首先处理符号链接文件情况 */ if (S_ISLNK(promfile->ROMFIL_romfsdnt.ROMFSDNT_stat.st_mode)) { pcSymfile--; /* 从 / 开始 */ if (pcSymfile == pcName) { pcPrefix = LW_NULL; /* 没有前缀 */ } else { pcPrefix = pcName; *pcSymfile = PX_EOS; } if (pcTail && lib_strlen(pcTail)) { iFollowLinkType = FOLLOW_LINK_TAIL; /* 连接目标内部文件 */ } else { iFollowLinkType = FOLLOW_LINK_FILE; /* 链接文件本身 */ } if (__rfs_path_build_link(promfs, &promfile->ROMFIL_romfsdnt, pcName, PATH_MAX + 1, pcPrefix, pcTail) == ERROR_NONE) { /* 构造链接目标 */ __ROMFS_VOL_UNLOCK(promfs); __SHEAP_FREE(promfile); return (iFollowLinkType); } else { /* 构造连接失败 */ __ROMFS_VOL_UNLOCK(promfs); __SHEAP_FREE(promfile); return (PX_ERROR); } } else if (S_ISDIR(promfile->ROMFIL_romfsdnt.ROMFSDNT_stat.st_mode)) { promfile->ROMFIL_iFileType = __ROMFS_FILE_TYPE_DIR; } else { promfile->ROMFIL_iFileType = __ROMFS_FILE_TYPE_NODE; } __file_open_ok: pstat = &promfile->ROMFIL_romfsdnt.ROMFSDNT_stat; pfdnode = API_IosFdNodeAdd(&promfs->ROMFS_plineFdNodeHeader, pstat->st_dev, (ino64_t)pstat->st_ino, iFlags, iMode, pstat->st_uid, pstat->st_gid, pstat->st_size, (PVOID)promfile, &bIsNew); /* 添加文件节点 */ if (pfdnode == LW_NULL) { /* 无法创建 fd_node 节点 */ __ROMFS_VOL_UNLOCK(promfs); __SHEAP_FREE(promfile); return (PX_ERROR); } LW_DEV_INC_USE_COUNT(&promfs->ROMFS_devhdrHdr); /* 更新计数器 */ __ROMFS_VOL_UNLOCK(promfs); if (bIsNew == LW_FALSE) { /* 有重复打开 */ __SHEAP_FREE(promfile); } return ((LONG)pfdnode); /* 返回文件节点 */ } return (PX_ERROR); }