?? usb_test.c
#include <stdlib.h>
#include "DSP28_Device.h"
#include "type.h"
#include "sx2.h"
#include "descriptors.h"
#include "DEC2812_USB.h"
#include "ep0req.h"
BOOL Load_descriptors(char length, char* desc);
BOOL Write_SX2reg(unsigned char addr, unsigned int value);
BOOL SX2_comwritebyte(unsigned int value);
BOOL SX2_FifoWrite(int channel,unsigned int *pdata,unsigned length);
BOOL SX2_FifoWriteSingle(int channel,unsigned int pdata);
unsigned int SX2_FifoReadSingle(int channel);
interrupt void XINT2_ISR_A(void);
extern char desctbl[];
unsigned char keepAliveCnt; /* counter of Timer0 interrupts */
HANDLE codec_command =0;
HANDLE codec_data=0;
unsigned int FifoWriteCnt = 0;
unsigned int epdatar[512] ={0};
unsigned int epdataw[512] ={0};
unsigned int epdataw1[256] ={0};
unsigned int irqValue; /* interrupt register value */
unsigned int setupBuff[8]; /* setup transaction buffer */
BOOL sx2Ready; /* status byte for POST */
BOOL sx2BusActivity; /* status byte for suspend */
BOOL sx2EnumOK; /* status byte for enumeration complete */
BOOL sx2EP0Buf; /* status for endpoint 0 buffer */
BOOL sx2Setup; /* setup flag set in Int0() ISR */
BOOL FLAGS_READ = FALSE; /*FIFO的狀態(tài)讀請求*/
unsigned int INT_STATUS;
unsigned int SX2_int;
unsigned long readFlag;
unsigned int usbtimeout = 0x400;
unsigned int regdataread = 0;
unsigned int Fifolong = 0; /*FIFO的長度*/
unsigned int setupCnt = 0;
unsigned int Usb2or11= 1; /*USB工作在哪一個標(biāo)準(zhǔn)上*/
unsigned int hshostlink = 0; /*為真是高速USB接口,為假是低速USB接口*/
static BOOL setupDat = FALSE;
void main(void)
{
unsigned int regValue = 0; /* register value from a read */
// unsigned int Sx2int = 0; /*SX2的中斷狀態(tài)*/
unsigned int endpoint0count = 0;/*EP0的數(shù)據(jù)長度*/
unsigned int endpoint0data[64] ={0};/*EP0的數(shù)據(jù)緩沖區(qū)*/
unsigned int i = 0;
unsigned int FifoStatus24 = 0; /*FIFO24的狀態(tài)標(biāo)識*/
unsigned int FifoStatus68 = 0; /*FIFO68的狀態(tài)標(biāo)識*/
unsigned int Fifostatus = 0;
// BOOL codec_runing = FALSE;
// BOOL codec_halt = FALSE;
// BOOL codec_rev = FALSE;
// BOOL codec_play = FALSE;
// BOOL codec_datok = FALSE;
// BOOL codec_horfull = TRUE;
// BOOL codec_back = FALSE;
// BOOL sx2EnumOK = FALSE;
// unsigned int codec_count = 0;
// unsigned int codec_sample = 0;
// unsigned int codec_regvalue = 0;
// unsigned int audiodata =0;
unsigned int RecievedDataLongth = 0;
// unsigned int LedCount = 0; /*記錄LED定時器的次數(shù)*/
unsigned int DataToEndpoint0 = 0;/*寫入到Endpoint0的數(shù)據(jù)緩沖*/
// unsigned long flashbaddr = 0;
// unsigned int flashdata = 0;
// unsigned int flasherr = 0;
// unsigned long flashlong = 0;
/*初始化系統(tǒng)*/
InitSysCtrl();
/*關(guān)中斷*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中斷矢量表*/
InitPieVectTable();
/*初始化外設(shè)*/
InitPeripherals();
/*初始化GPIO*/
InitGpio1();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.XINT2 = &XINT2_ISR_A;
EDIS; // This is needed to disable write to EALLOW protected registers
/*初始化ZONE 1區(qū)*/
//InitXintf();
/*初始化外部中斷*/
InitXIntrupt();
*USB_STS = 0x20;
/*開中斷*/
IER |= M_INT1;
for(;;)
{
if(GpioDataRegs.GPEDAT.bit.GPIOE1 == 1)
{
InitGpio();
SX2_int = *USB_COMMAND & (SX2_INT_ENUMOK + SX2_INT_READY);
if(SX2_int)
{
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
break;
}
}
else
{
InitGpio();
SX2_int = *USB_COMMAND & (SX2_INT_ENUMOK + SX2_INT_READY);
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
break;
}
}
for(;;)
{
/* initialize global variables */
readFlag = 0; /* false until register read */
sx2Ready = FALSE; /* false until POST or wakeup */
sx2BusActivity = FALSE; /* false until absence or resumption of USB bus activity */
sx2EnumOK = FALSE; /* false until ENUMOK interrupt */
sx2EP0Buf = FALSE; /* false until EP0BUF interrupt */
sx2Setup = FALSE; /* false until SETUP interrupt */
/* Initialize global variables specific to this test firmware */
keepAliveCnt = 0;
/* Initialize local variables */
/* reusable variable for read register data */
regValue = 0;
if(!Load_descriptors(DESCTBL_LEN, &desctbl[0]))
{
while(TRUE);
}
/*裝載描述表后,等待自舉成功*/
/*裝載描述表后,等待自舉成功*/
while(TRUE)
{
if(sx2EnumOK == TRUE)
{
break;
}
}
/*設(shè)置當(dāng)前的接口的形式*/
Write_SX2reg(SX2_IFCONFIG , 0xE8);
/*設(shè)置當(dāng)前系統(tǒng)中各使能信號的極性
其中SLOE、SLRD、SLWR只能有EEPROM來配置*/
Write_SX2reg(SX2_FIFOPOLAR, SX2_WUPOL | SX2_EF | SX2_FF);
/*讀取當(dāng)前工作在哪個USB的標(biāo)準(zhǔn)*/
Read_SX2reg(SX2_FNADDR, &Usb2or11);
hshostlink = (Usb2or11 & SX2_HSGRANT) ? 1 : 0;
/*初始化USB的工作狀態(tài)*/
//if(hshostlink == 1)
{
/*工作在2.00標(biāo)準(zhǔn),設(shè)定數(shù)字接口為16位,數(shù)據(jù)包的大小為512字節(jié)*/
Fifolong = 0x100;
Write_SX2reg(SX2_EP2PKTLENH , SX2_WORDWIDE | 0x02);
Write_SX2reg(SX2_EP2PKTLENL , 0x00);
Write_SX2reg(SX2_EP4PKTLENH , SX2_WORDWIDE | 0x02);
Write_SX2reg(SX2_EP4PKTLENL , 0x00);
Write_SX2reg(SX2_EP6PKTLENH , SX2_WORDWIDE | 0x02);
Write_SX2reg(SX2_EP6PKTLENL , 0x00);
Write_SX2reg(SX2_EP8PKTLENH , SX2_WORDWIDE | 0x02);
Write_SX2reg(SX2_EP8PKTLENL , 0x00);
}
/* else
{
Fifolong =0x20;
Write_SX2reg(SX2_EP2PKTLENH , SX2_WORDWIDE);
Write_SX2reg(SX2_EP2PKTLENL , 0x40);
Write_SX2reg(SX2_EP4PKTLENH , SX2_WORDWIDE);
Write_SX2reg(SX2_EP4PKTLENL , 0x40);
Write_SX2reg(SX2_EP6PKTLENH , SX2_WORDWIDE);
Write_SX2reg(SX2_EP6PKTLENL , 0x40);
Write_SX2reg(SX2_EP8PKTLENH , SX2_WORDWIDE);
Write_SX2reg(SX2_EP8PKTLENL , 0x40);
}*/
/*設(shè)置FLAGSA為FIFO6的空的標(biāo)志位;
設(shè)置FLAGSB為FIFO8的空的標(biāo)志位;
FLAGSC與FLAGSD的狀態(tài)為默認的狀態(tài)*/
Write_SX2reg(SX2_FLAGAB , SX2_FLAGA_FF6 | SX2_FLAGB_FF8);
/*清空所有的節(jié)點*/
Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68);
/*自舉后進行主程序的循環(huán)*/
while(sx2EnumOK)
{
/*讀FIFO狀態(tài)*/
if(FLAGS_READ)
{
FLAGS_READ = FALSE;
/*FIFO24狀態(tài)的讀取*/
if(Read_SX2reg(SX2_EP24FLAGS, &FifoStatus24))
{
/*確定是否有FIFO滿*/
Fifostatus = FifoStatus24;
if(!(Fifostatus & SX2_EP2EF))
{
RecievedDataLongth = Fifolong;
for(i = 0;i<Fifolong;i++)
{
epdatar[i] = SX2_FifoReadSingle(ENDPOINT2);
/*SX2_FifoWriteSingle(ENDPOINT6,epdatar[i]);*/
}
SX2_FifoWrite(ENDPOINT6,&epdatar[0],Fifolong);
/*小于整數(shù)據(jù)包的數(shù)據(jù)提交SX2發(fā)送給主機*/
if(RecievedDataLongth<(Fifolong-1))
{
Write_SX2reg(SX2_INPKTEND, 0x06);
}
}
Fifostatus = FifoStatus24;
if(!(Fifostatus & SX2_EP4EF))
{
i = 0;
while(!(Fifostatus & SX2_EP4EF))
{
epdatar[i] = SX2_FifoReadSingle(ENDPOINT4);
Read_SX2reg(SX2_EP24FLAGS, &Fifostatus);
RecievedDataLongth = i;
i = i +1;
}
SX2_FifoWrite(ENDPOINT8,&epdatar[0],Fifolong);
/*小于整數(shù)據(jù)包的數(shù)據(jù)提交SX2發(fā)送給主機*/
if(RecievedDataLongth<(Fifolong-1))
{
Write_SX2reg(SX2_INPKTEND, 0x08);
}
}
}/*FIFO24狀態(tài)的讀取*/
/*FIFO68狀態(tài)的讀取*/
if(Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68))
{
/*無操作,可由用戶測試使用*/
}
}/*不是音頻傳送*/
/*關(guān)于setup中斷的處理*/
if(sx2Setup)
{
/*清SETUP數(shù)據(jù)讀的標(biāo)志*/
sx2Setup = FALSE;
/*解析OUT類型的命令申請*/
if(setupBuff[0] == VR_TYPE_OUT)
{
/*分析命令類型*/
switch(setupBuff[1])
{
/*系統(tǒng)復(fù)位*/
case VR_RESET:
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
/*讀命令*/
case VR_BULK_READ:
/*usbcommand = BULK_READ;*/
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
/*寫操作*/
case VR_BULK_WRITE:
/*清空節(jié)點6與8*/
/*Write_SX2reg(SX2_INPKTEND, 0xc0);*/
switch (setupBuff[2])
{
case ENDPOINT6:
/*寫入節(jié)點6*/
for(i = 0;i<0x100;i++)
{
epdataw1[i] = i*2;
}
for(i = 0;i<0x50;i=i+2)
{
epdataw[i/2] = epdataw1[i]+(epdataw1[i+1]<<8);
}
/*如果發(fā)送小于整數(shù)據(jù)包的數(shù)據(jù)時,設(shè)置RecievedDataLongth*/
RecievedDataLongth = 0x3f;
/*讀當(dāng)前FIFO的狀態(tài),是否已滿*/
regValue = *USB_STS;
FifoWriteCnt = 0;
SX2_FifoWrite(ENDPOINT6,&epdataw[0],Fifolong);
if(hshostlink ==1)
{
Write_SX2reg(SX2_INPKTEND, 0x06);
}
setupBuff[1] = 0;
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case ENDPOINT8:
/*寫入節(jié)點6*/
for(i = 0;i<0x200;i++)
{
epdataw1[i] = i*2+1;
}
for(i = 0;i<0x50;i=i+2)
{
epdataw[i/2] = epdataw1[i]+(epdataw1[i+1]<<8);
}
i = 0;
/*如果發(fā)送小于整數(shù)據(jù)包的數(shù)據(jù)時,設(shè)置RecievedDataLongth*/
RecievedDataLongth = 0x1f;
/*讀當(dāng)前FIFO的狀態(tài),是否已滿*/
regValue = *USB_STS;
SX2_FifoWrite(ENDPOINT8,&epdataw[0],Fifolong);
if(hshostlink ==1)
{
Write_SX2reg(SX2_INPKTEND, 0x06);
}
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
}
break;
/*Endpoint0內(nèi)容的讀操作*/
case VR_ENDPOINT0READ:
/*確定Endpoint0的長度*/
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0數(shù)據(jù)包準(zhǔn)備好的標(biāo)志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準(zhǔn)備好的標(biāo)志*/
sx2EP0Buf = FALSE;
/*讀數(shù)據(jù)相的數(shù)據(jù)長度*/
Read_SX2reg(SX2_EP0BC, &endpoint0count);
/*讀數(shù)據(jù)相的數(shù)據(jù)*/
for(i = 0; i<endpoint0count;i++)
{
Read_SX2reg(SX2_EP0BUF,&endpoint0data[i]);
}
}
break;
case VR_REGWRITE:
/* write the actual value to the register */
Write_SX2reg(setupBuff[4], setupBuff[2]);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*不支持的請求*/
/*寫非零數(shù)到SX2_SETUP,取消此請求*/
Write_SX2reg(SX2_SETUP, 0xff);
break;
}/*分析命令類型*/
}
else
{
/*解析IN類型的命令申請*/
if(setupBuff[0] == VR_TYPE_IN)
{
/*分析命令類型*/
switch(setupBuff[1])
{
/*USB工作的標(biāo)準(zhǔn)*/
case VR_USB_VERION:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -