📄 usbaudio.c
字号:
//***************************************************************
//***************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 + -