drv_state.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 127 行

C
127
字号
/**************************************************************************/
/*                                                                        */
/*     Copyright (C) 2006 Oki Electric Industry Co., LTD.                 */
/*                                                                        */
/*     System Name  :  uPLAT7D series                                     */
/*     Module Name  :  driver state api program                           */
/*     File   Name  :  drv_state.c                                        */
/*     Revision     :  01.00                                              */
/*     Date         :  2006.02.11                                         */
/*                                                                        */
/**************************************************************************/

#include "common.h"

typedef struct DRV_STM{
    int16_t state;      /* Driver's state   */
    int16_t handle;     /* Open driver's ID */
}DRV_STM;

static DRV_STM driver_stm[DRVNO_MAX];

/************************************************************************/
/*                                                                      */
/*  Function Name   : void smpDrv_InitmanageStateMachine(void)          */
/*  Input           : void                                              */
/*  Output          : void                                              */
/*                                                                      */
/*  Note : None                                                         */
/*                                                                      */
/************************************************************************/
void smpDrv_InitmanageStateMachine(void)
{
    enum driver_number i;

    for(i=0 ; i<DRVNO_MAX ; ++i ) {
        driver_stm[i].state = DRVSTATE_CLOSE;
        driver_stm[i].handle = HANDLE_ID_INIT;
    }
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : int16_t smpDrv_manageStateMachine(                */
/*                                         enum driver_number num,      */
/*                                         enum driver_state event)     */
/*  Input           : enum driver_number drv_num  driver number         */
/*                    enum driver_state  drv_event  state transition    */
/*                    int16_t            handle     Open driver's ID    */
/*  Output          : int16_t  OK(1)                                    */
/*                             ERROR(-1)                                */
/*                             DRV_EXCLUSION_ERROR(-3)                  */
/*                                                                      */
/*  Note : None                                                         */
/*                                                                      */
/************************************************************************/
int16_t smpDrv_manageStateMachine(enum driver_number num, enum driver_state event, int16_t handle)
{
    int16_t rtnVal = OK;

    /* Input argument check */
    if( num >= DRVNO_MAX ) {
        rtnVal = ERROR;
    }
    if( event >= DRVEVENT_MAX ) {
        rtnVal = ERROR;
    }

    if( rtnVal == OK ) {
        /* Driver exclusion state transition */
        if( driver_stm[num].state == DRVSTATE_CLOSE) {
            switch( event ) {
            case DRVEVENT_RESET:
            case DRVEVENT_CLOSE:
                break;

            case DRVEVENT_OPEN:
                driver_stm[num].state = DRVSTATE_OPEN;
                driver_stm[num].handle = HANDLE_ID_1;
                break;

            case DRVEVENT_READ:
            case DRVEVENT_WRITE:
            case DRVEVENT_IOCTL:
            case DRVEVENT_POLL:
                rtnVal = DRV_EXCLUSION_ERROR;
                break;

            default:
                rtnVal = DRV_EXCLUSION_ERROR;
                break;
            }
        }
        else if( driver_stm[num].state == DRVSTATE_OPEN) {
            switch( event ) {
            case DRVEVENT_RESET:
            case DRVEVENT_CLOSE:
                driver_stm[num].state = DRVSTATE_CLOSE;
                driver_stm[num].handle = HANDLE_ID_INIT;
                break;

            case DRVEVENT_OPEN:
                rtnVal = DRV_EXCLUSION_ERROR;           /* Exclusive control */
                break;

            case DRVEVENT_READ:
            case DRVEVENT_WRITE:
            case DRVEVENT_IOCTL:
            case DRVEVENT_POLL:
                if(handle != driver_stm[num].handle) {
                    rtnVal = DRV_EXCLUSION_ERROR;       /* Exclusive control */
                }
                break;

            default:
                rtnVal = DRV_EXCLUSION_ERROR;
                break;
            }
        }
        else {
            rtnVal = ERROR;
        }
    }

    return rtnVal;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?