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

📄 usbh_usbds_api.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 * 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 + -