/* * tr_usb0_driver.c * * Created on: 2025年7月25日 * Author: Administrator */ #include #include "soc_C6748.h" // DSP C6748 外设寄存器 #include "hw_types.h" // 宏命令 #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 #include "interrupt.h" // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义 #include "delay.h" #include "usblib.h" #include "usbhost.h" #include "usbhid.h" #include "cppi41dma.h" #include "usbhspecific.h" #include "tr_timer.h" static void USBInterruptInit(void); unsigned int KeyboardCallback(void *pvCBData, unsigned int ulEvent, unsigned int ulMsgParam, void *pvMsgData); #define USB_INSTANCE 0 #define HCD_MEMORY_SIZE 128 #define KEYBOARD_MEMORY_SIZE 128 // DMA 端点数目 #define NUMBER_OF_ENDPOINTS 4 // 尝试次数 #define USBMSC_DRIVE_RETRY 4 unsigned char g_pHCDPool[HCD_MEMORY_SIZE]; unsigned char g_pucBuffer[KEYBOARD_MEMORY_SIZE]; // 默认超时时间 tUSBHTimeOut *USBHTimeOut = NULL; endpointInfo epInfo[]= { { USB_EP_TO_INDEX(USB_EP_1), CPDMA_DIR_RX, CPDMA_MODE_SET_TRANSPARENT, }, { USB_EP_TO_INDEX(USB_EP_1), CPDMA_DIR_TX, CPDMA_MODE_SET_GRNDIS, }, { USB_EP_TO_INDEX(USB_EP_2), CPDMA_DIR_RX, CPDMA_MODE_SET_TRANSPARENT, }, { USB_EP_TO_INDEX(USB_EP_2), CPDMA_DIR_TX, CPDMA_MODE_SET_GRNDIS, } }; enum { STATE_NO_DEVICE, STATE_KEYBOARD_INIT, STATE_KEYBOARD_CONNECTED, STATE_KEYBOARD_UPDATE, STATE_UNKNOWN_DEVICE, STATE_POWER_FAULT } g_eUSBState; DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = { &g_USBSPECIFICClassDriver ,&g_sUSBEventDriver }; static const unsigned int g_ulNumHostClassDrivers = sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); // USB 设备实例 static unsigned int g_ulDeviceInstance; void Usb0HostInit(void) { // 使能 USB 模块 // 对相应外设模块的使能也可以在 BootLoader 中完成 PSCModuleControl(SOC_PSC_1_REGS,HW_PSC_USB0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); // 使能 USB PHY // 详情参阅 TMS320C6748 DSP Technical Reference Manual // 273-274页 Chip Configuration 2 Register (CFGCHIP2) Field Descriptions // 强制作为主设备(HOST) HWREG(SOC_USB_0_PHY_REGS) = 0x29F2; USBInterruptInit(); DelayTimerSetup(); // 注册主机类驱动程序 USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ulNumHostClassDrivers); // 初始化电源配置 USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH); // 初始化 HOST 控制器 USBHCDInit(USB_INSTANCE, g_pHCDPool, HCD_MEMORY_SIZE); //调用主机控制驱动主循环 USBHCDMain (USB_INSTANCE, g_ulDeviceInstance); } unsigned char DataBuffer[64] = {31, 32, 33, 34, 35}; void Usb0HostMain(void) { // 调用主机控制驱动主循环 USBHCDMain (USB_INSTANCE, g_ulDeviceInstance); // 每1ms请求一次usb数据 static struct TimerStruct timer = {0, 0}; if(GetPassedTime(&timer) >= 1){ ClearTimer(&timer); if(g_SPECIFICInstance.isConnected) { unsigned int size = USBHCDPipeSchedule(0, g_SPECIFICInstance.ulBulkInPipe, DataBuffer, 64); } } } static void USBInterruptInit(void) { IntRegister(C674X_MASK_INT9, USB0HostIntHandler); IntEventMap(C674X_MASK_INT9, SYS_INT_USB0); IntEnable(C674X_MASK_INT9); } /****************************************************************************/ /* */ /* USB HOST 返回函数 */ /* */ /****************************************************************************/ void USBHCDEvents(void *pvData) { tEventInfo *pEventInfo; pEventInfo = (tEventInfo *)pvData; printf("USBHCDEvents......\r\n"); switch(pEventInfo->ulEvent) { case USB_EVENT_CONNECTED: { g_eUSBState = STATE_UNKNOWN_DEVICE; printf("connect......\r\n"); break; } case USB_EVENT_DISCONNECTED: { g_eUSBState = STATE_NO_DEVICE; printf("disconnect......\r\n"); break; } case USB_EVENT_POWER_FAULT: { g_eUSBState = STATE_POWER_FAULT; printf("error......\r\n"); break; } default: { break; } } }