Пример #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);
    }
}
Пример #2
0
/*********************************************************************************************************
** 函数名称: __romFsClose
** 功能描述: romfs close 操作
** 输 入  : pfdentry         文件控制块
** 输 出  : < 0 表示错误
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static INT  __romFsClose (PLW_FD_ENTRY    pfdentry)
{
    PLW_FD_NODE   pfdnode  = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
    PROM_FILE     promfile = (PROM_FILE)pfdnode->FDNODE_pvFile;
    PROM_VOLUME   promfs   = promfile->ROMFIL_promfs;
    BOOL          bFree    = LW_FALSE;

    if (promfile) {
        if (__ROMFS_VOL_LOCK(promfs) != ERROR_NONE) {
            _ErrorHandle(ENXIO);
            return  (PX_ERROR);
        }
        if (API_IosFdNodeDec(&promfs->ROMFS_plineFdNodeHeader,
                             pfdnode) == 0) {
            bFree = LW_TRUE;
        }
        
        LW_DEV_DEC_USE_COUNT(&promfs->ROMFS_devhdrHdr);
        
        __ROMFS_VOL_UNLOCK(promfs);
        
        if (bFree) {
            __SHEAP_FREE(promfile);
        }
        
        return  (ERROR_NONE);
    }
    
    return  (PX_ERROR);
}
Пример #3
0
/*********************************************************************************************************
** 函数名称: ls1xWDTClose
** 功能描述: 关闭 WATCH_DOG 设备
** 输 入  : pfdentry 设备表结构地址
** 输 出  : 错误号
*********************************************************************************************************/
static INT  ls1xWDTClose (PLW_FD_ENTRY   pfdentry)
{
    PLS1X_WDT_DEV   pwdt       = (PLS1X_WDT_DEV)pfdentry->FDENTRY_pdevhdrHdr;
    PLW_FD_NODE     pfdnode    = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;

    if (pfdentry && pfdnode) {
        API_IosFdNodeDec(&pwdt->WDT_fdNodeHeader, pfdnode);
        if (LW_DEV_DEC_USE_COUNT(&pwdt->WDT_devhdr) == 0) {
            ls1xWDTDeInit(pwdt);
        }
    }
    return  (ERROR_NONE);
}
Пример #4
0
/*********************************************************************************************************
** 函数名称: __canClose
** 功能描述: CAN 设备关闭
** 输 入  :
**           pcanDev          CAN 设备
** 输 出  : CAN 设备指针
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static INT __canClose (__CAN_DEV   *pcanDev)
{
    __CAN_PORT      *pcanport = (__CAN_PORT *)pcanDev;

    if (LW_DEV_GET_USE_COUNT(&pcanDev->CAN_devhdr)) {
        if (!LW_DEV_DEC_USE_COUNT(&pcanDev->CAN_devhdr)) {
            if (pcanport->CANPORT_pcanchan->pDrvFuncs->ioctl) {
                pcanport->CANPORT_pcanchan->pDrvFuncs->ioctl(pcanport->CANPORT_pcanchan,
                        CAN_DEV_CLOSE, LW_NULL);
                /*  挂起端口                    */
            }
            SEL_WAKE_UP_ALL(&pcanDev->CAN_selwulList,
                            SELEXCEPT);                                 /*  激活异常等待                */
        }
    }

    return  (ERROR_NONE);
}
Пример #5
0
/*********************************************************************************************************
** 函数名称: _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);
    }
}
Пример #6
0
/*********************************************************************************************************
** 函数名称: 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);
}
Пример #7
0
/*********************************************************************************************************
** 函数名称: _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);
    }
}
Пример #8
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);
    }
}