TMC32_QJB/USB/USB_main.c

185 lines
4.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* 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;
}