?? dec5502_usb.c
字號(hào):
/***************************************************
File: DEC5502_USB.c
Author: Lifeng Duan
Created: 8/21/2004
Description:Evaluates the use of SX2 with DSP
Copyright (C) SEED SEMICONDUCTOR, 2004
*****************************************************/
#include <csl.h>
#include <csl_pll.h>
#include <csl_irq.h>
#include <csl_dma.h>
#include <csl_i2c.h>
#include <csl_mcbsp.h>
#include <csl_gpt.h>
#include "emif.h"
#include "i2c.h"
#include "mcbsp.h"
#include "cslconfig.h"
#include "codec.h"
#include "timer.h"
#include "type.h"
#include "descriptors.h"
#include "sysreg.h"
#include "sx2.h"
#include "ep0Req.h"
#include "E2PROM_Function.h"
#define decintreg 0x2
#define USBINT 0x10
void delay();
/* 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)求*/
unsigned int MYMARK;
unsigned int FIFOMARK;
/* global variables specific to this test firmware */
unsigned int FifoWriteCnt ;
unsigned int epdatar[512] ;
unsigned int epdataw[512] ;
unsigned int epdataw1[256];
/* MCBSP接收緩沖區(qū) */
#pragma DATA_SECTION(codecdat,".codec_buffer")
unsigned int codecdat[0x400];
unsigned int CodecReceivData[2];
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; /* FIFO的狀態(tài)標(biāo)志 */
unsigned int Fifolong = 0; /* FIFO的長(zhǎng)度 */
BOOL hshostlink = False; /* 為真是高速USB接口,為假是低速USB接口 */
BOOL codec_runing = False;
unsigned int RecievedDataLongth = 0;
unsigned int DataToEndpoint0 = 0; /* 寫入到Endpoint0的數(shù)據(jù)緩沖 */
/* 初始化CSL庫(kù),配置USB和定時(shí)器中斷 */
Csl_Config();
/* 設(shè)置系統(tǒng)的運(yùn)行速度為240MHz */
PLL_setFreq(1, 0xc, 0, 1, 3, 3, 0);
/* 配置I2C */
I2c_Setup();
/* 配置EMIF為全EMIF接口并初始化DSP的外部EMIF */
Emif_Config();
/* 配置MCBSP */
Mcbsp_Config();
/* 配置定時(shí)器 */
Config_timer();
/* 配置指示燈D5 */
Config_led();
/* 初始化CODEC數(shù)據(jù) */
for(i = 0;i<0x200;i++)
{
codecdat[i] = 0;
}
/*判斷CY68001是否準(zhǔn)備好*/
for(;;)
{
/*判斷是否有中斷到來(lái)*/
regValue = SYSSTAT1;
if((regValue & USBINT) == 0)
{
/*判斷是何種中斷,并清中斷*/
Sx2int = USB_Command_Read();
if(Sx2int &(SX2_INT_ENUMOK + SX2_INT_READY))
{
/*打開(kāi)系統(tǒng)的串口中斷*/
SysInt_Enable();
break;
}
}
else
{
/*打開(kāi)系統(tǒng)的串口中斷*/
SysInt_Enable();
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 */
MYMARK = 0;
FIFOMARK = 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( !MYMARK )
{
MYMARK = sx2EnumOK;
}
/*設(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)
{
Receiv_data(CodecReceivData);
Trans_data(CodecReceivData);
}/*CODEC CIRCLE運(yùn)行*/
/*讀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_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))
{
RecievedDataLongth = Fifolong;
for(i = 0;i<Fifolong;i++)
{
epdatar[i] = SX2_FifoReadSingle(ENDPOINT4);
}
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:
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
/*讀命令*/
case VR_BULK_READ:
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
/*寫操作*/
case VR_BULK_WRITE:
/*清空節(jié)點(diǎn)6與8*/
switch (setupBuff[2])
{
case ENDPOINT6:
/*寫入節(jié)點(diǎn)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í),設(shè)置RecievedDataLongth*/
RecievedDataLongth = 0x3f;
/*讀當(dāng)前FIFO的狀態(tài),是否已滿*/
regValue = sysreg_read(sysstat0);
FifoWriteCnt = 0;
SX2_FifoWrite(ENDPOINT6,&epdataw[0],Fifolong);
setupBuff[1] = 0;
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case ENDPOINT8:
/*寫入節(jié)點(diǎn)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í),設(shè)置RecievedDataLongth*/
RecievedDataLongth = 0x1f;
/*讀當(dāng)前FIFO的狀態(tài),是否已滿*/
regValue = sysreg_read(sysstat0);
SX2_FifoWrite(ENDPOINT8,&epdataw[0],Fifolong);
setupBuff[1] = 0;
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
}
break;
/*LED燈D5的操作*/
case VR_LED_OPTION:
switch(setupBuff[2])
{
case LED_ON:
/*點(diǎn)亮LED*/
Timer_stop();
Open_led();
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case LED_OFF:
/*關(guān)掉LED*/
Timer_stop();
Close_led();
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case LED_BLINK:
/*使D5閃爍*/
Timer_start();
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
}
break;
/*CODEC 試聽(tīng)*/
case VR_CODEC_CIRCLE:
I2c_Setup();
codec_runing = True;
Open_Codec(); // 打開(kāi)Codec
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case VR_CODEC_HALT:
codec_runing = False;
Close_Codec(); // 關(guān)閉Codec
Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
/*寫0到EP0的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
/*Endpoint0內(nèi)容的讀操作*/
case VR_ENDPOINT0READ:
/*確定Endpoint0的長(zhǎng)度*/
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ù)長(zhǎng)度*/
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的計(jì)數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*不支持的請(qǐng)求*/
/*寫非零數(shù)到SX2_SETUP,取消此請(qǐng)求*/
Write_SX2reg(SX2_SETUP, 0xff);
break;
}/*分析命令類型*/
}
else
{
/*解析IN類型的命令申請(qǐng)*/
if(setupBuff[0] == VR_TYPE_IN)
{
/*分析命令類型*/
switch(setupBuff[1])
{
/*USB工作的標(biāo)準(zhǔn)*/
case VR_USB_VERION:
if(hshostlink ==True)
{
DataToEndpoint0 = 0x55;
}
else
{
DataToEndpoint0 = 0x54;
}
Write_SX2reg(SX2_EP0BUF, DataToEndpoint0);
/*寫入要傳回的數(shù)據(jù)的長(zhǎng)度*/
Write_SX2reg(SX2_EP0BC, 1);
break;
/* SX2REGRD request */
case VR_REGREAD:
/* read the requested register */
Read_SX2reg(setupBuff[4], ®Value);
break;
case VR_ENDPOINT0WRITE:
/*確定是否有數(shù)據(jù)相*/
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;
/* write the data to the EP0 data buffer */
Write_SX2reg(SX2_EP0BUF, regValue);
/* write the byte count so the SX2 sends one byte; */
/* ignore requests for more than one byte */
Write_SX2reg(SX2_EP0BC, 1);
}
else
{
/*無(wú)數(shù)據(jù)相*/
Write_SX2reg(SX2_EP0BC, 0);
}
break;
default:
/* unsupported request */
/* write any non-zero value to the setup register
to stall the request. */
Write_SX2reg(SX2_SETUP, 0xff);
break;
}
}
else
{
/*不支持的請(qǐng)求,寫非零數(shù)到SX2_SETUP,取消此請(qǐng)求*/
Write_SX2reg(SX2_SETUP, 0xff);
}
}/*解析IN類型的命令申請(qǐng)*/
}/*關(guān)于setup中斷的處理*/
}/*自舉后進(jìn)行主程序的循環(huán)*/
}/*自舉循環(huán)*/
}
/* 指示燈XF打開(kāi)和關(guān)閉的時(shí)間長(zhǎng)度 */
void delay(void)
{
int j = 0;
int i = 0;
for(i = 0; i <0x80;i++)
{
for(j = 0;j<0xfffe;j++)
{
asm(" NOP");
}
}
}
/******************************************************************************************/
// No more
/******************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -