⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ep0req.c

📁 5416完整例程
💻 C
📖 第 1 页 / 共 2 页
字号:
							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], &regValue);
								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 + -