⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testusb.c

📁 uCOS上移植的USB。今天终于可以使用我的了
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -