CH57x_usbhost.h 6.4 KB

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