📄 usbh_usbds_api.c
字号:
/*
* description: USBH USBD APIs(static)
* Maker : Toshiyuki Sakai
* Copyright : (C)2005,SEIKO EPSON Corp. All Rights Reserved.
*/
#include <SPRSTS.h>
#include <SPRDEF.h>
#include <string.h>
#include <usbh_hcd.h>
#include <usbh_usbd_api.h>
#include <usbh_usbds_api.h>
#include <usbh_stacktask.h>
/*****************************************
* Define definition
*****************************************/
#define NO_USE (0x00) /* Not used */
#define UNSET_ADDRESSNO (0) /* Device address number of unsetting */
#define PARENT_TYPE (0)
#define OTHER_TYPE (1)
#define USBH_USBD_ON (1)
#define USBH_USBD_OFF (0)
#define USBH_USBD_HOSTPORTNO (1) /* Host port number */
#define USBH_USBD_ENUME_ROOTHUB (1)
#define USBH_USBD_ENUME_DEVICE (0)
#define USBH_USBD_ADD (0)
#define USBH_USBD_DEL (1)
#define USBH_USBD_RES (2)
typedef enum tagUSBH_USBD_STATUS_CHANGE_TYPE {
USBH_USBD_STATUS_C_PORT_CONNECT, /* Status change */
USBH_USBD_STATUS_CHANGE_CONNECT, /* Connect */
USBH_USBD_STATUS_CHANGE_DISCONN, /* Cut off */
USBH_USBD_STATUS_CHANGE_RESET_HS, /* Reset ( When HS device connecting ) */
USBH_USBD_STATUS_CHANGE_RESET_FS, /* Reset ( When FS device connecting ) */
USBH_USBD_STATUS_CHANGE_RESET_LS, /* Reset ( When LS device connecting ) */
USBH_USBD_STATUS_CHANGE_SUSPEND, /* Suspend */
USBH_USBD_STATUS_CHANGE_RESUME, /* Resume */
USBH_USBD_STATUS_CHANGE_VBUSERRCON, /* VBUS Over Current occuring */
USBH_USBD_STATUS_CHANGE_VBUSERRREC, /* VBUS Over Current comeback */
USBH_USBD_STATUS_CHANGE_ENABLE, /* Port error */
USBH_USBD_STATUS_OTHER /* Nothing correspond */
} USBH_USBD_STATUS_CHANGE_TYPE ;
#define GETDESCRIPTER_DEFSIZE (0xFF) /* Default size used for GetDescripter */
#define CHANGE_STATUS_DATASIZE (0x01) /* Data size of interrupt IN of hub */
#define DEF_DEVAD0 (0) /* Default device address ( device address for recognition ) */
#define REQTYPE_PS (0) /* Port status request */
#define REQTYPE_OT (1) /* Other requests */
/* bMaxPacketSize0 of standard descriptor when device connecting */
#define ENUM_MAXPKTSIZE_HIGH (0x40) /* High-Speed */
#define ENUM_MAXPKTSIZE_FULL (0x10) /* Full-Speed */
#define ENUM_MAXPKTSIZE_LOW (0x08) /* Low-Speed */
/*****************************************
* Structure definition
*****************************************/
/*--------------------------------------------------------------------------
* Descriptor information format
*/
typedef struct tagUSBH_USBD_GetStatus_request {
UCHAR wPortStatus[2]; /* wPortStatus */
UCHAR wPortChange[2]; /* wPortChanege */
} USBH_USBD_GetStatus_REQUEST;
/*****************************************
* Function prototype declaration
*****************************************/
STATIC_T USBH_USBD_IFTBL * AllocInterface(void);
STATIC_T USBH_USBD_EPTBL * AllocEndpoint(void);
STATIC_T long FreeInterface(USBH_USBD_IFTBL *IfTbl);
STATIC_T long FreeEndpoint(USBH_USBD_EPTBL *EpTbl);
STATIC_T void FreeDescripterInfo(USBH_USBD_IFTBL *InterTbl);
STATIC_T USBH_USBD_DEVLIST_HEAD * USBH_USBDS_AddListDev( void );
STATIC_T long USBH_USBDS_DelListDev( USBH_USBD_USBDEV *wUsbDevL );
USBH_USBD_USBDEV * USBH_USBDS_SearchDev(UCHAR devaddr, long *retValue);
STATIC_T USBH_USBD_DEVLIST_HEAD * USBH_USBDS_SearchDevList( USBH_USBD_USBDEV *wUsbDev );
STATIC_T USBH_USBD_URB * USBH_USBDS_AddURBList( void );
STATIC_T long USBH_USBDS_DelListURB(USBH_USBD_URB *psURB);
STATIC_T void USBH_USBDS_HCDCallbackProc ( unsigned long message, unsigned long param0, void* vpParam ) ;
STATIC_T long USBH_USBDS_RootHubActive( void );
STATIC_T void USBH_USBDS_ALLEndpointDisable( USBH_HCD_USBDEV *tmpDevInfo, USBH_USBD_DEVLIST_HEAD *tmpDevHead, UCHAR type);
STATIC_T void USBH_USBDS_DelALLDev(USBH_USBD_USBDEV *psCurUSBDev);
STATIC_T void USBH_USBDS_DeviceCallbackProc( USBH_USBD_URB *psURB );
STATIC_T long USBH_USBDS_DeviceEnumeration(UCHAR type, USBH_USBD_DEVLIST_HEAD *wUsbDev, UCHAR hub);
STATIC_T void USBH_USBDS_RequestSet( USHORT StatusType, UCHAR Mode, USBH_USBD_URB *cbURB );
STATIC_T void USBH_USBDS_ChangeStatusCallbackProc(USBH_USBD_URB *cbURB);
STATIC_T void USBH_USBDS_GetStatusCallbackProc( USBH_USBD_URB *cbURB );
STATIC_T void USBH_USBDS_SubmitURBCallbackProc(USBH_USBD_URB *cbURB);
STATIC_T void USBH_USBDS_PortResetCallbackProc( USBH_USBD_URB *cbURB);
STATIC_T void USBH_USBDS_PortSuspendCallbackProc(USBH_USBD_URB *cbURB);
STATIC_T void USBH_USBDS_PortResumeCallbackProc(USBH_USBD_URB *cbURB);
STATIC_T USHORT USBH_USBDS_GetPortStatus(USHORT wPortStatus, USHORT wPortChange);
Inline void USBH_USBDS_ExecCallback(USBH_USBD_CALLBACK pfnFunc, ULONG param0, ULONG param1, void *pParam);
STATIC_T long AnalizeDescriptor(UCHAR dtype, UCHAR *data, USBH_USBD_DEVCTL *desc, UCHAR read_head);
STATIC_T USBH_USBD_DEVLIST_HEAD * SeachDevAddrIDToDevice(UCHAR classid, UCHAR devaddr, long *retValue, UCHAR *bConfigurationValue);
STATIC_T USBH_USBD_USBDEV * USBH_USBDS_SearchDevFromClassID(UCHAR classid);
STATIC_T long SetMaxPacketSizeToDevice(USBH_USBD_DEVLIST_HEAD *UsbDevList);
STATIC_T void USBH_USBDS_SetConfigurationCallbackProc( USBH_USBD_URB *cbURB );
STATIC_T long USBH_USBDS_SearchIdentityClass(UCHAR classNo);
/*****************************************
* Macro definition
*****************************************/
#define USBH_USBDS_SetTranPara(urb, flg, buff, length, complete) \
urb->transFlag = (USHORT) flg;\
urb->pTransBuf = buff;\
urb->transBufLength = length;\
urb->pfnComplete = complete;
/*****************************************
* Variable definition
*****************************************/
static UCHAR SavhubStat, DelhubStat;
USBH_USBD_DEVLIST_HEAD RootHubDev; /* Root hub */
USBH_USBD_URB_TBL UrbListTbl[USBH_USBD_URB_MAX];
#ifndef TST_MODE
static USBH_USBD_URB *wURB ;
static USBH_USBD_DEVLIST_HEAD *UsbDevInfo; /* Connected device information */
static UCHAR USBH_USBD_Mode;
static USBH_USBD_DEVINFO DeviceCtlTbl;
static USHORT connectWaitCount;
static SETUP_REQUEST setupDataTbl[USBH_USBD_URB_MAX];
static UCHAR portPowerNum, portPowerDo, hubStart;
static UCHAR usbdInitialize; /* 0: besides USBD on initialization, 1: USBD on initialization */
/* Class driver information */
static USBH_USBD_ClssDriverINFO ClassINFO[USBH_USBD_CLASSDRIVERNUM] ; /* Class driver information table */
static UCHAR ClassINFONum; /* Number of class drivers */
/* Device table */
static UCHAR GDdata[GETDESCRIPTER_DEFSIZE];
static USBH_USBD_DEVLIST_TBL DeviceListTbl[USBH_USBD_DEVICE_MAX]; /* 0: default address, 1: root hub, 2-- : common device */
static USBH_USBD_IF_CTBL IfListTbl[USBH_USBD_IF_CTBL_MAX];
static USBH_USBD_EP_CTBL EpListTbl[USBH_USBD_EP_CTBL_MAX];
/* API call back information */
static USBH_USBD_API_STATE pfnInit;
static USBH_USBD_API_STATE pfnEntryClass;
static USBH_USBD_API_STATE pfnSubmitURB;
static USBH_USBD_API_STATE pfnSetConfiguration;
static USBH_USBD_API_STATE pfnUnlinkURB;
static USBH_USBD_API_STATE pfnPortSuspend;
static USBH_USBD_API_STATE pfnPortResume;
static USBH_USBD_API_STATE pfnReset;
#else
USBH_USBD_URB *wURB ;
USBH_USBD_DEVLIST_HEAD *UsbDevInfo; /* Connected device information */
UCHAR USBH_USBD_Mode;
USBH_USBD_DEVINFO DeviceCtlTbl;
USHORT connectWaitCount;
SETUP_REQUEST setupDataTbl[USBH_USBD_URB_MAX];
UCHAR portPowerNum, portPowerDo, hubStart;
UCHAR usbdInitialize; /* 0: besides USBD on initialization, 1: USBD on initialization */
/* Class driver information */
USBH_USBD_ClssDriverINFO ClassINFO[USBH_USBD_CLASSDRIVERNUM] ; /* Class driver information table */
UCHAR ClassINFONum; /* Number of class drivers */
/* Device table */
UCHAR GDdata[GETDESCRIPTER_DEFSIZE];
USBH_USBD_DEVLIST_TBL DeviceListTbl[USBH_USBD_DEVICE_MAX]; /* 0: default address, 1: root hub, 2-- : common device */
USBH_USBD_IF_CTBL IfListTbl[USBH_USBD_IF_CTBL_MAX];
USBH_USBD_EP_CTBL EpListTbl[USBH_USBD_EP_CTBL_MAX];
/* API call back information */
USBH_USBD_API_STATE pfnInit;
USBH_USBD_API_STATE pfnEntryClass;
USBH_USBD_API_STATE pfnSubmitURB;
USBH_USBD_API_STATE pfnSetConfiguration;
USBH_USBD_API_STATE pfnUnlinkURB;
USBH_USBD_API_STATE pfnPortSuspend;
USBH_USBD_API_STATE pfnPortResume;
USBH_USBD_API_STATE pfnReset;
#endif
const UCHAR bmReqTypeTbl[]= {
0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x81,0x01,0x00,0xA0,0xA3,0x20,0x23,0x20,0x23,0xA0,0x23,0x23,0xA3,0x23,0x21,0xA1};
const UCHAR bReqTbl[]= {
0x00,0x01,0x03,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x00,0x00,0x01,0x01,0x03,0x03,0x06,0x08,0x09,0x0A,0x0B,0xFF,0xFE};
/*=============================================================================================
// Function_Name: AllocInterface
//
// description : Secure interface descriptor table area.
//
// argument : void
//
// return : USBH_USBD_IFTBL * Secured area ( out )
===============================================================================================*/
STATIC_T USBH_USBD_IFTBL * AllocInterface(void)
{
UCHAR i;
USBH_USBD_IFTBL *iftbl=NULL;
for(i=0; i<USBH_USBD_IF_CTBL_MAX; i++) {
if(IfListTbl[i].Enable == USBD_DISABLE) {
iftbl = &IfListTbl[i].IfList;
IfListTbl[i].Enable = USBD_ENABLE;
break;
}
}
return iftbl;
}
/*=============================================================================================
// Function_Name: AllocEndpoint
//
// description : Secure endpoint descriptor table area.
//
// argument : void
//
// return : USBH_USBD_EPTBL * Secured area ( out )
===============================================================================================*/
STATIC_T USBH_USBD_EPTBL * AllocEndpoint(void)
{
UCHAR i;
USBH_USBD_EPTBL *EpTbl=NULL;
for(i=0; i<USBH_USBD_EP_CTBL_MAX; i++) {
if(EpListTbl[i].Enable == USBD_DISABLE) {
EpTbl = &EpListTbl[i].EpList;
EpListTbl[i].Enable = USBD_ENABLE;
break;
}
}
return EpTbl;
}
/*=============================================================================================
// Function_Name: FreeInterface
//
// description : Free interface descriptor table area.
//
// argument : USBH_USBD_IFTBL * Secured area ( in )
//
// return : USBH_USBD_STATUS_SUCCESS Freeing finish normally
// : USBH_USBD_STATUS_UNSUCCESSFUL Table to be freed is already freed
===============================================================================================*/
STATIC_T long FreeInterface(USBH_USBD_IFTBL *IfTbl)
{
UCHAR i;
long ret;
ret = USBH_USBD_STATUS_UNSUCCESSFUL;
for(i=0; i<USBH_USBD_IF_CTBL_MAX; i++) {
if(IfListTbl[i].Enable == USBD_ENABLE) {
if(IfTbl == &IfListTbl[i].IfList) {
memset(&IfListTbl[i].IfList, 0, sizeof(USBH_USBD_IFTBL));
IfTbl = NULL;
IfListTbl[i].Enable = USBD_DISABLE;
ret = USBH_USBD_STATUS_SUCCESS;
break;
}
}
}
return ret;
}
/*=============================================================================================
// Function_Name: FreeEndpoint
//
// description : Free endpoint descriptor table area.
//
// argument : USBH_USBD_EPTBL * Secured area ( in )
//
// return : USBH_USBD_STATUS_SUCCESS Freeing finish normally
// : USBH_USBD_STATUS_UNSUCCESSFUL Table to be freed is already freed
===============================================================================================*/
STATIC_T long FreeEndpoint(USBH_USBD_EPTBL *EpTbl)
{
UCHAR i;
long ret;
ret = USBH_USBD_STATUS_UNSUCCESSFUL;
for(i=0; i<USBH_USBD_EP_CTBL_MAX; i++) {
if(EpListTbl[i].Enable == USBD_ENABLE) {
if(EpTbl == &EpListTbl[i].EpList) {
memset(&EpListTbl[i].EpList, 0, sizeof(USBH_USBD_EPTBL));
EpTbl = NULL;
EpListTbl[i].Enable = USBD_DISABLE;
ret = USBH_USBD_STATUS_SUCCESS;
break;
}
}
}
return ret;
}
/*=============================================================================================
// Function_Name: FreeDescripterInfo
//
// description : Free interface descriptor table area.
//
// argument : USBH_USBD_IFTBL *InterTbl Area to be freed ( in/out )
//
// return : void
===============================================================================================*/
STATIC_T void FreeDescripterInfo(USBH_USBD_IFTBL *InterTbl)
{
USBH_USBD_IFTBL *if_tmp, *if_next;
USBH_USBD_EPTBL *ep_tmp, *ep_next;
if_tmp = InterTbl;
while(if_tmp) {
ep_tmp = if_tmp->EPTbl;
while(ep_tmp) {
ep_next = ep_tmp->Next;
FreeEndpoint(ep_tmp);
if(ep_next) {
ep_tmp = ep_next;
} else {
break;
}
}
if_next = if_tmp->Next;
FreeInterface(if_tmp);
if(if_next) {
if_tmp = if_next;
} else {
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -