?? ep0req.c
字號(hào):
/***************************************************
File: seeddec5416usb.c
Author: Lifeng Duan
Created: 21/11/2003
Description:Evaluates the use of SX2 with DSP
Copyright (C) SEED SEMICONDUCTOR, 2003
*****************************************************/
#include "type.h"
#include "uart.h"
#include "sx2.h"
#include "descriptors.h"
#include "ep0Req.h"
#include "cy7c68001.h"
#include "sysreg.h"
#include "timer.h"
#include "mcbsp54.h"
#include "codec.h"
#include "memory.h"
#include "dma54xx.h"
#define decintreg 0x2
#define USBINT 0x10
void delay();
/* external variables */
extern char desctbl[];
/* global variables */
extern BYTE irqValue; /* interrupt register value */
extern BYTE setupBuff[8]; /* setup transaction buffer */
extern BOOL sx2Ready; /* status byte for POST */
extern BOOL sx2BusActivity; /* status byte for suspend */
extern BOOL sx2EnumOK; /* status byte for enumeration complete */
extern BOOL sx2EP0Buf; /* status for endpoint 0 buffer */
extern BOOL sx2Setup; /* setup flag set in Int0() ISR */
extern BOOL readFlag;
extern BOOL FLAGS_READ; /*FIFO的狀態(tài)讀請(qǐng)求*/
extern BOOL buffer_halffull;
extern BOOL buffer_full;
/* global variables specific to this test firmware */
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};
/*串口A接收緩沖區(qū)*/
#pragma DATA_SECTION(codecdat,".codec_buffer")
unsigned int codecdat[0x400];
void main()
{
unsigned int regValue = 0; /* register value from a read */
unsigned int Sx2int = 0; /*SX2的中斷狀態(tài)*/
unsigned int Usb2or11= 0; /*USB工作在哪一個(gè)標(biāo)準(zhǔn)上*/
unsigned int endpoint0count = 0;/*EP0的數(shù)據(jù)長(zhǎng)度*/
unsigned int endpoint0data[64] ={0};/*EP0的數(shù)據(jù)緩沖區(qū)*/
unsigned int i = 0;
unsigned int FifoStatus24 = 0; /*FIFO24的狀態(tài)標(biāo)識(shí)*/
unsigned int FifoStatus68 = 0; /*FIFO68的狀態(tài)標(biāo)識(shí)*/
unsigned int Fifostatus = 0;
unsigned int Fifolong = 0; /*FIFO的長(zhǎng)度*/
BOOL hshostlink = FALSE; /*為真是高速USB接口,為假是低速USB接口*/
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;
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í)器的次數(shù)*/
unsigned int DataToEndpoint0 = 0;/*寫(xiě)入到Endpoint0的數(shù)據(jù)緩沖*/
unsigned long flashbaddr = 0;
unsigned int flashdata = 0;
unsigned int flasherr = 0;
unsigned long flashlong = 0;
/*設(shè)置系統(tǒng)時(shí)鐘*/
sys_clk(CLK160);
/*初始化DEC5416板卡*/
dec5416_init();
/*打開(kāi)codec數(shù)據(jù)接口*/
codec_data = codec_open(CODEC_DATA);
/*打開(kāi)codec命令接口*/
codec_command = codec_open(CODEC_COMMAND);
/*選擇麥克風(fēng)作為輸入*/
codec_analog_mode(codec_command,0x14);
/*設(shè)置波特率,輸入與輸出均為8K*/
codec_sample_rate(codec_command,0xd);
/*配置系統(tǒng)存儲(chǔ)器*/
memory_set(0x80);
/*初始化dma*/
/*工作在USB2.0標(biāo)準(zhǔn)*/
/*dma全局寄存器的初始化*/
dma_global_init(0x80, /*設(shè)置優(yōu)先級(jí),禁止所有dma*/
0x2, /*IN:Value for source page reg*/
0x2, /*IN:Value for dest page reg*/
0x0, /*IN:Value for element index reg 0 */
0x0, /*IN:Value for element index reg 1 */
0x0, /*IN:Value for frame index reg 0 */
0x0, /*IN:Value for frame index reg 1 */
0x800, /*IN:Value for global src addr reload */
0x23, /*IN:Value for global dst addr reload */
0x80, /*IN:Value for global count reload reg*/
0x0); /*IN:Value for global frame reload reg*/
/*初始化dma寄存器*/
dma_init( 0, /*選擇通路0*/
0x2000, /*選擇XEVT0,單字格式,單幀格式(dmsefc)*/
0xF141, /*自動(dòng)初始化,選擇ABU方式,設(shè)置數(shù)據(jù)空間,使有中斷(dmsefc)*/
0x400, /*設(shè)置緩沖區(qū)的長(zhǎng)度0x400(dmctr)*/
0x2, /*設(shè)置源的程序空間地址(src_page) */
0x800, /*設(shè)置源地址(src_addr)*/
0x2, /*設(shè)置目的地址空間(dst_page)*/
0x23); /*設(shè)置目的地址(dst_addr)*/
for(i = 0;i<0x200;i++)
{
codecdat[i] = 0;
}
/*xf的LED燈閃三下*/
for(i = 0;i<3;i++)
{
asm(" RSBX XF");
delay();
asm(" SSBX XF");
delay();
}
/*判斷CY68001是否準(zhǔn)備好*/
for(;;)
{
/*判斷是否有中斷到來(lái)*/
regValue = sysreg_read(decintreg);
if((regValue & USBINT) ==0)
{
/*判斷是何種中斷,并清中斷*/
Sx2int = USB_Command_Read();
if(Sx2int &(SX2_INT_ENUMOK + SX2_INT_READY))
{
/*打開(kāi)系統(tǒng)的串口中斷*/
sysint_enable(0x4);
break;
}
}
else
{
/*打開(kāi)系統(tǒng)的串口中斷*/
sysint_enable(0x4);
break;
}
}
/*自舉循環(huán)*/
while(TRUE)
{
/* initialize global variables */
readFlag = FALSE; /* 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;
/* load descriptor tables; halt if load fails */
if(!Load_descriptors(DESCTBL_LEN, &desctbl[0]))
{
while(TRUE);
}
/*裝載描述表后,等待自舉成功*/
while(!sx2EnumOK);
sysint_enable(0x4c);
/*設(shè)置當(dāng)前的接口的形式*/
Write_SX2reg(SX2_IFCONFIG , 0xE8);
/*設(shè)置當(dāng)前系統(tǒng)中各使能信號(hào)的極性
其中SLOE、SLRD、SLWR只能有EEPROM來(lái)配置*/
Write_SX2reg(SX2_FIFOPOLAR, SX2_WUPOL | SX2_EF | SX2_FF);
/*讀取當(dāng)前工作在哪個(gè)USB的標(biāo)準(zhǔn)*/
Read_SX2reg(SX2_FNADDR, &Usb2or11);
hshostlink = (Usb2or11 & SX2_HSGRANT) ? TRUE : FALSE;
/*初始化USB的工作狀態(tài)*/
if(hshostlink ==TRUE)
{
/*工作在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
{
/*工作在1.1標(biāo)準(zhǔn),設(shè)定數(shù)字接口為16位,數(shù)據(jù)包的大小為64字節(jié)*/
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)為默認(rèn)的狀態(tài)*/
Write_SX2reg(SX2_FLAGAB , SX2_FLAGA_FF6 | SX2_FLAGB_FF8);
/*清空所有的節(jié)點(diǎn)*/
Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68);
/*自舉后進(jìn)行主程序的循環(huán)*/
while(sx2EnumOK)
{
/*CODEC CIRCLE運(yùn)行*/
if(codec_runing == TRUE)
{
if(codec_halt ==TRUE)
{
codec_runing = FALSE;
codec_halt = FALSE;
}
else
{
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audiodata = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audiodata;
}
}/*CODEC CIRCLE運(yùn)行*/
/*CODE 錄音*/
if(codec_rev == TRUE)
{
if(codec_halt ==TRUE)
{
codec_rev = FALSE;
codec_halt = FALSE;
}
else
{
for(i = 0;i<Fifolong;i++)
{
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
epdataw[i]= *(volatile u16*)DRR1_ADDR(CODEC_DATA);
if(codec_back == TRUE)
{
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = epdataw[i];
}
}
/*送給微機(jī)數(shù)據(jù)*/
SX2_FifoWrite(ENDPOINT6,&epdataw[0],Fifolong);
}
}/*CODE 錄音*/
if(timer_status())
{
LedCount++;
if(LedCount & 0x1)
{
/*點(diǎn)亮LED*/
asm(" SSBX XF");
}
else
{
/*關(guān)掉LED*/
asm(" RSBX XF");
}
}/*定時(shí)器的處理*/
/*慢速時(shí)的CODE 回放*/
if(codec_datok == TRUE)
{
/* Wait for sample from handset */
if(MCBSP_XRDY(CODEC_DATA))
{
/* Read sample from and write back to handset codec */
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = codecdat[codec_count];
codec_count=codec_count + 1;
if(codec_count == 0x40)
{
codec_count = 0x0;
codec_datok = FALSE;
}
}
}/*慢速時(shí)的CODE 回放*/
/*讀FIFO狀態(tài)*/
if(FLAGS_READ)
{
FLAGS_READ = FALSE;
/*是音頻傳送*/
if(codec_play == TRUE)
{
if(hshostlink !=TRUE)
{
/*FIFO24狀態(tài)的讀取*/
if(Read_SX2reg(SX2_EP24FLAGS, &FifoStatus24))
{
/*確定是否有FIFO滿*/
Fifostatus = FifoStatus24;
if(!(Fifostatus & SX2_EP2EF))
{
for(i = 0;i<Fifolong;i++)
{
codecdat[i] = SX2_FifoReadSingle(ENDPOINT2);
}
}
Fifostatus = FifoStatus24;
if(!(Fifostatus & SX2_EP4EF))
{
for(i = 0;i<Fifolong;i++)
{
codecdat[i+0x20] = SX2_FifoReadSingle(ENDPOINT4);
}
codec_datok = TRUE;
}
}/*FIFO24狀態(tài)的讀*/
}
}/*是音頻傳送*/
else/*不是音頻傳送*/
{
/*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ā)送給主機(jī)*/
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ā)送給主機(jī)*/
if(RecievedDataLongth<(Fifolong-1))
{
Write_SX2reg(SX2_INPKTEND, 0x08);
}
}
}/*FIFO24狀態(tài)的讀取*/
/*FIFO68狀態(tài)的讀取*/
if(Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68))
{
/*無(wú)操作,可由用戶測(cè)試使用*/
}
}/*不是音頻傳送*/
}/*讀FIFO狀態(tài)*/
/*關(guān)于setup中斷的處理*/
if(sx2Setup)
{
/*清SETUP數(shù)據(jù)讀的標(biāo)志*/
sx2Setup = FALSE;
/*解析OUT類型的命令申請(qǐng)*/
if(setupBuff[0] == VR_TYPE_OUT)
{
/*分析命令類型*/
switch(setupBuff[1])
{
/*系統(tǒng)復(fù)位*/
case VR_RESET:
/*寫(xiě)0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
/*讀命令*/
case VR_BULK_READ:
/*usbcommand = BULK_READ;*/
/*寫(xiě)0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -