/******************************************************************************** * Copyright (c) 2012, Beijing Tongfang Microelectroics Co., Ltd. * All rights reserved. * Module: USB * Author: Yang Song * Version: V1.0 * History: * 2012-09-24 Original version ********************************************************************************/ #include "global.h" u8 g_bUsbDevType; //由于需要支持,不同的设备类型,上电需要根据配置选择一个类型 例如 USBDEVTYPE_VSP /*************************************************************************** * Function: usbReqHandle * Description: USB standard request process * Input: NULL * Output: NULL * Return: NULL * Other: NULL **************************************************************************/ void usbReqHandle(void) { if(st_usbDeviceRequest.bStdRqstFlag) // Standard { usbStdReq[st_usbDeviceRequest.bRequest](); st_usbDeviceRequest.bStdRqstFlag = 0; } else if(st_usbDeviceRequest.bClsRqstFlag) // Class { if ((g_bUsbDevType == USBDEVTYPE_HIDPOS) || (g_bUsbDevType == USBDEVTYPE_HIDKBD)) { hidReportRequest(st_usbDeviceRequest.bRequest); } else if(g_bUsbDevType == USBDEVTYPE_VSP) { vspClassRequest(st_usbDeviceRequest.bRequest); } st_usbDeviceRequest.bClsRqstFlag = 0; } } /*************************************************************************** * Function: AppUSBSendData * Description: usb数据发送 * Input: buf 待发送数据地址 * Input: len 待发送数据长度 * Output: NULL * Return: NULL * Other: NULL **************************************************************************/ void AppUSBSendData(u8* buf, u32 len) { uint8_t flag = 0; uint8_t numssendflag = FALSE; if (len == 0) { return; } if(g_bUsbDevType == USBDEVTYPE_HIDPOS) { //check if suspend TimerHSIClockCount(TIM3, START_TIMER); while(1) { if((USBPHYDAT&0x03) != 0x01) { flag = 1; break; } if(TimerHSIClockCount(TIM3, GET_TIMER) > 36000) //3ms { break; } } TimerHSIClockCount(TIM3, STOP_TIMER); if(flag == 0) { USBDCON |= Bit28_En; TimerDelay(TIM2, 15); //ms USBDCON &= Bit28_Dis; } usbHidPosSendChars(buf, len); } else if(g_bUsbDevType == USBDEVTYPE_HIDKBD) { //check if suspend TimerHSIClockCount(TIM3, START_TIMER); while(1) { if((USBPHYDAT&0x03) != 0x01) { flag = 1; break; } if(TimerHSIClockCount(TIM3, GET_TIMER) > 36000) //3ms { break; } } TimerHSIClockCount(TIM3, STOP_TIMER); if(flag == 0) { USBDCON |= Bit28_En; TimerDelay(TIM2, 15); //ms USBDCON &= Bit28_Dis; } switch(gConfgBuf.outputCodeType) { case GBK: //防止没有打开小键盘产生影响 if(g_bNumLock == NUMLOCKOFF) { SendNumLock(); numssendflag = TRUE; } usbHidKbdSendCharsGBK(buf, len); if(numssendflag) { SendNumLock(); } break; case UNICODE: usbHidKbdSendCharsUNICODE(buf, len); break; case UTF8: usbHidKbdSendCharsUTF8(buf, len); break; default: usbHidKbdSendCharsGBK(buf, len); break; } //usbHidKbdSendChars(buf, len); } else if(g_bUsbDevType == USBDEVTYPE_VSP) { usbVspSendChars(buf, len); } // usbVspSendChars(buf, len); } /*************************************************************************** * Function: AppUSBReceiveData * Description: usb Init * Input: 把收到的数据拷贝到buf * Input: bufSize buf的大小,防止越界 * Output: 收到的数据长度 * Return: NULL * Other: NULL **************************************************************************/ u32 AppUSBReceiveData(u8 *buf, u32 bufSize) { u32 len = 0; if(g_bUsbDevType == USBDEVTYPE_HIDPOS) { len = usbHidPosRecvChars(buf, bufSize); } else if(g_bUsbDevType == USBDEVTYPE_HIDKBD) { //keyboard 目前没有接收 } else if(g_bUsbDevType == USBDEVTYPE_VSP) { len = usbVspRecvChars(buf, bufSize); } // len = usbVspRecvChars(buf, bufSize); return len; }