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

📄 5502_usb.c

📁 DSP开发可以用来看外设情况的程序
💻 C
📖 第 1 页 / 共 2 页
字号:

/***************************************************
File:    seeddec5502usb.c
Author:  Lifeng Duan
Created: 21/11/2003

Description:Evaluates the use of SX2 with DSP

Copyright (C) SEED SEMICONDUCTOR, 2003
*****************************************************/
#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 "model.h"
#include "main.h"
#include "5502_flash.h"
#include "sysreg.h"
#include "CODEC_H"

#include "type.h"
#include "sx2.h"
#include "descriptors.h"
#include "ep0Req.h"
#include "timer.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的状态读请求*/
extern BOOL buffer_halffull;
extern BOOL buffer_full;
/* global variables specific to this test firmware */
extern unsigned char keepAliveCnt;	/* counter of Timer0 interrupts */
HANDLE codec_command =0;
HANDLE codec_data=0;

unsigned int FifoWriteCnt ;
unsigned int epdatar[512] ;
unsigned int epdataw[512] ;
unsigned int epdataw1[256];

/* MCBSP接收缓冲区 */
#pragma DATA_SECTION(codecdat,".codec_buffer")
unsigned int codecdat[0x400];

DMA_Handle MyhDma;

void main()
{
	unsigned int regValue = 0;	 /* register value from a read */
	unsigned int Sx2int = 0;     /*SX2的中断状态*/
	unsigned int Usb2or11= 0;    /*USB工作在哪一个标准上*/
	unsigned int endpoint0count = 0;/*EP0的数据长度*/
	unsigned int endpoint0data[64] ={0};/*EP0的数据缓冲区*/
	unsigned int i = 0;
	unsigned int FifoStatus24 = 0;	/*FIFO24的状态标识*/
	unsigned int FifoStatus68 = 0; 	/*FIFO68的状态标识*/
	unsigned int Fifostatus = 0;
	unsigned int Fifolong = 0;     /*FIFO的长度*/
	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定时器的次数*/
	unsigned int DataToEndpoint0 = 0;/*写入到Endpoint0的数据缓冲*/
	unsigned long flashbaddr = 0;
	unsigned int flashdata = 0;
	unsigned int flasherr = 0;
	unsigned long flashlong = 0;

	/*设置系统时钟*/
	//sys_clk(CLK160);
	/*初始化DEC5416板卡*/
	//dec5416_init();
	/*打开codec数据接口*/
	//codec_data = codec_open(CODEC_DATA);
	/*打开codec命令接口*/
	//codec_command = codec_open(CODEC_COMMAND);
	/*选择麦克风作为输入*/
	//codec_analog_mode(codec_command,0x14);
	/*设置波特率,输入与输出均为8K*/
	//codec_sample_rate(codec_command,0xd);
	/*配置系统存储器*/	
	//memory_set(0x80);
	
	/* 初始化CSL库,配置USB和定时器中断 */
	Csl_Config();
	
	/*设置系统的运行速度为160MHz*/
    PLL_setFreq(1, 0x8, 0, 1, 1, 3, 0);
  
    /*初始化DEC5502板卡*/
	//dec5502_init();
	
	/* 配置I2C */
	I2C_setup(&Setup);
    
     /*配置EMIF为全EMIF接口并初始化DSP的外部EMIF*/
    CHIP_RSET(XBSR,0x0001);
    EMIF_config(&MyEmifConfig);  
    
	/* 配置CODEC */
    Codec_Config();
    
	/*工作在USB2.0标准*/
	/*dma全局寄存器的初始化*/  
	MyDma_Config();
	        		
	for(i = 0;i<0x200;i++)
	{
		codecdat[i] = 0;
	}
	/*xf的LED灯闪三下*/
	for(i = 0;i<3;i++)
	{
		//asm(" RSBX XF");
		asm(" BCLR XF");
		delay();
		//asm(" SSBX XF");
		asm(" BSET XF");
		delay();
	}
	
	/*判断CY68001是否准备好*/
	for(;;)
	{
      /*判断是否有中断到来*/
      //regValue = sysreg_read(decintreg);
	  regValue = SYSSTAT1;
	  if((regValue & USBINT) ==0)
	  {
	  	  /*判断是何种中断,并清中断*/
		  Sx2int = USB_Command_Read();  
		  if(Sx2int &(SX2_INT_ENUMOK + SX2_INT_READY))
		  {  
		    /*打开系统的串口中断*/
		      //sysint_enable(0x4);
		      SysInt_Enable();
		      break;  
	      }  
	  }
	  else
	  {	
	   /*打开系统的串口中断*/
	    //sysint_enable(0x4);
		SysInt_Enable();
		break;  
	  }
	}
	/*自举循环*/	
	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();	/*打开系统的串口中断*/
				
		/*设置当前的接口的形式*/
		Write_SX2reg(SX2_IFCONFIG , 0xE8);
		/*设置当前系统中各使能信号的极性
		  其中SLOE、SLRD、SLWR只能有EEPROM来配置*/
		Write_SX2reg(SX2_FIFOPOLAR, SX2_WUPOL | SX2_EF | SX2_FF);
		/*读取当前工作在哪个USB的标准*/
		Read_SX2reg(SX2_FNADDR, &Usb2or11);
		hshostlink = (Usb2or11 & SX2_HSGRANT) ? True : False;
		/*初始化USB的工作状态*/
		if(hshostlink ==True)
		{
			/*工作在2.00标准,设定数字接口为16位,数据包的大小为512字节*/
			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标准,设定数字接口为16位,数据包的大小为64字节*/
			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);
		}
		/*设置FLAGSA为FIFO6的空的标志位;
		  设置FLAGSB为FIFO8的空的标志位;
		  FLAGSC与FLAGSD的状态为默认的状态*/
		Write_SX2reg(SX2_FLAGAB , SX2_FLAGA_FF6 | SX2_FLAGB_FF8); 
		/*清空所有的节点*/
		Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
		Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68);
			
		/*自举后进行主程序的循环*/
		while(sx2EnumOK)
		{
			/*CODEC CIRCLE运行*/
			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)) {};
					while(!MCBSP_rrdy(hMcbsp)){};
					
					/* Read sample from and write back to handset codec */
					//audiodata = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
					audiodata = MCBSP_read16(hMcbsp);
					//*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audiodata;
                    MCBSP_write16(hMcbsp,audiodata);
				}	
			}/*CODEC CIRCLE运行*/
			/*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)) {};
						while(!MCBSP_rrdy(hMcbsp)){};
						
						/* Read sample from and write back to handset codec */
						//epdataw[i]= *(volatile u16*)DRR1_ADDR(CODEC_DATA);
						epdataw[i]= MCBSP_read16(hMcbsp);
						
						if(codec_back == True)
						{
							//*(volatile u16*)DXR1_ADDR(CODEC_DATA) = epdataw[i];
							while(!MCBSP_xrdy(hMcbsp)) {};
							MCBSP_write16(hMcbsp,epdataw[i]);
						}	
					}
					/*送给微机数据*/
					SX2_FifoWrite(ENDPOINT6,&epdataw[0],Fifolong);
				}	
			}/*CODE 录音*/
			if(timer_status())
			{
				LedCount++;
				if(LedCount & 0x1)
				{
					/*点亮LED*/
					//asm(" SSBX XF");
					asm(" BSET XF");
				}
				else
				{
					/*关掉LED*/
					//asm(" RSBX XF");
				    asm(" BCLR XF");
				}
			}/*定时器的处理*/
			/*慢速时的CODE 回放*/
			if(codec_datok == True)
			{
				/* Wait for sample from handset */
				//if(MCBSP_XRDY(CODEC_DATA))
				if(MCBSP_xrdy(hMcbsp))
				{
					/* Read sample from and write back to handset codec */
					//*(volatile u16*)DXR1_ADDR(CODEC_DATA) = codecdat[codec_count];
					MCBSP_write16(hMcbsp,codecdat[codec_count]);
					codec_count=codec_count + 1;
					if(codec_count == 0x40)
					{
						codec_count = 0x0;
						codec_datok = False;
					}
				}		
			}/*慢速时的CODE 回放*/
			/*读FIFO状态*/
			if(FLAGS_READ)
			{
				FLAGS_READ = False;
				/*是音频传送*/
				if(codec_play == True)
				{
					if(hshostlink !=True)
					{
						/*FIFO24状态的读取*/
						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状态的读*/	
					}
					
				}/*是音频传送*/
				else/*不是音频传送*/
				{
					/*FIFO24状态的读取*/
					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);
							/*小于整数据包的数据提交SX2发送给主机*/
							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);
							/*小于整数据包的数据提交SX2发送给主机*/
							if(RecievedDataLongth<(Fifolong-1))
							{
								Write_SX2reg(SX2_INPKTEND, 0x08);	
							}	
						}	
					}/*FIFO24状态的读取*/
					/*FIFO68状态的读取*/
					if(Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68))
					{
						/*无操作,可由用户测试使用*/		
					}	
				}/*不是音频传送*/
			}/*读FIFO状态*/
			
			/*关于setup中断的处理*/
			if(sx2Setup)
			{
				/*清SETUP数据读的标志*/
				sx2Setup = False;
				/*解析OUT类型的命令申请*/
				if(setupBuff[0] == VR_TYPE_OUT)
				{
					/*分析命令类型*/
					switch(setupBuff[1])
					{	
						/*系统复位*/
						case VR_RESET:
							/*写0到EP0的计数寄存器,结束本次控制握手*/
							Write_SX2reg(SX2_EP0BC, 0);
							break;
						/*读命令*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -