Exemplo n.º 1
0
/*********************************************************************************************************
** 函数名称: 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);
    }
}
Exemplo n.º 2
0
/*********************************************************************************************************
** 函数名称: _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);
    }
}
Exemplo n.º 3
0
/*********************************************************************************************************
** 函数名称: _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);
    }
}
Exemplo n.º 4
0
/*********************************************************************************************************
** 函数名称: __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);
}
Exemplo n.º 5
0
/*********************************************************************************************************
** 函数名称: 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);
    }
}
Exemplo n.º 6
0
/*********************************************************************************************************
** 函数名称: __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);
}