📄 ep0req.c
字号:
Write_SX2reg(SX2_EP0BC, 0);
break;
/*写操作*/
case VR_BULK_WRITE:
/*清空节点6与8*/
/*Write_SX2reg(SX2_INPKTEND, 0xc0);*/
switch (setupBuff[2])
{
case ENDPOINT6:
/*写入节点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);
}
/*如果发送小于整数据包的数据时,设置RecievedDataLongth*/
RecievedDataLongth = 0x3f;
/*读当前FIFO的状态,是否已满*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case ENDPOINT8:
/*写入节点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;
/*如果发送小于整数据包的数据时,设置RecievedDataLongth*/
RecievedDataLongth = 0x1f;
/*读当前FIFO的状态,是否已满*/
regValue = sysreg_read(sysstat0);
SX2_FifoWrite(ENDPOINT8,&epdataw[0],Fifolong);
/*if(hshostlink ==TRUE)
{
Write_SX2reg(SX2_INPKTEND, 0x06);
}*/
/*写0到EP0的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*写0到EP0的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case LED_OFF:
/*关掉LED*/
asm(" RSBX XF");
/*关掉定时器*/
timer_stop();
/*写0到EP0的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case LED_BLINK:
/*使XF闪烁*/
timer_start(LED_PERIOD);
/*写0到EP0的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*写0到EP0的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
}
break;
/*CODEC 寄存器的设置*/
case VR_CODEC_SET:
/*读寄存器的设置值*/
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0数据包准备好的标志*/
while(!sx2EP0Buf);
/* 清除EP0数据包准备好的标志*/
sx2EP0Buf = FALSE;
/*读数据相的数据长度*/
Read_SX2reg(SX2_EP0BC, &endpoint0count);
/*读数据相的数据*/
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的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case CODEC_FREQ_44k:
codec_sample = ADSAMPL44K;
codec_sample_rate(codec_command,codec_sample);
/*写0到EP0的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
case CODEC_FREQ_96k:
codec_sample = ADSAMPL96K;
codec_sample_rate(codec_command,codec_sample);
/*写0到EP0的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*写0到EP0的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
}
break;
/*Endpoint0内容的读操作*/
case VR_ENDPOINT0READ:
/*确定Endpoint0的长度*/
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0数据包准备好的标志*/
while(!sx2EP0Buf);
/* 清除EP0数据包准备好的标志*/
sx2EP0Buf = FALSE;
/*读数据相的数据长度*/
Read_SX2reg(SX2_EP0BC, &endpoint0count);
/*读数据相的数据*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0);
break;
default:
/*不支持的请求*/
/*写非零数到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);
/*写入要传回的数据的长度*/
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数据包准备好的标志*/
while(!sx2EP0Buf);
/* 清除EP0数据包准备好的标志*/
sx2EP0Buf = FALSE;
/*写入FLASH的操作状态*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, setupBuff[6]);
}
else
{
/*写0x20到EP0的计数寄存器,结束本次控制握手*/
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数据包准备好的标志*/
while(!sx2EP0Buf);
/* 清除EP0数据包准备好的标志*/
sx2EP0Buf = FALSE;
/*写入FLASH的操作状态*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0x40);
break;
/*FLASH的读*/
case VR_FLASH_READ:
/*等待EP0数据包准备好的标志*/
while(!sx2EP0Buf);
/* 清除EP0数据包准备好的标志*/
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的计数寄存器,结束本次控制握手*/
Write_SX2reg(SX2_EP0BC, 0x40);
break;
/* SX2REGRD request */
case VR_REGREAD:
/* read the requested register */
Read_SX2reg(setupBuff[4], ®Value);
break;
case VR_ENDPOINT0WRITE:
/*确定是否有数据相*/
if (setupBuff[6] > 0 || setupBuff[7] > 0)
{
/*等待EP0数据包准备好的标志*/
while(!sx2EP0Buf);
/* 清除EP0数据包准备好的标志*/
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
{
/*无数据相*/
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
{
/*不支持的请求,写非零数到SX2_SETUP,取消此请求*/
Write_SX2reg(SX2_SETUP, 0xff);
}
}/*解析IN类型的命令申请*/
}/*关于setup中断的处理*/
}/*自举后进行主程序的循环*/
}/*自举循环*/
}
void delay()
{
int j = 0;
int i = 0;
for(i = 0; i <0x80;i++)
{
for(j = 0;j<0xfffe;j++)
{
asm("NOP");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -