⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msmcan.c

📁 美国wind river 公司的CAN总线源代码
💻 C
字号:
/* msmcan.c - implementation of Board Interface for MSM CAN PC104 *//* Copyright 2001 Wind River Systems, Inc. *//* modification history --------------------14dec01,dnb written*//* DESCRIPTIONThis file contains the functions that provide a board-level interfaceto the MSM CAN PC104 card.*//* includes */#include <vxWorks.h>#include <errnoLib.h>#include <intLib.h>#include <iv.h>#include <sysLib.h>#include <string.h> /* for strtok_r */#include <CAN/wnCAN.h>#include <CAN/canController.h>#include <CAN/canBoard.h>#include <CAN/i82527.h>#include <CAN/private/msmcan.h>#if (CPU != SH7750)static const char deviceName[] ="MSMCAN PC104";struct MSMCAN_PC104_DeviceEntry *msmcan_pc104_DeviceArray;UINT max_msmcan_pc104_boards;/* external reference */STATUS CAN_DEVICE_establishLinks(WNCAN_DEVICE *pDev, WNCAN_BoardType brdType,                      WNCAN_ControllerType ctrlType);/************************************************************************** msmcan_pc104_isr - board-level isr*** RETURNS: N/A*   * ERRNO: N/A**/    static void msmcan_pc104_isr(    ULONG param){    struct MSMCAN_PC104_DeviceEntry *pDE;    pDE = (struct MSMCAN_PC104_DeviceEntry *)param;    if(pDE->allocated)    {        i82527ISR((ULONG)&pDE->canDevice);    }    return;}  /************************************************************************** msmcan_pc104_enableIrq - enable irq on board*** RETURNS: N/A*   * ERRNO: N/A**/static void msmcan_pc104_enableIrq(    struct WNCAN_Device *pDev){     return;}/************************************************************************** msmcan_pc104_disableIrq - disable irq on board*** RETURNS: N/A*   * ERRNO: N/A**/static void msmcan_pc104_disableIrq(    struct WNCAN_Device *pDev){     return;}/************************************************************************** msmcan_pc104_200_new - install driver for pc104 board*** RETURNS: OK or ERROR*   * ERRNO: N/A**/STATUS msmcan_pc104_new(    ULONG ioAddress,    UINT irq){    UINT          i;	UINT          brdNdx=0xff;    int           oldLevel;    STATUS        retCode;    VOIDFUNCPTR*  irqVec = 0;    struct  WNCAN_Device *pDev;    struct  MSMCAN_PC104_DeviceEntry *pDeviceEntry;    retCode = ERROR;      /* pessimistic */    pDeviceEntry = 0;    /* find a free device data structure */    for(i = 0 ; i < max_msmcan_pc104_boards; i++)    {        if(msmcan_pc104_DeviceArray[i].inUse == 0)        {            msmcan_pc104_DeviceArray[i].inUse = 1;            pDeviceEntry = &msmcan_pc104_DeviceArray[i];			brdNdx = i;            break;        }                }    if(!pDeviceEntry)    {        errnoSet(S_can_out_of_memory);        goto exit;    }    /* setup data structures */    pDev        = &pDeviceEntry->canDevice;    pDev->pCtrl = &pDeviceEntry->canController;    pDev->pBrd  =  &pDeviceEntry->canBoard;    pDev->deviceName = deviceName;    pDev->pBrd->irq = irq;    pDev->pBrd->ioAddress = ioAddress;    pDev->pBrd->xtalFreq = _16MHZ;	/* set default baud rate to 250 Kbits/sec */	pDev->pCtrl->brp = 1;       	pDev->pCtrl->sjw = 0;  	pDev->pCtrl->tseg1 = 0xc;	pDev->pCtrl->tseg2 = 0x1;	pDev->pCtrl->samples = 0;    pDev->pCtrl->chnType = g_i82527chnType;    pDev->pCtrl->chnMode = &pDeviceEntry->i82527chnMode[0];    pDev->pCtrl->numChn  = I82527_MAX_MSG_OBJ;	pDev->pCtrl->csData  = &pDeviceEntry->can82527;    if(CAN_DEVICE_establishLinks(pDev, WNCAN_MSMCAN, WNCAN_I82527) == ERROR)    {        pDev = 0;                    goto exit;    }    pDev->deviceId = brdNdx; /* index into deviceEntry array */        /* connect to isr */    oldLevel = intLock();    #if CPU_FAMILY == I80X86        irqVec = INUM_TO_IVEC(irq+0x20);    #elif CPU_FAMILY == PPC        irqVec = INUM_TO_IVEC(irq+0x40);    #else        #warning irqVec not defined     #endif    intConnect(irqVec,msmcan_pc104_isr, (ULONG)pDeviceEntry);            /* activate interrupt at board and cpu level */    #if (CPU_FAMILY == I80X86)        sysIntEnablePIC(pDev->pBrd->irq);    #elif CPU_FAMILY == PPC        intEnable(pDev->pBrd->irq+0x40);    #else        #warning interrupts cannot be enabled    #endif    intUnlock(oldLevel);        pDeviceEntry->ioAddress = ioAddress;    pDeviceEntry->irq       = irq;    retCode = OK;    exit:    return retCode;}/************************************************************************** msmcan_pc104_canInByte*** RETURNS: *   * ERRNO: **/static UCHAR msmcan_pc104_canInByte(    struct WNCAN_Device *pDev,    unsigned int offset){    sysOutByte(pDev->pBrd->ioAddress + 1,offset);    return sysInByte(pDev->pBrd->ioAddress);}/************************************************************************** msmcan_pc104_canOutByte*** RETURNS: *   * ERRNO: **/static void msmcan_pc104_canOutByte(    struct WNCAN_Device *pDev,    unsigned int offset,    UCHAR value){    sysOutByte(pDev->pBrd->ioAddress + 1,offset);    sysOutByte(pDev->pBrd->ioAddress, value);}/************************************************************************** msmcan_pc104_establishLinks - set up function pointers*** RETURNS: OK always*   * ERRNO: N/A**/STATUS msmcan_pc104_establishLinks(struct WNCAN_Device *pDev){    pDev->pBrd->onEnterISR = 0;    pDev->pBrd->onLeaveISR = 0;    pDev->pBrd->enableIrq  = msmcan_pc104_enableIrq;    pDev->pBrd->disableIrq = msmcan_pc104_disableIrq;    pDev->pBrd->canInByte = msmcan_pc104_canInByte;    pDev->pBrd->canOutByte = msmcan_pc104_canOutByte;    return OK;}/************************************************************************** msmcan_pc104_open - open a CAN device** RETURNS: pointer to a WNCAN_Device structure or 0 if error*   * ERRNO: S_can_illegal_board_no*        S_can_illegal_ctrl_no*        S_can_busy**/struct WNCAN_Device *msmcan_pc104_open(UINT brdNdx){    struct WNCAN_Device *pRet = 0;   /* pessimistic */        if((brdNdx >= max_msmcan_pc104_boards) ||       (msmcan_pc104_DeviceArray[brdNdx].inUse == 0))    {        errnoSet(S_can_illegal_board_no);    }    else if(msmcan_pc104_DeviceArray[brdNdx].allocated == 1)    {        errnoSet(S_can_busy);    }    else    {        msmcan_pc104_DeviceArray[brdNdx].allocated = 1;        pRet = &msmcan_pc104_DeviceArray[brdNdx].canDevice;    }    return pRet;}/************************************************************************** msmcan_pc104_close - close the specified CAN device** RETURNS: N/A*   * ERRNO: N/A**/void msmcan_pc104_close(struct WNCAN_Device *pDev){    UINT   brdNdx;        if (pDev != 0)    {		brdNdx = pDev->deviceId;        msmcan_pc104_DeviceArray[brdNdx].allocated = 0;    }    return;}#endif

⌨️ 快捷键说明

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