tr_usb0_host_driver.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * tr_usb0_driver.c
  3. *
  4. * Created on: 2025年7月25日
  5. * Author: Administrator
  6. */
  7. #include <stdio.h>
  8. #include "soc_C6748.h" // DSP C6748 外设寄存器
  9. #include "hw_types.h" // 宏命令
  10. #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
  11. #include "interrupt.h" // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
  12. #include "delay.h"
  13. #include "usblib.h"
  14. #include "usbhost.h"
  15. #include "usbhid.h"
  16. #include "usbhhidkeyboard.h"
  17. #include "grlib.h"
  18. #include "cppi41dma.h"
  19. #include "usbhspecific.h"
  20. #include "tr_timer.h"
  21. static void USBInterruptInit(void);
  22. unsigned int KeyboardCallback(void *pvCBData, unsigned int ulEvent,
  23. unsigned int ulMsgParam, void *pvMsgData);
  24. #define USB_INSTANCE 0
  25. #define HCD_MEMORY_SIZE 128
  26. #define KEYBOARD_MEMORY_SIZE 128
  27. // DMA 端点数目
  28. #define NUMBER_OF_ENDPOINTS 4
  29. // 尝试次数
  30. #define USBMSC_DRIVE_RETRY 4
  31. unsigned char g_pHCDPool[HCD_MEMORY_SIZE];
  32. unsigned char g_pucBuffer[KEYBOARD_MEMORY_SIZE];
  33. // 默认超时时间
  34. tUSBHTimeOut *USBHTimeOut = NULL;
  35. endpointInfo epInfo[]=
  36. {
  37. {
  38. USB_EP_TO_INDEX(USB_EP_1),
  39. CPDMA_DIR_RX,
  40. CPDMA_MODE_SET_TRANSPARENT,
  41. },
  42. {
  43. USB_EP_TO_INDEX(USB_EP_1),
  44. CPDMA_DIR_TX,
  45. CPDMA_MODE_SET_GRNDIS,
  46. },
  47. {
  48. USB_EP_TO_INDEX(USB_EP_2),
  49. CPDMA_DIR_RX,
  50. CPDMA_MODE_SET_TRANSPARENT,
  51. },
  52. {
  53. USB_EP_TO_INDEX(USB_EP_2),
  54. CPDMA_DIR_TX,
  55. CPDMA_MODE_SET_GRNDIS,
  56. }
  57. };
  58. enum
  59. {
  60. STATE_NO_DEVICE,
  61. STATE_KEYBOARD_INIT,
  62. STATE_KEYBOARD_CONNECTED,
  63. STATE_KEYBOARD_UPDATE,
  64. STATE_UNKNOWN_DEVICE,
  65. STATE_POWER_FAULT
  66. }
  67. g_eUSBState;
  68. DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents);
  69. static tUSBHostClassDriver const * const g_ppHostClassDrivers[] =
  70. {
  71. &g_USBSPECIFICClassDriver
  72. ,&g_sUSBEventDriver
  73. };
  74. static const unsigned int g_ulNumHostClassDrivers =
  75. sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *);
  76. // USB 设备实例
  77. static unsigned int g_ulDeviceInstance;
  78. void Usb0HostInit(void)
  79. {
  80. // 使能 USB 模块
  81. // 对相应外设模块的使能也可以在 BootLoader 中完成
  82. PSCModuleControl(SOC_PSC_1_REGS,HW_PSC_USB0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  83. // 使能 USB PHY
  84. // 详情参阅 TMS320C6748 DSP Technical Reference Manual
  85. // 273-274页 Chip Configuration 2 Register (CFGCHIP2) Field Descriptions
  86. // 强制作为主设备(HOST)
  87. HWREG(SOC_USB_0_PHY_REGS) = 0x29F2;
  88. USBInterruptInit();
  89. DelayTimerSetup();
  90. // 注册主机类驱动程序
  91. USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ulNumHostClassDrivers);
  92. // 初始化电源配置
  93. USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH);
  94. // 初始化 HOST 控制器
  95. USBHCDInit(USB_INSTANCE, g_pHCDPool, HCD_MEMORY_SIZE);
  96. //调用主机控制驱动主循环
  97. USBHCDMain (USB_INSTANCE, g_ulDeviceInstance);
  98. }
  99. unsigned char DataBuffer[64] = {31, 32, 33, 34, 35};
  100. void Usb0HostMain(void)
  101. {
  102. // 调用主机控制驱动主循环
  103. USBHCDMain (USB_INSTANCE, g_ulDeviceInstance);
  104. // 每1ms请求一次usb数据
  105. static struct TimerStruct timer = {0, 0};
  106. if(GetPassedTime(&timer) >= 1000){
  107. ClearTimer(&timer);
  108. // printf("main_timer......\r\n");
  109. // unsigned int size = USBHCDPipeWrite(0, 2162688, DataBuffer, 64);
  110. if(g_SPECIFICInstance.isConnected)
  111. {
  112. unsigned int size = USBHCDPipeSchedule(0, g_SPECIFICInstance.ulBulkInPipe, DataBuffer, 64);
  113. }
  114. }
  115. }
  116. static void USBInterruptInit(void)
  117. {
  118. IntRegister(C674X_MASK_INT9, USB0HostIntHandler);
  119. IntEventMap(C674X_MASK_INT9, SYS_INT_USB0);
  120. IntEnable(C674X_MASK_INT9);
  121. }
  122. /****************************************************************************/
  123. /* */
  124. /* USB HOST 返回函数 */
  125. /* */
  126. /****************************************************************************/
  127. void USBHCDEvents(void *pvData)
  128. {
  129. tEventInfo *pEventInfo;
  130. pEventInfo = (tEventInfo *)pvData;
  131. printf("USBHCDEvents......\r\n");
  132. switch(pEventInfo->ulEvent)
  133. {
  134. case USB_EVENT_CONNECTED:
  135. {
  136. g_eUSBState = STATE_UNKNOWN_DEVICE;
  137. printf("connect......\r\n");
  138. break;
  139. }
  140. case USB_EVENT_DISCONNECTED:
  141. {
  142. g_eUSBState = STATE_NO_DEVICE;
  143. printf("disconnect......\r\n");
  144. break;
  145. }
  146. case USB_EVENT_POWER_FAULT:
  147. {
  148. g_eUSBState = STATE_POWER_FAULT;
  149. printf("error......\r\n");
  150. break;
  151. }
  152. default:
  153. {
  154. break;
  155. }
  156. }
  157. }