📄 testusb.c
字号:
#include "includes.h"
#include "USB.h"
/*
**************************************************************************************************************
* CONSTANTS
**************************************************************************************************************
*/
#define TASK_STK_SIZE OS_TASK_DEF_STK_SIZE /* Size of each task's stacks (# of bytes) */
/* #define UART_TX_BUF_SIZE 512 */
#define UART_TX_BUF_SIZE 256
#define MSG_QUEUE_SIZE 20
/*
**************************************************************************************************************
* VARIABLES
**************************************************************************************************************
*/
OS_EVENT *DispStrSem;
INT8U UartTxBuf[UART_TX_BUF_SIZE]; /* UART transmit buffer */
INT16U UartTxRdPtr; /* UART transmit buffer read pointer */
INT16U UartTxWrPtr; /* UART transmit buffer write pointer */
INT16U UartTxCount; /* Number of characters to send */
OS_EVENT *UartTxSem;
OS_EVENT *MsgQueue;
void *MsgQueueTbl[20]; /* Message Queue */
/*
typedef struct {
char name[10];
INT8U message;
}OSMSG,*POSMSG; Message Type */
/*
**************************************************************************************************************
* TASK DEFINE
**************************************************************************************************************
*/
//MAIN TASK
void MainTask(void *data); /* Function prototypes of Startup task */
//OS_STK MainTaskStk[TASK_STK_SIZE];
OS_STK MainTaskStk[1024];
#define Main_Task_Prio 0;
//KEY TASK
void KeyTask(void *data); /* Function prototypes of Additional task */
OS_STK KeyTaskStk[TASK_STK_SIZE];
#define Key_Task_Prio 11;
//LCD TASK
void LCDTask(void *data); /* Function prototypes of Additional task */
OS_STK LCDTaskStk[TASK_STK_SIZE];
#define LCD_Task_Prio 12;
/*
**************************************************************************************************************
* SPECIAL FUNCTION
**************************************************************************************************************
*/
void PutChar(char c); /* Write a character to the AVR UART */
void AvrInit(void); /* Initialize AVR */
void PutString(const char *s); /* Write a null-terminated string to the AVR UART */
void SPrintDec(char *, INT16U, INT8U); /* Output an INT16U to a string (right adjust) */
void PutDec (INT8U x); /* Display an INT8U without leading zeros */
void VT102Attribute (INT8U fgcolor, INT8U bgcolor); /* Set attributes on VT102 terminal */
void VT102DispClrScr(void); /* Clear VT102 terminal */
void VT102DispChar(INT8U, INT8U, char, INT8U, INT8U); /* Display a character on VT102 terminal */
void VT102DispStr(INT8U, INT8U, char *, INT8U, INT8U); /* Display a string on VT102 terminal */
void VT102DispNumH (INT8U x, INT8U y, INT16U n3, INT8U fgcolor, INT8U bgcolor);
INT8U convertH(INT8U n);
void VT102DispNum (INT8U x, INT8U y, INT16U x4, INT8U fgcolor, INT8U bgcolor);
void printfpro(INT8U x, INT8U y, char *s,INT16U z,INT8U fgcolor, INT8U bgcolor);
void subprintf(const char *s,INT16U x);
void PutNum(INT16U x4);
void PutNumH (INT16U n3);
#define printf(x,y,s,z) printfpro(x,y,s,z, COLOR_WHITE, COLOR_BLACK)
char GetKey(void);
char GetKeyPro(void);
//int testsram(void);
void USB(void);
void init_port(void);
void init_special_interrupts(void);
/*
**************************************************************************************************************
* USB varieties
**************************************************************************************************************
*/
void bus_reset(void);
void ep0_txdone(void);
void ep0_rxdone(void);
void ep1_txdone(void);
void ep1_rxdone(void);
void main_txdone(void);
void main_rxdone(void);
void dma_eot(void);
void outportb(unsigned int Addr,unsigned char Data);
unsigned char inportb(unsigned int Addr);
void fn_usb_isr(void);
unsigned char D12_GetDMA(void);
/*
*********************
Public static data
*********************
*/
EPPFLAGS bEPPflags;
/* Control endpoint TX/RX buffers */
CONTROL_XFER ControlData;
/* ISR static vars */
unsigned char GenEpBuf[EP1_PACKET_SIZE];
unsigned char EpBuf[EP2_PACKET_SIZE];
IO_REQUEST ioRequest;
unsigned char ioSize, ioCount;
struct EpTD
{
unsigned char MainEpBuf[256];
INT8U datacount;
} mainep;
BOOL bNoRAM;
/*
*************************************
USB protocol function pointer arrays
*************************************
*/
void StandardDeviceRequest(unsigned char req);
void VendorDeviceRequest(unsigned char req);
/*
********************
Public static data
********************
*/
char * _NAME_USB_REQUEST_DIRECTION[] =
{
"Host_to_device",
"Device_to_host"
};
char * _NAME_USB_REQUEST_RECIPIENT[] =
{
"Device",
"Interface",
"Endpoint(0)",
"Other"
};
char * _NAME_USB_REQUEST_TYPE[] =
{
"Standard",
"Class",
"Vendor",
"Reserved"
};
char * _NAME_USB_STANDARD_REQUEST[] =
{
"GET_STATUS",
"CLEAR_FEATURE",
"RESERVED",
"SET_FEATURE",
"RESERVED",
"SET_ADDRESS",
"GET_DESCRIPTOR",
"SET_DESCRIPTOR",
"GET_CONFIGURATION",
"SET_CONFIGURATION",
"GET_INTERFACE",
"SET_INTERFACE",
"SYNC_FRAME"
};
//#include "protodma.h"
//CONTROL_XFER ControlData;
//extern IO_REQUEST ioRequest;
//EPPFLAGS bEPPflags;
//bool bNoRAM;
/*
**************************************************************************************************************
* MAIN
**************************************************************************************************************
*/
int main (void)
{
AvrInit(); /* Initialize the AVR UART and Timer */
OSInit();
DispStrSem = OSSemCreate(1); /* Display string semaphore */
UartTxSem = OSSemCreate(UART_TX_BUF_SIZE); /* Initialize Uart transmit buffer semaphore */
// OSTaskCreate(MainTask, (void *)0, (void *)&MainTaskStk[TASK_STK_SIZE - 1], 0);
OSTaskCreate(MainTask, (void *)0, (void *)&MainTaskStk[1024 - 1], 0);
OSStart(); /* Start multitasking */
return 0;
}
/*
**************************************************************************************************************
* MAIN TASK
**************************************************************************************************************
*/
void MainTask (void *data)
{
INT8U err;
// POSMSG pMsg=0;
char *msg;
OS_Q_DATA *pdata;
data = data; /* Prevent compiler warning */
/*
* Enabling of timer interrupt is moved from AvrInit() to here
*/
OS_ENTER_CRITICAL();
TCCR0=0x07; /* Set TIMER0 prescaler to CLK/1024 */
TIMSK=_BV(TOIE0); /* Enable TIMER0 overflow interrupt */
TCNT0=256-(CPU_CLOCK_HZ/OS_TICKS_PER_SEC/1024); /* Set the counter initial value */
OS_EXIT_CRITICAL();
VT102DispClrScr(); /* Clear the screen */
VT102DispStr(26, 1, "The Embeded System Based on AVR MCU", COLOR_WHITE, COLOR_RED);
VT102DispStr(29, 2, "Micro Control Unit: ATmega 128 ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(16, 3, "The RTOS based on: uC/OS-II, The Real-Time Kernel", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(10, 4, "Main Function: UART USB Ethernet", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(60, 4, "Date: April 25th,2004", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 23, "Determining CPU's Memory ...", COLOR_WHITE, COLOR_BLACK);
//testsram() ;
OSStatInit(); /* Initialize uC/OS-II's statistics */
MsgQueue=OSQCreate(&MsgQueueTbl[0],MSG_QUEUE_SIZE);
OSTaskCreate(KeyTask, (void *)0, (void *)&KeyTaskStk[TASK_STK_SIZE - 1], 1);
OSTaskCreate(LCDTask, (void *)0, (void *)&LCDTaskStk[TASK_STK_SIZE - 1], 2);
OSTimeDlyHMSM(0,0,1,0);
for(;;)
{
msg=(char *)OSQPend(MsgQueue,0,&err);
VT102DispStr(1, 22, "message:", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(10, 22, msg, COLOR_WHITE, COLOR_BLACK);
OSQQuery(MsgQueue,pdata);
VT102DispStr(9, 21, ":the number of messages in the Queue ", COLOR_WHITE, COLOR_BLACK);
VT102DispChar(7, 21, '0'+pdata->OSNMsgs, COLOR_WHITE, COLOR_BLACK);
VT102DispStr(14, 22, "Receive message and start the task. ", COLOR_WHITE, COLOR_BLACK);
OSTimeDlyHMSM(0,0,0,100);
switch(*msg)
{
case 'c':
VT102DispStr(1, 22, " Connecting USB...... ", COLOR_WHITE, COLOR_BLACK);
USB();
OSTimeDlyHMSM(0,0,0,100);
VT102DispStr(5, 22, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 6, "Keyboard Input: ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 7, " F1:display the numbers and symbles you inputed. ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 8, " F2:display exit. ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 9, " F3:USB ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 10, " F4:Ethernet ", COLOR_WHITE, COLOR_BLACK);
break;
case 'd':
VT102DispStr(1, 22, " Connecting Ethernet...... ", COLOR_WHITE, COLOR_BLACK);
// Ethernet();
OSTimeDlyHMSM(0,0,0,100);
// VT102DispStr(5, 22, " ", COLOR_WHITE, COLOR_BLACK);
break;
default : VT102DispStr(5, 22, "message error,check it and try again ", COLOR_WHITE, COLOR_BLACK);
break;
}
}
/*
for(;;)
{
pMsg=(POSMSG)OSQPend(MsgQueue,0,&err);
VT102DispStr(1, 24, &pMsg->name[0], COLOR_WHITE, COLOR_BLACK);
switch(pMsg->message)
{
case 1:
// USB();
break;
case 2:
// Ethernet();
break;
}
}
*/
}
/*
**************************************************************************************************************
* Additional TASKS
**************************************************************************************************************
*/
void KeyTask(void *data)
{
char key;
// POSMSG pMsg;
char msg[1];
int i=1,j=11,k,m;
//test ram
for(i = 0; i < 16; i ++)
mainep.MainEpBuf[i] = i;
for(i = 0; i < 16; i ++) {
if(mainep.MainEpBuf[i] != i)
break;
}
if(i < 16)
bNoRAM = TRUE;
else
bNoRAM = FALSE;
data = data; /* Prevent compiler warning */
VT102DispStr(1, 6, "Keyboard Input: ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 7, " F1:display the numbers and symbles you inputed. ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 8, " F2:display exit. ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 9, " F3:USB ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 10, " F4:Ethernet ", COLOR_WHITE, COLOR_BLACK);
for(i=1;;)
{
key=GetKeyPro();
if(key)
{
if(key=='a')
{//display the inputed symble
while(key!='b')
{
if(mainep.datacount<127) mainep.MainEpBuf[mainep.datacount]=key;
mainep.datacount++;
if(j<=20) {
if(i<=80) {
key=GetKeyPro();
if(key) VT102DispChar(i, j,key , COLOR_WHITE, COLOR_BLACK);
for(k=0;k<1000;k++) for(m=0;m<500;m++) {}
if(key) i++;
}
else {i=1;
j++;
}
}
else j=11;
}
}
else if(key=='c')
{ i=0;
// strcpy(&pMsg->name[0],"USB connecting......");
// pMsg->message=1;
msg[0]='c';
OSQPost(MsgQueue,(void *)msg);
}
else if(key=='d')
{ i=0;
// strcpy(&pMsg->name[0],"Ethernet connecting......");
// pMsg->message=2;
msg[0]='d';
OSQPost(MsgQueue,(void *)msg);
}
}
OSTimeDlyHMSM(0,0,0,100);
}
}
void LCDTask(void *data)
{
char s[10];
data = data; /* Prevent compiler warning */
/* LCD imitation */
VT102DispStr(1, 23, "#Tasks : xxxxx CPU Usage: xxx %", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 24, "#Task switch/sec: xxxxx", COLOR_WHITE, COLOR_BLACK);
for (;;) {
SPrintDec(s, (INT16U)OSTaskCtr, 5); /* Display #tasks running */
VT102DispStr(19, 23, s, COLOR_WHITE, COLOR_BLUE);
SPrintDec(s, (INT16U)OSCPUUsage, 3); /* Display CPU usage in % */
VT102DispStr(37, 23, s, COLOR_WHITE, COLOR_BLUE);
SPrintDec(s, (INT16U)OSCtxSwCtr, 5); /* Display #context switches per second */
VT102DispStr(19, 24, s, COLOR_WHITE, COLOR_BLUE);
OSCtxSwCtr = 0;
OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
}
}
/*
**************************************************************************************************************
* SUPPORT ROUTINES
**************************************************************************************************************
*/
/*int testsram(void)
{
unsigned char get,data;
unsigned short addr,i;
addr=0x1100;
get=0;
i=1;
while(addr<=0xee00)
{
OS_ENTER_CRITICAL();
// asm volatile("ld %0,X" :"=r" (get):"e" (addr) );
OS_EXIT_CRITICAL();
// VT102DispChar (i, 22, get, COLOR_WHITE, COLOR_BLACK);
VT102DispChar (i, 22, 'H', COLOR_WHITE, COLOR_BLACK);
VT102DispStr(i+1, 22, " ", COLOR_WHITE, COLOR_BLACK);
addr+=0x3b0;
i++;
}
// OSTimeDlyHMSM(0, 0, 0, 500);
VT102DispStr(1, 23, "Memory detective success ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 22, " ", COLOR_WHITE, COLOR_BLACK);
return 1;
}*/
/*
int testsram(void)
{
unsigned char data;
INT16U addr;
int flag,i;
flag=1;
data=0xff;
addr=0x7f00;
for(; addr <= 0x80ff; addr++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -