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

📄 usbaudio.c

📁 USB audio card 音效卡設計原理圖,說明及源碼
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************
//***************USB AUDIO CARD SOURCE CODE IN ATMEGA162*********
//Writen by Haventchen
//2004-3-10 21:08


//ICC-AVR application builder : 2004-3-10 21:51:30
// Target : M162
// Crystal: 8.0000Mhz
#include "stdio.h"
#include <iom162v.h>
#include <macros.h>
#include "D12drv.h"


#define MUTE_CTRL 0x10
#define VOL_CTRL  0x11 
#define AGC_CTRL  0x12
#define FRE_CTRL 0x13


#define Config_des_len 0xda


#define Set_Bit(val, bitn)     (val |=(1<<(bitn)))
#define Clr_Bit(val, bitn)     (val&=~(1<<(bitn)))
                

unsigned char flag;
unsigned char DAC_enable;

struct T_status
{unsigned char tran_length;
unsigned char  SET_state;
unsigned char MUTE_set;
unsigned char AGC_set;
unsigned short VOL_set;
unsigned char flash * Pdata;
unsigned char Frequency[3]; 
unsigned char DAC_count;
unsigned char Main_len;
 }transmit_status;
 
flash unsigned char DeviceDescr[] =
{ 0x12,0x01,0x01,0x01,0x00,0x00,0x00,0x10,0xD9,0x04,0x31,0x07,     
  0x01,0x01,0x00,0x00,0x00,0x01    
};

flash  unsigned char ConfigDescr[]=
{0x09,0x02,0xda,0x00,0x03,0x01,0x00,0xa0,0x32,     //config ,3 interfaces
 0x09,0x04,0x00,0x00,0x00,0x01,0x01,0x00,0x00,     //interface0,Audio ctrl
 0x0A,0x24,0x01,0x00,0x01,0x3c,0x00,0x02,0x01,0x02, //audio ctrl Class specific descriptor,include audio streaming 1 &2
 0x0c,0x24,0x02,0x03,0x01,0x01,0x04,0x02,0x02,0x00,0x00,0x00,//Audio input terminal 1
 0x09,0x24,0x03,0x04,0x01,0x03,0x03,0x05,0x00,  //audio ouput terminal 1
 0x0c,0x24,0x02,0x01,0x01,0x02,0x02,0x01,0x00,0x00,0x00,0x00,//audio input terminal 2
 0x09,0x24,0x03,0x02,0x01,0x01,0x01,0x00,0x00,      //audio output terminal 2   
 0x08,0x24,0x06,0x05,0x03,0x01,0x02,0x00,           //Feature unit
 //Audio stream interface 1:
 0x09,0x04,0x01,0x00,0x00,0x01,0x02,0x00,0x00,     //interface 1 alt 0 (Audio stream interface) 0 ep  
 0x09,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00,     //interface 1,alt 1   1 ep
 //AS1 alt 1 ,(MIC)0x02 link to audio output terminal 2,which is PCM 8 format. 
 0x07,0x24,0x01,0x02,0x00,0x02,0x00,               //audio stream Class sepecific descriptor   
 //Format          (mono,1sample,8bits  ,8KHZ          ,8KHZ           ,11.025KHZ         ,22.05KHZ        ,44.1KHZ       ,48KHZ          ,8KHZ         
 0x1D,0x24,0x02,0x01,0x01,0x01,0x08,0x07,0x40,0x1f,0x00,0x40,0x1f,0x00,0x11,0x2B,0x00,0x22,0x56,0x00,0x44,0xAC,0x00,0x80,0xBB,0x00,0x40,0x1f,0x00,//Format type descriptor
 //MIC_Ep ,addr:82,ISO,64bytes,1packet/frame
 0x09,0x05,0x82,0x05,0x40,0x00,0x01,0x00,0x00, 
 //Class specific Ep descriptor
 0x07,0x25,0x01,0x01,0x00,0x00,0x00,                  //Ep2_in 
 //Audio stream interface 2
 0x09,0x04,0x02,0x00,0x00,0x01,0x02,0x00,0x00,     //interface 2 alt 0 (Audio stream interface) 0 ep  
 0x09,0x04,0x02,0x01,0x01,0x01,0x02,0x00,0x00,     //interface 2,alt 1   1 ep
 //AS1 alt 1 ,(Speaker)0x03 link to audio input terminal 1,which is PCM 8 format. 
 0x07,0x24,0x01,0x03,0x00,0x02,0x00,               //audio stream Class sepecific descriptor
  //Format          (mono,1sample,8bits  ,8KHZ          ,11.025KHZ           ,16KHZ         ,22.05KHZ      ,32KHZ       ,44.1KHZ          ,48KHZ         
 0x1D,0x24,0x02,0x01,0x01,0x02,0x10,0x07,0x40,0x1f,0x00,0x11,0x2B,0x00,0x80,0x3E,0x00,0x22,0x56,0x00,0x00,0x7D,0x00,0x44,0xAC,0x00,0x80,0xBB,0x00,//Format type descriptor
  //MIC_Ep ,addr:02,ISO,64bytes, 1 packet/frame
 0x09,0x05,0x02,0x0D,0x80,0x00,0x01,0x00,0x00,
 //Class specific Ep descriptor
 0x07,0x25,0x01,0x01,0x00,0x00,0x00                  //Ep2_out
 };         

 flash unsigned char StringDescr[]=
 { 
 0x16,0x03,0x54,0x00,0x76,0x00,0x46,0x00,0x6F,0x00,0x6e,0x00,0x50,0x00,
 
 0x68,0x00,0x6f,0x00,0x6e,0x00,0x65,0x00
 };
 				
void port_init(void)
{
 PORTA = 0xFF;
 DDRA  = 0x00;
 PORTB = 0x12;
 DDRB  = 0xFF;
 PORTC = 0x23; 
 DDRC  = 0xFF;
 PORTD = 0xFF;
 DDRD  = 0x20;         //PD5 output
 PORTE = 0x07;
 DDRE  = 0x05;   //USb_A0=1;CPLD=1;
}

//UART0 initialisation
// desired baud rate: 38400
// actual: baud rate:38462 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00; //disable while setting baud rate
 UBRR0L  =0x0C; //set baud rate
 UBRR0H = 0x00;
 UCSR0C = 0x86; //8bits: //note that ICCAVR set this 0x06,that is error.because 0x06 will set UBRR0H
 UCSR0A = 0x00; //enable
 UCSR0B = 0x18; //enable
}

//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 
 port_init();
 uart0_init();

 MCUCR= 0x82;        //Enable External memory.
 CLI();  //disable all interrupts
 EMCUCR = 0x00;
 
 TIMSK= 0x00; //timer interrupt sources
 ETIMSK=0x00;
 GICR= 0xC0;
 SFIOR=0x38;     //NO high address, release full PortC
 PCMSK0=0xFF;
 PCMSK1=0xFF;
  //all peripherals are now initialised
}

 
 
void main(void)
{extern int _textmode;
_textmode = 1;
 //***Reset the PCM3000
 PORTE=0x06;
 delay_time(40);
 PORTE=0x07;
 //******
 
 init_devices();             //initial the Atmega162
 uart0_init();
       
  pcm_init(0x0035);          //reg0 , 
  pcm_init(0x0135);          //reg0 ,ld
 
 pcm_init(0x0235);          //reg1 , 
 pcm_init(0x0335);          //reg1 ,ld
 
 pcm_init(0x0404);
 pcm_init(0x0608);
 
 d12_init();                //initial the PDIUSBD12
 SEI();
  while(1);
 
 }

#pragma interrupt_handler int0_isr:2
void int0_isr(void) //external interupt on INT0
{ if(DAC_enable){
  if(flag)
  {
   PORTB=DATA;
//   PORTB=0x24;
   _NOP();
   _NOP();
  PORTC=DATA;
//    PORTC=0x34;
   flag=0;
   }
else {

//PORTB=0xff;
//PORTC=0xff;
flag=1;
transmit_status.Main_len=transmit_status.Main_len-2;
if(transmit_status.Main_len==0) {
COMMAND=0xf2;
DAC_enable=0;
} 
}
}
}

#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
 unsigned char intreg1;
 unsigned char intreg2;
 unsigned char ep_buffer;
 COMMAND=0xf4;  //read int reg;
 _NOP();
 _NOP(); 
 intreg1=DATA;
 _NOP();
 _NOP();
 intreg2=DATA;
 if (intreg1&MAIN_OUT)
{COMMAND=0x44;//read last status
 _NOP();
 _NOP();
 ep_buffer=DATA;
 
 COMMAND=0x04;//select ep2_out
 _NOP();
 _NOP();
 ep_buffer=DATA;
 
COMMAND=0xf0;//select ep2_out
 _NOP();
 _NOP();
 ep_buffer=DATA;
 _NOP();
 _NOP(); 
transmit_status.Main_len=DATA;
// transmit_status.Main_len=90;
_NOP();
_NOP(); 
// COMMAND=0xf2;
 DAC_enable=1;     //enable the int0 
}
 
 else   if (intreg1&BUS_RST)  bus_reset();
 else   if (intreg1&EP0_IN) ep0_in();
 else   if (intreg1&EP0_OUT) ep0_out();
 }


//*****************************
void bus_reset()
{puts("Bus_reset\n");
}
//*****************************
//*****************************

//*****************************
void ep0_in()
{unsigned char last_status_in;
unsigned short ep_buffer;
 //puts("Ep0_in int");
 out_cmd(0x41);   //read last status
 last_status_in=in_data();
 ep_buffer=transmit_status.tran_length;
 if(ep_buffer!=0)
{write_ep(ep_buffer,transmit_status.Pdata);
}
}
//*****************************
void ep0_out()
{
 unsigned char last_status_out,ep_buf1;     
 unsigned short ep_buffer;
 unsigned char packet[8];
 unsigned char i,length,EP0_status;
 unsigned char *ppacket;
  ppacket=packet;
// puts("Ep0_out int!");
 out_cmd(0x40);//read last status
 last_status_out=in_data();
 
 out_cmd(0x00);//select ep0_out
 EP0_status=in_data();
 
 out_cmd(0xf0); //read ep0_buffer
 ep_buffer=in_data();
 length=in_data();
  //printf("last_status=%x,EP0_status=%x,length=%x\n",last_status_out,EP0_status,length);
if (last_status_out&0x20)              ///if this is setuppacket
{
for (i=0;i<length;i++) 
{packet[i]=in_data();
// printf("packet=%x\n",packet[i]);
}

out_cmd(0x00);       //select ep0_outep_buffer
ep_buffer=in_data();    //ack 
out_cmd(0xf1);

out_cmd(0x01);       //select ep0_in
ep_buffer=DATA;     //ack
out_cmd(0xf1);


out_cmd(0x00);       //select ep0_out
ep_buffer=in_data();    //clear buffer 
out_cmd(0xf2);

//printf("request=%x,value=%x,index=%x,length=%x\n",packet[1],packet[2],packet[4],packet[6]);
//printf("last=%bx\n",last_status_out);
if(packet[1]==0x05)      set_address(ppacket);         //this is usb_request
else if(packet[1]==0x06) get_descriptor(ppacket);          
else if(packet[1]==0x09) set_config(ppacket);
else if(packet[1]==0x0a) get_interface(ppacket);
else if(packet[1]==0x0b) set_interface(ppacket);
else if(packet[1]==0x03) set_feature(ppacket);
else if(packet[1]==0x02) vendor_req(ppacket);
else if (packet[0]==0x21&&packet[1]==0x01) FU_set(ppacket); 
else if (packet[0]==0x22&&packet[1]==0x01) EP_set(ppacket);
else if (packet[1]==0x01)clear_feature(ppacket);
else if (packet[1]&0x80) FU_get(ppacket);

}
else if(length!=0)       //if it is not setup packet
{  switch (transmit_status.SET_state)
   {case 0x10:
   {transmit_status.MUTE_set=in_data();
    if(transmit_status.MUTE_set==0x01) puts("Mute!!!");
    else puts("No Mute!");
	//printf("Mute_set=%x\n",transmit_status.MUTE_set);
	break;}
    case 0x11:
	{ep_buffer=in_data();
	 ep_buf1=in_data();
	transmit_status.VOL_set=(ep_buffer<<8)|ep_buf1;
	//printf("VOL_set=%x\n",transmit_status.VOL_set);
	break;
	}
	case 0x12:
	{transmit_status.AGC_set=in_data();
	//printf("AGC_set=%x\n",transmit_status.AGC_set);
	break;}
    case 0x13:
	{transmit_status.Frequency[0]=in_data();
	 transmit_status.Frequency[1]=in_data();
	 transmit_status.Frequency[2]=in_data();
	 if(transmit_status.Frequency[0]==0x40)	 puts("Fre=8khz");
	 else if(transmit_status.Frequency[0]==0x11)	 puts("Fre=11.025khz");
	 else if(transmit_status.Frequency[1]==0x3E)	 puts("Fre=16khz");
	 else if(transmit_status.Frequency[0]==0x22)	 puts("Fre=22.05khz");
	 else if(transmit_status.Frequency[0]==0x00)	 puts("Fre=32khz");
	 else if(transmit_status.Frequency[0]==0x44)	 puts("Fre=44.1khz");
	 else if(transmit_status.Frequency[1]==0xBB)	 puts("Fre=48khz");
	// printf("Fre_set=%x,%x,%x\n",transmit_status.Frequency[0],transmit_status.Frequency[1],transmit_status.Frequency[2]);
	break;}
	
	}
   out_cmd(0x00);       //select ep0_out
   ep_buffer=in_data();    //clear buffer
   out_cmd(0xf2);

⌨️ 快捷键说明

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