?? ep0req.c
字號:
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;
/*讀當前FIFO的狀態(tài),是否已滿*/
regValue = sysreg_read(sysstat0);
FifoWriteCnt = 0;
SX2_FifoWrite(ENDPOINT6,&epdataw[0],Fifolong);
/*if(hshostlink ==TRUE)
{
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;
/*讀當前FIFO的狀態(tài),是否已滿*/
regValue = sysreg_read(sysstat0);
SX2_FifoWrite(ENDPOINT8,&epdataw[0],Fifolong);
/*if(hshostlink ==TRUE)
{
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;
/*LED燈D3的操作*/
case VR_LED_OPTION:
switch(setupBuff[2])
{
case LED_ON:
/*點亮LED*/
asm(" SSBX XF");
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case LED_OFF:
/*關(guān)掉LED*/
asm(" RSBX XF");
/*關(guān)掉定時器*/
timer_stop();
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case LED_BLINK:
/*使XF閃爍*/
timer_start(LED_PERIOD);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
}
break;
/*CODEC 寄存器的設(shè)置*/
case VR_CODEC_SET:
/*讀寄存器的設(shè)置值*/
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0數(shù)據(jù)包準備好的標志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準備好的標志*/
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]);
}
}
codec_regvalue = ((endpoint0data[1]& 0x1)<<8) + endpoint0data[0];
codec_write_reg(codec_command,setupBuff[4],codec_regvalue);
break;
/*CODEC 試聽*/
case VR_CODEC_CIRCLE:
codec_runing = TRUE;
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case VR_CODEC_HALT:
codec_halt = TRUE;
codec_play = FALSE;
DMA_DISABLE(0);
Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case VR_CODEC_FREQ:
switch(setupBuff[2])
{
case CODEC_FREQ_8K:
codec_sample = ADSAMPL8K;
codec_sample_rate(codec_command,codec_sample);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case CODEC_FREQ_44k:
codec_sample = ADSAMPL44K;
codec_sample_rate(codec_command,codec_sample);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case CODEC_FREQ_96k:
codec_sample = ADSAMPL96K;
codec_sample_rate(codec_command,codec_sample);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
}
break;
/*CODEC的錄音*/
case VR_CODEC_REV:
codec_halt =FALSE;
codec_rev = TRUE;
if(setupBuff[2] == 1)
{
codec_back = TRUE;
}
Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case VR_CODEC_PLAY:
codec_play = TRUE;
if(hshostlink ==TRUE)
{
/*使能DMA*/
DMA_ENABLE(0);
/*啟動dma*/
/* Read sample from and write back to handset codec */
audiodata = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audiodata;
}
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case VR_CODEC_DATA:
if(codec_horfull == TRUE)
{
codec_horfull = FALSE;
/*寫buffer的上半部分*/
while(!buffer_halffull){}
buffer_halffull = FALSE;
for(i = 0;i<Fifolong;i++)
{
codecdat[i] = SX2_FifoReadSingle(ENDPOINT2);
}
for(i = 0;i<Fifolong;i++)
{
codecdat[i+Fifolong] = SX2_FifoReadSingle(ENDPOINT4);
}
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
}
else
{
codec_horfull = TRUE;
/*寫buffer的下半部分*/
while(!buffer_full){}
buffer_full = FALSE;
for(i = 0;i<Fifolong;i++)
{
codecdat[i+(Fifolong *2)] = SX2_FifoReadSingle(ENDPOINT2);
}
for(i = 0;i<Fifolong;i++)
{
codecdat[i+(Fifolong *3)] = SX2_FifoReadSingle(ENDPOINT4);
}
/*寫0到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
}
break;
/*Endpoint0內(nèi)容的讀操作*/
case VR_ENDPOINT0READ:
/*確定Endpoint0的長度*/
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0數(shù)據(jù)包準備好的標志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準備好的標志*/
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工作的標準*/
case VR_USB_VERION:
if(hshostlink ==TRUE)
{
DataToEndpoint0 = 0x55;
}
else
{
DataToEndpoint0 = 0x54;
}
Write_SX2reg(SX2_EP0BUF, DataToEndpoint0);
/*寫入要傳回的數(shù)據(jù)的長度*/
Write_SX2reg(SX2_EP0BC, 1);
break;
/*FLASH擦除*/
case VR_FLASH_ERASE:
flasherr = 0;
for(flashbaddr = 0x410000; flashbaddr<0x440000; flashbaddr=flashbaddr+0x8000)
{
if(flash_erase(flashbaddr,BLOCK_ERASE) == 0)
{
flasherr = 1;
break;
}
}
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0數(shù)據(jù)包準備好的標志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準備好的標志*/
sx2EP0Buf = FALSE;
/*寫入FLASH的操作狀態(tài)*/
Write_SX2reg(SX2_EP0BUF, flasherr);
flashbaddr = FLASH_ADDR;
for(i = 0; i<(setupBuff[6]-1);i++)
{
flashdata = flash_reads(flashbaddr++);
Write_SX2reg(SX2_EP0BUF, flashdata);
}
/*寫0x20到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, setupBuff[6]);
}
else
{
/*寫0x20到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
}
break;
case VR_FLASH_WRITE:
flasherr = 0;
flashbaddr = FLASH_ADDR;
for(flashlong = 0 ;flashlong<FLash_ADDR_MAX-FLASH_ADDR;flashlong++)
{
/*
if(flash_writes(flashbaddr++,flashlong)==0)
{
//FLash無法寫入
flasherr = 1;
break;
}
*/
}
/*等待EP0數(shù)據(jù)包準備好的標志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準備好的標志*/
sx2EP0Buf = FALSE;
/*寫入FLASH的操作狀態(tài)*/
Write_SX2reg(SX2_EP0BUF, flasherr);
flashbaddr = FLASH_ADDR;
for(i = 0; i<0x3f;i++)
{
flashdata = flash_reads(flashbaddr++);
Write_SX2reg(SX2_EP0BUF, flashdata);
}
/*寫0x20到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0x40);
break;
/*FLASH的讀*/
case VR_FLASH_READ:
/*等待EP0數(shù)據(jù)包準備好的標志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準備好的標志*/
sx2EP0Buf = FALSE;
flashbaddr = FLASH_ADDR+(setupBuff[2]+(setupBuff[3]<<8));
for(i = 0; i<0x40;i++)
{
flashdata = flash_reads(flashbaddr++);
Write_SX2reg(SX2_EP0BUF, flashdata);
}
/*寫0x20到EP0的計數(shù)寄存器,結(jié)束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0x40);
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ù)包準備好的標志*/
while(!sx2EP0Buf);
/* 清除EP0數(shù)據(jù)包準備好的標志*/
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
{
/*無數(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
{
/*不支持的請求,寫非零數(shù)到SX2_SETUP,取消此請求*/
Write_SX2reg(SX2_SETUP, 0xff);
}
}/*解析IN類型的命令申請*/
}/*關(guān)于setup中斷的處理*/
}/*自舉后進行主程序的循環(huán)*/
}/*自舉循環(huán)*/
}
void delay()
{
int j = 0;
int i = 0;
for(i = 0; i <0x80;i++)
{
for(j = 0;j<0xfffe;j++)
{
asm("NOP");
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -