📄 usbtest.c
字号:
#include "system.h"
#include "typedef.h"
#include "usbtest.h"
#include "d12interface.h"
#include <string.h>
#include "lcd.h"
#include "usb.h"
#include "mmc.h"
extern EPPFLAGS bEppflags;
extern char Found; //在目录中找到的文件或目录个数
extern FILESTRUCT File[];//保存查找到的文件或目录信息
extern FILESTRUCT CurF; //存放当前目录
extern MMCDataBuf[512];
extern MMCUSBBuf[513];
extern char PATH[40];
extern char DEPTH;
//定时器3计数值,20ms
#define T3L_VAL 0x00
#define T3H_VAL 0x70
bool bTruncated = false; //set it true if command was truncated
//CMD_HEADER CmdHeader;
u16 wCount = 0;
USBTEST1_DATA usbtest1={0, 0, 0, 1, 1, 0, 0, 0, AUTOECHO_OFF,
TRANSMODE_CONTROL, 0, 0};
bool bNeedRefresh = false; //dynamic refresh
bool bTimerRefresh = false;
extern void SetUSBTest1Data(USBTEST1_DATA *pData);
extern void reserved();
u8 bTestNo = 0;
static CMD_HEADER xdata *g_pCmd = (CMD_HEADER*)Ep2Buf;
static u8 xdata *g_pData = Ep2Buf+sizeof(CMD_HEADER);
void Timer3_INIT() //16位自动重装模式,产成10ms中断
{
SFRPAGE = TMR3_PAGE;
TMR3L=T3L_VAL; //赋值
TMR3H=T3H_VAL;
RCAP3L=T3L_VAL;
RCAP3H=T3H_VAL;
TMR3CF |=0x01; //SYSCLK/12作为T3输入,向上计数
TMR3CN =0x04; //T3工作模式: 自动重装,计时器,忽略T2EX信号
EIE2 |=0x1;
}
u8 count = 0;
//timer2 happen interval 1 second
void Timer3_Handler() interrupt 14 //T3 20ms中断,用于控制时钟
{
// TMR3CN&=0X7F; //清中断标志位
TF3=0;
count++;
if (count < 50)
return;
count = 0;
usbtest1.bSecond++;
bTimerRefresh = true;
if(usbtest1.bSecond>59)
{
usbtest1.bSecond = 0;
usbtest1.bMinute++;
if (usbtest1.bMinute >59)
{
usbtest1.bMinute = 0;
usbtest1.bHour++;
}
if (usbtest1.bHour > 23)
{
usbtest1.bHour = 0;
usbtest1.bDay++;
}
switch(usbtest1.bMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (usbtest1.bDay>31)
{
usbtest1.bDay=1;
usbtest1.bMonth++;
}
break;
case 4:
case 6:
case 9:
case 11:
if (usbtest1.bDay > 30)
{
usbtest1.bDay = 1;
usbtest1.bMonth++;
}
break;
case 2:
if (usbtest1.bYear%4==0&&usbtest1.bDay>29)
{
usbtest1.bDay = 1;
usbtest1.bMonth++;
}
else if (usbtest1.bDay>28)
{
usbtest1.bDay = 1;
usbtest1.bMonth++;
}
break;
}
if (usbtest1.bMonth > 12)
{
usbtest1.bMonth = 1;
usbtest1.bYear++;
}
if (usbtest1.bYear > 99)
usbtest1.bYear = 0;
}
}
void display_err(u8 bErr)
{
g_pCmd->wTag = USBCMD_BEGIN;
g_pCmd->bCmd = USBCMD_ERROR;
g_pCmd->bLen = 1;
*(g_pData) = bErr;
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
void _set_reg()
{
//check the test no
if (bTestNo != 1)
{
display_err(USBERR_WRONGTEST);
return;
}
memcpy(&usbtest1, g_pData, 8);
usbtest1.wRecvCount += 8;
bNeedRefresh = true;
}
void _get_reg()
{
g_pCmd->wTag = USBCMD_BEGIN;
g_pCmd->bCmd = USBCMD_GETREG;
g_pCmd->bLen = 8;
memcpy(g_pData, &usbtest1, 8);
usbtest1.wSendCount += 8;
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
// bNeedRefresh = true;
}
void _connect_mmc()
{
u8 i;
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
//open root
CurF.firstcluster=0; //首先打开根目录(firstcluster=0判断为根目录)
CurF.attribute=0; //首先打开根目录(firstcluster=0判断为根目录)
OpenDir(&CurF);
//send file struct to pc
g_pCmd->wTag = USBCMD_BEGIN;
g_pCmd->bCmd = USBCMD_CONNECTMMC;
g_pCmd->bLen = sizeof(FILESTRUCT);
for (i=0;i<Found;i++)
{
memcpy(g_pData, &File[i], sizeof(FILESTRUCT));
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
}
void _change_dir()
{
u8 i;
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
if (g_pCmd->bCmd == USBCMD_CHANGEDIR)
OpenDir(&File[*g_pData]);
else if (g_pCmd->bCmd == USBCMD_REFRESH)
OpenDir(&CurF);
//send file struct to pc
g_pCmd->wTag = USBCMD_BEGIN;
g_pCmd->bCmd = USBCMD_CHANGEDIR;
g_pCmd->bLen = sizeof(FILESTRUCT);
for (i=0;i<Found;i++)
{
memcpy(g_pData, &File[i], sizeof(FILESTRUCT));
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
}
void _read_file()
{
u32 u32Offset = 0;
u8 u8FileNo = *g_pData;
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
g_pCmd->wTag = USBCMD_BEGIN;
g_pCmd->bCmd = USBCMD_READFILE;
///////////////////////
//read file & SEND data to pc
while (u32Offset<File[u8FileNo].size)
{
if (File[u8FileNo].size-u32Offset > EP2_PACKET_SIZE-sizeof(CMD_HEADER))
{
mmc_fread(g_pData, EP2_PACKET_SIZE-sizeof(CMD_HEADER));
g_pCmd->bLen = EP2_PACKET_SIZE-sizeof(CMD_HEADER);
}
else
{
mmc_fread(g_pData, File[u8FileNo].size-u32Offset);
g_pCmd->bLen = File[u8FileNo].size-u32Offset;
}
u32Offset += g_pCmd->bLen;
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
//////////////////////////////
//file read over
g_pCmd->bCmd = USBCMD_READOVER;
g_pCmd->bLen = 0;
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
void _write_file()
{
u8 u8FileNo = *g_pData;
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
mmc_fwrite(g_pData, g_pCmd->bLen);
//data write over
g_pCmd->wTag = USBCMD_BEGIN;
g_pCmd->bCmd = USBCMD_WRITEOVER;
g_pCmd->bLen = 0;//64-sizeof(CMD_HEADER);
// memset(pData, 'y', g_pCmd->bLen);
D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
void _delete_file()
{
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
DeleteFile(*g_pData);
}
void _add_file()
{
u8 u8FileNo = *(g_pData+sizeof(FILESTRUCT));
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
memcpy(&File[u8FileNo], g_pData, sizeof(FILESTRUCT));
AddFile(u8FileNo);
}
void _open_file()
{
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
mmc_fopen(*g_pData);
}
void _close_file()
{
//check the test no
if (bTestNo != 2)
{
display_err(USBERR_WRONGTEST);
return;
}
mmc_fclose();
}
code void (*Dispatch[])() =
{
reserved,
_set_reg,
_get_reg,
_change_dir,
_read_file,
_write_file,
_delete_file,
_add_file, //add file & dir use the same func
_add_file,
_delete_file, //delete file & dir use the same func
_connect_mmc,
_open_file,
_close_file,
_change_dir //refresh & change_dir use the same func
};
/* initialize interrupt system */
/*
void Init()
{
}
*/
void Uninit()
{
EX0 = 0;
// ES0 = 0;
EIE2 &=0xfe;
}
void USB_test1(void)
{
CMD_HEADER *g_pCmd = (CMD_HEADER*)Ep2Buf;
bTestNo = 1;
// reset event flags
bEppflags.value = 0;
SetUSBTest1Data(&usbtest1);
IT0 = 0; //set int0 trigger mode
EX0 = 1; //ENABLE int0
EA = 1; //ENABLE interrupt system
// set timer3 interval to 1s
Timer3_INIT();
Init_D12();
D12_Connect();
while(1)
{
if (bEppflags.flags.bus_reset)
{
DISABLE_INTERRUPT;
bEppflags.flags.bus_reset = 0;
ENABLE_INTERRUPT;
// Release D12's SUSPEND pin after bus reset
D12_SUSP = D12_SUSP_SLEEP;
}
if (bEppflags.flags.suspend)
{
DISABLE_INTERRUPT;
bEppflags.flags.suspend = 0;
ENABLE_INTERRUPT;
}
if (bEppflags.flags.setup_packet)
{
DISABLE_INTERRUPT;
bEppflags.flags.setup_packet = 0;
ENABLE_INTERRUPT;
control_handler();
}
if (bEppflags.flags.ep2_out)
{
// DISABLE_INTERRUPT; //the int was disabled in ep2 out interrupt,
//we need open it after process the data
bEppflags.flags.ep2_out = 0;
// process(Ep2OutLen);
ENABLE_INTERRUPT;
if (g_pCmd->wTag != USBCMD_BEGIN)
{
display_err(USBERR_WRONGTEST);
}
Dispatch[g_pCmd->bCmd]();
}
if (CheckKeyF == 1)
{
CheckKey();
CheckKeyF = 0;
}
if (Key[0].pressed == 1) //key0 set trans mode
{
if (usbtest1.bTransMode == TRANSMODE_CONTROL)
usbtest1.bTransMode = TRANSMODE_INT;
else
usbtest1.bTransMode = TRANSMODE_CONTROL;
bNeedRefresh = true;
Key[0].pressed = 0;
}
if (Key[1].pressed == 1)//key1 set auto echo
{
if (usbtest1.bAutoEcho == AUTOECHO_ON)
usbtest1.bAutoEcho = AUTOECHO_OFF;
else
usbtest1.bAutoEcho = AUTOECHO_ON;
bNeedRefresh = true;
Key[1].pressed = 0;
// D12_WriteEndpointBuffer(5, InData, 64);
}
if (Key[6].pressed == 1) //key6 clear byte count
{
usbtest1.wSendCount = 0;
usbtest1.wRecvCount = 0;
bNeedRefresh = true;
Key[6].pressed = 0;
}
if (Key[7].pressed == 1) //exit usb test1
{
Uninit();
D12_Disconnect();
bTestNo = 0;
SFRPAGE=TMR3_PAGE;
TR3=0;
SFRPAGE=CONFIG_PAGE;
ClearKey(); //清按键
Clear(0,240); //清屏幕
return;
}
if (bNeedRefresh == true || bTimerRefresh == true)
{
if (usbtest1.bAutoEcho == AUTOECHO_ON
&& bTimerRefresh==true)
_get_reg();
SetUSBTest1Data(&usbtest1);
bNeedRefresh = false;
bTimerRefresh = false;
}
}
}
void USB_test2(void)
{
// CMD_HEADER xdata *g_pCmd = (CMD_HEADER*)Ep2Buf;
// char Selected; //返回的目录选择项(0-12),-1表示退出MMC模块
bTestNo = 2;
// reset event flags
bEppflags.value = 0;
DEPTH=1;
Clear(0,240);
MMCDataBuf[512]=0; //缓冲区第513个字节清零,防止显示时溢出
strcpy(PATH,"路径:根目录");
//open root
CurF.firstcluster=0; //首先打开根目录(firstcluster=0判断为根目录)
CurF.attribute=0; //首先打开根目录(firstcluster=0判断为根目录)
OpenDir(&CurF);
IT0 = 0; //set int0 trigger mode
EX0 = 1; //ENABLE int0
EA = 1; //ENABLE interrupt system
Init_D12();
D12_Connect();
while(1)
{
if (bEppflags.flags.bus_reset)
{
DISABLE_INTERRUPT;
bEppflags.flags.bus_reset = 0;
ENABLE_INTERRUPT;
// Release D12's SUSPEND pin after bus reset
D12_SUSP = D12_SUSP_SLEEP;
}
if (bEppflags.flags.suspend)
{
DISABLE_INTERRUPT;
bEppflags.flags.suspend = 0;
ENABLE_INTERRUPT;
}
if (bEppflags.flags.setup_packet)
{
DISABLE_INTERRUPT;
bEppflags.flags.setup_packet = 0;
ENABLE_INTERRUPT;
control_handler();
}
if (bEppflags.flags.ep2_out)
{
// DISABLE_INTERRUPT; //the int was disabled in ep2 out interrupt,
//we need open it after process the data
bEppflags.flags.ep2_out = 0;
// process(Ep2OutLen);
ENABLE_INTERRUPT;
if (g_pCmd->wTag != USBCMD_BEGIN)
{
display_err(USBERR_WRONGTEST);
}
Dispatch[g_pCmd->bCmd]();
}
if (CheckKeyF == 1)
{
CheckKey();
CheckKeyF = 0;
}
if (Key[7].pressed == 1) //exit usb test2
{
EX0 = 0;
D12_Disconnect();
bTestNo = 0;
ClearKey(); //清按键
Clear(0,240); //清屏幕
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -