📄 usbctrltrf.c
字号:
/*********************************************************************
*
* Microchip USB C18 Firmware Version 1.0
*
*********************************************************************
* FileName: usbctrltrf.c
* Dependencies: See INCLUDES section below
* Processor: PIC18
* Compiler: C18 2.30.01+
* Company: Microchip Technology, Inc.
*
* Software License Agreement
*
* The software supplied herewith by Microchip Technology Incorporated
* (the 揅ompany? for its PICmicro?Microcontroller is intended and
* supplied to you, the Company抯 customer, for use solely and
* exclusively on Microchip PICmicro Microcontroller products. The
* software is owned by the Company and/or its supplier, and is
* protected under applicable copyright laws. All rights are reserved.
* Any use in violation of the foregoing restrictions may subject the
* user to criminal sanctions under applicable laws, as well as to
* civil liability for the breach of the terms and conditions of this
* license.
*
* THIS SOFTWARE IS PROVIDED IN AN 揂S IS?CONDITION. NO WARRANTIES,
* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
* TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
* IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
* Author Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Rawin Rojvanit 11/19/04 Original.
********************************************************************/
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "system\typedefs.h"
#include "system\usb\usb.h"
/** V A R I A B L E S ********************************************************/
#pragma udata
byte ctrl_trf_state; // Control Transfer State
byte ctrl_trf_session_owner; // Current transfer session owner
POINTER pSrc; // Data source pointer
POINTER pDst; // Data destination pointer
WORD wCount; // Data counter
/** P R I V A T E P R O T O T Y P E S ***************************************/
void USBCtrlTrfSetupHandler(void);
void USBCtrlTrfOutHandler(void);
void USBCtrlTrfInHandler(void);
/** D E C L A R A T I O N S **************************************************/
#pragma code
/******************************************************************************
* Function: void USBCtrlEPService(void)
*
* PreCondition: USTAT is loaded with a valid endpoint address.
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: USBCtrlEPService checks for three transaction types that
* it knows how to service and services them:
* 1. EP0 SETUP
* 2. EP0 OUT
* 3. EP0 IN
* It ignores all other types (i.e. EP1, EP2, etc.)
*
* Note: None
*****************************************************************************/
void USBCtrlEPService(void)
{
if(USTAT == EP00_OUT)
{
if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP
USBCtrlTrfSetupHandler();
else // EP0 OUT
USBCtrlTrfOutHandler();
}
else if(USTAT == EP00_IN) // EP0 IN
USBCtrlTrfInHandler();
}//end USBCtrlEPService
/******************************************************************************
* Function: void USBCtrlTrfSetupHandler(void)
*
* PreCondition: SetupPkt buffer is loaded with valid USB Setup Data
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: This routine is a task dispatcher and has 3 stages.
* 1. It initializes the control transfer state machine.
* 2. It calls on each of the module that may know how to
* service the Setup Request from the host.
* Module Example: USB9, HID, CDC, MSD, ...
* As new classes are added, ClassReqHandler table in
* usbdsc.c should be updated to call all available
* class handlers.
* 3. Once each of the modules has had a chance to check if
* it is responsible for servicing the request, stage 3
* then checks direction of the transfer to determine how
* to prepare EP0 for the control transfer.
* Refer to USBCtrlEPServiceComplete() for more details.
*
* Note: Microchip USB Firmware has three different states for
* the control transfer state machine:
* 1. WAIT_SETUP
* 2. CTRL_TRF_TX
* 3. CTRL_TRF_RX
* Refer to firmware manual to find out how one state
* is transitioned to another.
*
* A Control Transfer is composed of many USB transactions.
* When transferring data over multiple transactions,
* it is important to keep track of data source, data
* destination, and data count. These three parameters are
* stored in pSrc,pDst, and wCount. A flag is used to
* note if the data source is from ROM or RAM.
*
*****************************************************************************/
void USBCtrlTrfSetupHandler(void)
{
byte i;
/* Stage 1 */
ctrl_trf_state = WAIT_SETUP;
ctrl_trf_session_owner = MUID_NULL; // Set owner to NULL
wCount._word = 0;
/* Stage 2 */
USBCheckStdRequest(); // See system\usb9\usb9.c
/* Modifiable Section */
// Insert other USB Device Class Request Handlers here
/* End Modifiable Section */
/* Stage 3 */
USBCtrlEPServiceComplete();
}//end USBCtrlTrfSetupHandler
/******************************************************************************
* Function: void USBCtrlTrfOutHandler(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: This routine handles an OUT transaction according to
* which control transfer state is currently active.
*
* Note: Note that if the the control transfer was from
* host to device, the session owner should be notified
* at the end of each OUT transaction to service the
* received data.
*
*****************************************************************************/
void USBCtrlTrfOutHandler(void)
{
if(ctrl_trf_state == CTRL_TRF_RX)
{
USBCtrlTrfRxService();
/*
* Don't have to worry about overwriting _KEEP bit
* because if _KEEP was set, TRNIF would not have been
* generated in the first place.
*/
if(ep0Bo.Stat.DTS == 0)
ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN;
else
ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN;
}
else // CTRL_TRF_TX
USBPrepareForNextSetupTrf();
}//end USBCtrlTrfOutHandler
/******************************************************************************
* Function: void USBCtrlTrfInHandler(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: This routine handles an IN transaction according to
* which control transfer state is currently active.
*
*
* Note: A Set Address Request must not change the acutal address
* of the device until the completion of the control
* transfer. The end of the control transfer for Set Address
* Request is an IN transaction. Therefore it is necessary
* to service this unique situation when the condition is
* right. Macro mUSBCheckAdrPendingState is defined in
* usb9.h and its function is to specifically service this
* event.
*****************************************************************************/
void USBCtrlTrfInHandler(void)
{
mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE
if(ctrl_trf_state == CTRL_TRF_TX)
{
USBCtrlTrfTxService();
if(ep0Bi.Stat.DTS == 0)
ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN;
else
ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN;
}
else // CTRL_TRF_RX
USBPrepareForNextSetupTrf();
}//end USBCtrlTrfInHandler
/******************************************************************************
* Function: void USBCtrlTrfTxService(void)
*
* PreCondition: pSrc, wCount, and usb_stat.ctrl_trf_mem are setup properly.
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: This routine should be called from only two places.
* One from USBCtrlEPServiceComplete() and one from
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -