1 
2 
3 
4 #ifndef __CH57x_USBHOST_H__
5 #define __CH57x_USBHOST_H__
6 
7 #ifdef __cplusplus
8  extern "C" {
9 #endif
10 
11 #include "CH579SFR.h"
12 #include "core_cm0.h"
13 
14 /***************************************** 不使用U盘文件系统库或者U盘挂载USBhub下面,需要关闭下面定义 */
15 #define FOR_ROOT_UDISK_ONLY
16 /***************************************** 使用U盘文件系统库,需要开启下面定义, 不使用请关闭 */
17 #define DISK_BASE_BUF_LEN       512         /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */
18 
19 
20 
21 // 各子程序返回状态码
22 #define ERR_SUCCESS         0x00    // 操作成功
23 #define ERR_USB_CONNECT     0x15    /* 检测到USB设备连接事件,已经连接 */
24 #define ERR_USB_DISCON      0x16    /* 检测到USB设备断开事件,已经断开 */
25 #define ERR_USB_BUF_OVER    0x17    /* USB传输的数据有误或者数据太多缓冲区溢出 */
26 #define ERR_USB_DISK_ERR    0x1F    /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */
27 #define ERR_USB_TRANSFER    0x20    /* NAK/STALL等更多错误码在0x20~0x2F */
28 #define ERR_USB_UNSUPPORT   0xFB    /*不支持的USB设备*/
29 #define ERR_USB_UNKNOWN     0xFE    /*设备操作出错*/
30 #define ERR_AOA_PROTOCOL    0x41    /*协议版本出错 */
31 
32 /*USB设备相关信息表,最多支持1个设备*/
33 #define ROOT_DEV_DISCONNECT  0
34 #define ROOT_DEV_CONNECTED   1
35 #define ROOT_DEV_FAILED      2
36 #define ROOT_DEV_SUCCESS     3
37 #define DEV_TYPE_KEYBOARD   ( USB_DEV_CLASS_HID | 0x20 )
38 #define DEV_TYPE_MOUSE      ( USB_DEV_CLASS_HID | 0x30 )
39 #define DEF_AOA_DEVICE       0xF0
40 #define DEV_TYPE_UNKNOW      0xFF
41 
42 
43 /*
44 约定: USB设备地址分配规则(参考USB_DEVICE_ADDR)
45 地址值  设备位置
46 0x02    内置Root-HUB下的USB设备或外部HUB
47 0x1x    内置Root-HUB下的外部HUB的端口x下的USB设备,x为1~n
48 */
49 #define HUB_MAX_PORTS           4
50 #define WAIT_USB_TOUT_200US     800   // 等待USB中断超时时间
51 
52 
53 typedef struct
54 {
55     UINT8   DeviceStatus;              // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功
56     UINT8   DeviceAddress;             // 设备被分配的USB地址
57     UINT8   DeviceSpeed;               // 0为低速,非0为全速
58     UINT8   DeviceType;                // 设备类型
59     UINT16  DeviceVID;
60     UINT16  DevicePID;
61     UINT8   GpVar[4];                    // 通用变量,存放端点
62     UINT8   GpHUBPortNum;                // 通用变量,如果是HUB,表示HUB端口数
63 } _RootHubDev;
64 
65 
66 extern _RootHubDev  ThisUsbDev;
67 extern UINT8  UsbDevEndp0Size;              // USB设备的端点0的最大包尺寸 */
68 extern UINT8  FoundNewDev;
69 
70 extern PUINT8  pHOST_RX_RAM_Addr;
71 extern PUINT8  pHOST_TX_RAM_Addr;
72 #define pSetupReq   ((PUSB_SETUP_REQ)pHOST_TX_RAM_Addr)
73 extern UINT8  Com_Buffer[];
74 
75 /* 以下为USB主机请求包 */
76 extern const UINT8  SetupGetDevDescr[];    //*获取设备描述符*/
77 extern const UINT8  SetupGetCfgDescr[];    //*获取配置描述符*/
78 extern const UINT8  SetupSetUsbAddr[];     //*设置USB地址*/
79 extern const UINT8  SetupSetUsbConfig[];   //*设置USB配置*/
80 extern const UINT8  SetupSetUsbInterface[];//*设置USB接口配置*/
81 extern const UINT8  SetupClrEndpStall[];   //*清除端点STALL*/
82 
83 
84 void  DisableRootHubPort(void)  ;                   // 关闭ROOT-HUB端口,实际上硬件已经自动关闭,此处只是清除一些结构状态
85 UINT8   AnalyzeRootHub( void ) ;         // 分析ROOT-HUB状态,处理ROOT-HUB端口的设备插拔事件
86 // 返回ERR_SUCCESS为没有情况,返回ERR_USB_CONNECT为检测到新连接,返回ERR_USB_DISCON为检测到断开
87 void    SetHostUsbAddr( UINT8 addr );                 // 设置USB主机当前操作的USB设备地址
88 void    SetUsbSpeed( UINT8 FullSpeed );               // 设置当前USB速度
89 void    ResetRootHubPort(void);                          // 检测到设备后,复位相应端口的总线,为枚举设备准备,设置为默认为全速
90 UINT8   EnableRootHubPort(void);                          // 使能ROOT-HUB端口,相应的bUH_PORT_EN置1开启端口,设备断开可能导致返回失败
91 void    SelectHubPort( UINT8 HubPortIndex );// HubPortIndex=0选择操作指定的ROOT-HUB端口,否则选择操作指定的ROOT-HUB端口的外部HUB的指定端口
92 UINT8   WaitUSB_Interrupt( void );                    // 等待USB中断
93 // 传输事务,输入目的端点地址/PID令牌,同步标志,以20uS为单位的NAK重试总时间(0则不重试,0xFFFF无限重试),返回0成功,超时/出错重试
94 UINT8   USBHostTransact( UINT8 endp_pid, UINT8 tog, UINT32 timeout );  // endp_pid: 高4位是token_pid令牌, 低4位是端点地址
95 UINT8   HostCtrlTransfer( PUINT8 DataBuf, PUINT8 RetLen );  // 执行控制传输,8字节请求码在pSetupReq中,DataBuf为可选的收发缓冲区
96 // 如果需要接收和发送数据,那么DataBuf需指向有效缓冲区用于存放后续数据,实际成功收发的总长度返回保存在ReqLen指向的字节变量中
97 
98 
99 void CopySetupReqPkg( PCCHAR pReqPkt );            // 复制控制传输的请求包
100 UINT8 CtrlGetDeviceDescr( void );                    // 获取设备描述符,返回在 pHOST_TX_RAM_Addr 中
101 UINT8 CtrlGetConfigDescr( void );                    // 获取配置描述符,返回在 pHOST_TX_RAM_Addr 中
102 UINT8 CtrlSetUsbAddress( UINT8 addr );                         // 设置USB设备地址
103 UINT8 CtrlSetUsbConfig( UINT8 cfg );                           // 设置USB设备配置
104 UINT8 CtrlClearEndpStall( UINT8 endp ) ;                       // 清除端点STALL
105 UINT8 CtrlSetUsbIntercace( UINT8 cfg );                        // 设置USB设备接口
106 
107 
108 void    USB_HostInit( void );                                  // 初始化USB主机
109 
110 
111 
112 /*************************************************************/
113 
114 
115 UINT8 InitRootDevice( void );
116 
117 UINT8   CtrlGetHIDDeviceReport( UINT8 infc );          // HID类命令,SET_IDLE和GET_REPORT
118 UINT8   CtrlGetHubDescr( void );                       // 获取HUB描述符,返回在TxBuffer中
119 UINT8   HubGetPortStatus( UINT8 HubPortIndex );        // 查询HUB端口状态,返回在TxBuffer中
120 UINT8   HubSetPortFeature( UINT8 HubPortIndex, UINT8 FeatureSelt );  // 设置HUB端口特性
121 UINT8   HubClearPortFeature( UINT8 HubPortIndex, UINT8 FeatureSelt );  // 清除HUB端口特性
122 
123 
124 
125 #ifdef __cplusplus
126 }
127 #endif
128 
129 #endif  // __CH57x_USBHOST_H__
130 
131