185 lines
4.0 KiB
C
185 lines
4.0 KiB
C
/********************************************************************************
|
||
* 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;
|
||
}
|
||
|