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

📄 wncan.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
                                errnoSet(S_can_rtr_mode_not_supported);
                                retCode = ERROR;
                        }
                        
                        break;

                case WNCAN_CHN_INVALID:
                        pDev->pCtrl->chnMode[channelNum] = WNCAN_CHN_INVALID;
                        break;          
                        
                case WNCAN_CHN_INACTIVE:
                        pDev->pCtrl->chnMode[channelNum] = WNCAN_CHN_INACTIVE;
                        break;
                        
                default:
                        errnoSet(S_can_illegal_config);
                        retCode = ERROR;
                        break;
        }
    }
    return retCode;
}

/************************************************************************
*
* WNCAN_GetTxChannel - get a free transmit channel
*
* This function returns a free channel uniquely identified by the output 
* argument "channelNum". The mode of the assigned channel is WNCAN_CHN_TRANSMIT,
* A subsequent call to CAN_GetTxChannel() assigns the next available channel
* with a different channel number.
* The channel number remains unavailable to subsequent CAN_GetXXChannel()
* calls until a CAN_FreeChannel() call is invoked on the channel.
* CAN_FreeChannel() makes the channel available and resets the mode to
* WNCAN_CHN_INVALID. After the CAN_GetTxChannel() call, the mode of
* the channel can be changed by the CAN_SetMode(..) function call.
*
* By default, channel is disabled. User must call CAN_EnableChannel, to make the
* channel valid in hardware and enable channel interrupts
*
* RETURNS:  ERROR if no channels are available, OK otherwise.
*
* ERRNO: S_can_no_available_channels, S_can_chn_in_use
*
*/
STATUS WNCAN_GetTxChannel(struct WNCAN_Device *pDev, UCHAR *channelNum)
{
    UCHAR i;

    STATUS retCode = ERROR; /* assume failure */

    for(i = 0; i < pDev->pCtrl->numChn; i++)
    {
        if(pDev->pCtrl->chnMode[i] == WNCAN_CHN_INVALID)
        {
            if(WNCAN_SetMode(pDev,i,WNCAN_CHN_TRANSMIT) == OK)
            {
                *channelNum = i;
                retCode = OK;
                return retCode;
            }
        }

    }

    errnoSet(S_can_no_available_channels);
    return retCode;
}

/************************************************************************
* WNCAN_GetRxChannel - get a free receive channel.
*
* Gets a free receive channel uniquely identified by the output argument 
* "channelNum". The mode of the assigned channel is WNCAN_CHN_RECEIVE, 
* A subsequent call to CAN_GetRxChannel() assigns the next available receive
* channel with a different number.
* The channel number remains unavailable to subsequent CAN_GetXXChannel()
* calls until a CAN_FreeChannel() call is invoked on the channel. 
* CAN_FreeChannel() makes the channel available and resets the mode to
* WNCAN_CHN_INVALID. After the CAN_GetRxChannel() call, the mode of
* the channel can be changed by the CAN_SetMode() function call.
*
* By default, channel is disabled. User must call CAN_EnableChannel, to make the
* channel valid in hardware and enable channel interrupts
*
* RETURNS: ERROR if no channel is available, OK otherwise.
*
* ERRNO: S_can_no_available_channels
*
*/
STATUS WNCAN_GetRxChannel(struct WNCAN_Device *pDev, UCHAR *channelNum)
{
    UCHAR i;

    STATUS retCode = ERROR; /* assume failure */

    for(i = 0; i < pDev->pCtrl->numChn; i++)
    {
        if(pDev->pCtrl->chnMode[i] == WNCAN_CHN_INVALID)
        {
            if(WNCAN_SetMode(pDev,i,WNCAN_CHN_RECEIVE) == OK)
            {
                *channelNum = i;
                retCode = OK;
                return retCode;
            }
        }
    }
    errnoSet(S_can_no_available_channels);
    return retCode;
}

/************************************************************************
* WNCAN_GetRTRResponderChannel - get a free channel for programming an automatic
*                              response to an incoming remote request
*
* This function is relevant to advanced controllers only. Advanced controllers, 
* are controllers such as TouCAN whose channels have the capability in 
* hardware to both transmit and receive a message in the same channel. 
* An WNCAN_CHN_RTR_RESPONDER channel, can be programmed with data and id.
* If a matching remote request is received in the channel, the hardware will
* automatically respond with the programmed data 
*
* This function will return an error and set an error number, for simple 
* controllers such as the SJA1000. In case of simple controllers, the channels
* do not have the capability to both transmit and receive messages in the same
* channel. The channel has a fixed property of either transmitting or 
* receiving a message.  
*
* This function returns a free transmit-receive channel uniquely identified by
* the output argument "channelNum". The mode assigned to the  channel is 
* WNCAN_CHN_RTR_RESPONDER. A subsequent call to CAN_GetRTRResponderChannel()
* assigns the next available channel with a different channel number.
* The channel number remains unavailable to subsequent CAN_GetXXChannel() and 
* calls until a CAN_FreeChannel() call is invoked on the channel.
* CAN_FreeChannel() makes the channel available and resets the mode to 
* WNCAN_CHN_INVALID. After the CAN_GetRTRResponderChannel() call, the mode of
* the channel can be changed by the CAN_SetMode(..) function call.
*
* By default, channel is disabled. User must call CAN_EnableChannel, to make the
* channel valid in hardware and enable channel interrupts
*
* RETURNS:  for advanced controllers such as the TouCAN and I82527:
*           ERROR if no channels are available, OK otherwise.
*
*           for simple controllers such as the SJA1000:
*           ERROR since this mode cannot be assigned.  
*
* ERRNO:  for advanced controllers such as the TouCAN and I82527:
*         S_can_no_available_channels
*
*         for simple controllers such as the SJA1000:
*         S_can_rtr_mode_not_supported
*
*/
STATUS WNCAN_GetRTRResponderChannel(struct WNCAN_Device *pDev, UCHAR *channelNum)
{
    UCHAR i;
    BOOL notSupported = FALSE;

    for(i = 0; i < pDev->pCtrl->numChn; i++)
    {
        if(pDev->pCtrl->chnMode[i] == WNCAN_CHN_INVALID) {
            if(pDev->pCtrl->chnType[i] == WNCAN_CHN_TRANSMIT_RECEIVE) {
                pDev->pCtrl->chnMode[i] = WNCAN_CHN_RTR_RESPONDER;
                *channelNum = i;
                return OK;
            }
            else
                notSupported = TRUE;
        }
    }
    
    /* if we fall thru, channel not allocated, return
    ** appropriate error
    */
    errnoSet( (notSupported ? S_can_rtr_mode_not_supported
                            : S_can_no_available_channels) );

    return ERROR;
}

/************************************************************************
* WNCAN_GetRTRRequesterChannel - get a free channel for sending an RTR request
*                              and receiving the response in the same channel  
*
* This function is relevant to advanced controllers only. Advanced controllers, 
* are controllers such as TouCAN that, have channels with the capability in 
* hardware to both transmit and receive a message in the same channel. 
* When a remote request is sent out from a particular channel, the reply 
* will be received in the same channel. This function will return an error
* and set an error number, for simple controllers such as the SJA1000. 
* In case of simple controllers, the channels do not have the capability to
* both transmit and receive messages in the same channel. The channel has a 
* fixed property of either transmitting or receiving a message.  
*
* This function returns a free channel uniquely identified by the output argument
* "channelNum". The mode of the channel is assigned WNCAN_CHN_RTR_REQUESTER.
* A subsequent call to CAN_GetRTRRequesterChannel() assigns the next available
* channel with a different channel number.
* The channel number remains unavailable to subsequent CAN_GetXXChannel()  
* calls until a CAN_FreeChannel() call is invoked on the channel.
* CAN_FreeChannel() makes the channel available and resets the mode to 
* WNCAN_CHN_INVALID. After the CAN_GetRTRRequesterChannel() call, the mode of
* the channel can be changed by the CAN_SetMode(..) function call.
*
* By default, channel is disabled. User must call CAN_EnableChannel, to make the
* channel valid in hardware and enable channel interrupts
*
* RETURNS:  for advanced controllers such as the TouCAN and I82527:
*           ERROR if no channels are available, OK otherwise.
*
*           for simple controllers such as the SJA1000:
*           ERROR since this mode cannot be assigned.  
*
* ERRNO: for advanced controllers such as the TouCAN and I82527:
*        S_can_no_available_channels
*
*        for simple controllers such as the SJA1000:
*        S_can_rtr_mode_not_supported
*/
STATUS WNCAN_GetRTRRequesterChannel(struct WNCAN_Device *pDev, UCHAR *channelNum)
{
    UCHAR i;
    BOOL notSupported = FALSE;
    
    for(i = 0; i < pDev->pCtrl->numChn; i++)
    {
        if(pDev->pCtrl->chnMode[i] == WNCAN_CHN_INVALID) {
            if(pDev->pCtrl->chnType[i] == WNCAN_CHN_TRANSMIT_RECEIVE)
            {
                pDev->pCtrl->chnMode[i] = WNCAN_CHN_RTR_REQUESTER;
                *channelNum = i;
                return OK;
            }
            else
                notSupported = TRUE;
         }
    }
        
    /* if we fall thru, channel not allocated, return
    ** appropriate error
    */
    errnoSet( (notSupported ? S_can_rtr_mode_not_supported
                            : S_can_no_available_channels) );

    return ERROR;
}

/************************************************************************
*
* WNCAN_FreeChannel - free the channel
*
* This routine frees the channel such that a WNCAN_GetTxChannel() or
* WNCAN_GetRxChannel() call can use the channel number. The mode of the
* channel is set to WNCAN_CHN_INVALID.
*
* RETURNS: OK, or ERROR
*
* ERRNO: S_can_illegal_channel_no
*
*/
STATUS WNCAN_FreeChannel(struct WNCAN_Device *pDev, UCHAR channelNum)
{
        STATUS retCode = ERROR; /* assume failure */

      if(channelNum >= pDev->pCtrl->numChn)
      {
        errnoSet(S_can_illegal_channel_no);
        return retCode;
      }

         pDev->pCtrl->chnMode[channelNum] = WNCAN_CHN_INVALID;
         retCode =OK;

        return retCode;

}



/************************************************************************
*
* WNCAN_core_init - initialize persistent data structures
*
* This routine initializes any persistent data structures used
* by the WNCAN core library.
* It is called via component init routine and should occur
* before all other component init routines are called.

* RETURNS: none
*
*/
void wncan_core_init(void)
{
    /* initialize the global linked lists for the boards and controllers */
    BOARDLL_INIT();
    CONTROLLERLL_INIT();
}

⌨️ 快捷键说明

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