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

📄 usbaudio.c

📁 USB audio card 音效卡設計原理圖,說明及源碼
💻 C
📖 第 1 页 / 共 2 页
字号:
   ep0_in_empty();
}
}
//*******************************
void set_feature(unsigned char *ppacket)
{puts("set_feature");
 ep0_in_empty();
}

//*******************************
void clear_feature(unsigned char *ppacket)
{puts("clear_feature");
 ep0_in_empty();

}
//*******************************
void set_address(unsigned char* ppacket)
{ 
  out_cmd(0xd0);
  out_data(*(ppacket+2)|0x80); 
  puts("set address");  
  out_cmd(0xd8);
  out_data(0x01);
  ep0_in_empty(); 
}
//*******************************
void get_descriptor(unsigned char* ppacket)
{unsigned char wvalue;
 unsigned short wlength;
  wvalue=*(ppacket+3);
  wlength=*(ppacket+6);
  switch (wvalue){
  case 0x01:
           
{ puts("get_dev_des");
  wlength=sizeof(DeviceDescr);                //get_dev_des  
  write_ep(wlength,DeviceDescr);
   break;
  }

 case 0x02:  
             
  { puts("get_con_des");
  if (wlength!=0x09) wlength=sizeof(ConfigDescr);  //get config_des
  write_ep(wlength,ConfigDescr);  
  break;
}
case 0x03:
                                
{puts("get_string_des");       
wlength=sizeof(StringDescr);           //get string_des   
write_ep(wlength,StringDescr); 
break;
}
default: puts("unkonwn request");
}
}
//*******************************
void set_config(unsigned char* ppacket)
{puts("set_config");
 if(*(ppacket+2)==0x01) puts("set_MIC_config_state");
 else if(*(ppacket+2)==0x00) puts("set_unkown_config_state");
 else puts("set_unkown_config_state");
 ep0_in_empty();

}
//*******************************
void get_interface(unsigned char* ppacket)
{
unsigned char ep_buffer=0x01;
puts("get_interface");
while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
 out_data(0xf0);   
 out_data(0x00);
 out_data(0x01);
 out_data(0x00);
 out_cmd(0xfa);
}

//*******************************
void set_interface(unsigned char* ppacket)
{unsigned char wValue,wIndex;
 wValue=*(ppacket+2);
 wIndex=*(ppacket+4);
 if(wIndex==0x00&&wValue==0x00) puts("Set interface 0,Alt 0");
 else if(wIndex==0x01&&wValue==0x00) puts("Set interface 1,Alt 0");
 else if(wIndex==0x01&&wValue==0x01) puts("Set interface 1,Alt 1");
 else if(wIndex==0x02&&wValue==0x00) 
 {puts("Set interface 2,Alt 0");
  DAC_enable=0;
  }
 else if(wIndex==0x02&&wValue==0x01){
  puts("Set interface 2,Alt 1");
  }
 ep0_in_empty();
}
//*******************************
void vendor_req(unsigned char* ppacket)
{
}
//*******************************
void EP_set(unsigned char *ppacket)
{puts("set frequency");
 transmit_status.SET_state=FRE_CTRL;
}
//*******************************
void FU_set(unsigned char *ppacket)
{unsigned short wValue;
 wValue=*(ppacket+3);
 puts("set FU_set");
 if(wValue==0x01) transmit_status.SET_state=MUTE_CTRL;
 else if(wValue==0x02) transmit_status.SET_state=VOL_CTRL;
 else if(wValue==0x07) transmit_status.SET_state=AGC_CTRL;
//ep0_in_empty();

 }


//*******************************
void FU_get(unsigned char *ppacket)
{unsigned char bmReqtype,bRequest,ep_buffer;
 unsigned short wValue;
 ep_buffer=0x01;
 bmReqtype=*ppacket;
 bRequest=*(ppacket+1);
 wValue=*(ppacket+3);
 wValue=(wValue<<8)|(*(ppacket+2));

 if(bmReqtype==0xa1)
 {
 if (bRequest==0x81&&wValue==0x0100) 
 {puts("Mute control,GET MIN Channel 0");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
 out_data(0xf0);   
 out_data(0x00);
 out_data(0x01);
 out_data(0x00);          //01=Mute Ture,00=Mute False
  out_cmd(0xfa);}
 else if (bRequest==0x81&&wValue==0x0200) 
 {puts("GET CUR,Vol control");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x02);
  out_data(0x00);          
  out_data(0x00); //Get current Volume;
  out_cmd(0xfa);}
  
 else if (bRequest==0x81&&wValue==0x0402) 
 {puts("GET CUR MID control,Channel 2 ");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x01);
  out_data(0x00);          
  out_cmd(0xfa);}
 
  
 else if (bRequest==0x81&&wValue==0x0102) 
 {puts("GET CUR MUTE control ,Channel 2");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x01);
  out_data(0x00);          
  out_cmd(0xfa);}
  
  else if (bRequest==0x82&&wValue==0x0200) 
 {puts("GET Min Vol control");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x02);
  out_data(0x00);          
  out_data(0xC6); //Get Min Volume; 0xC600=-58db
  out_cmd(0xfa);}
   
 else if (bRequest==0x82&&wValue==0x0402) 
 {puts("GET MIN MID control Chanel 02");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x01);
  out_data(0x80);       //0x80=-32db ; 0x7f=31.75db  
  out_cmd(0xfa);}
  
  
    else if (bRequest==0x83&&wValue==0x0200) 
 {puts("GET Max,Vol control");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x02);
  out_data(0x00);          
  out_data(0x54); //Get Max Volume; 0x1400=20db
  out_cmd(0xfa);}
  
  else if (bRequest==0x83&&wValue==0x0402) 
 {puts("GET MAX ,MID control,Channel 2");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x01);
  out_data(0x7F);          
   out_cmd(0xfa);}
 
  
    else if (bRequest==0x84&&wValue==0x0200) 
 {puts("GET Res,Vol control");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x02);
  out_data(0x00);          
  out_data(0x01); //Get Max Volume; 0x0100=1db
  out_cmd(0xfa);}
  
  else if (bRequest==0x84&&wValue==0x0402) 
 {puts("GET Res,MID control,Channel 2");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x01);
  out_data(0x00);          
  out_cmd(0xfa);}
  
   else if (bRequest==0x81&&wValue==0x0700) 
 {puts("GET CUR,AGC control");
 while (ep_buffer)
{ out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
  out_data(0xf0);   
  out_data(0x00);
  out_data(0x01);
  out_data(0x00); //00=AGC False ,01=AGC true
  out_cmd(0xfa);}
  }
 
}
//*******************************
void ep0_in_empty()
{unsigned char ep_buffer=0x01;
 while (ep_buffer)
{out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
 out_cmd(0xf0);
 out_data(0x00);
 out_data(0x00);
 out_cmd(0xfa);
 } 

//************************************************

void write_ep(unsigned char wlength, unsigned char flash *des)
{ unsigned char ep_buffer=0x01;
  unsigned char i;
 
while (ep_buffer)
{out_cmd(0x01);       //select ep0_in tep_buffer=
 ep_buffer=in_data();    // 
}
 puts("write Ep0_in");
 out_cmd(0xf0);
 out_data(0x00);   
 if(wlength>0x10)
{ out_data(0x10);
  for(i=0;i<0x10;i++)
  {DATA=*des;
 //  printf("send[%d]=%x\n",i,*des);
   des++;
   wlength--;
  }
}
else 
 {out_data(wlength);
 for(i=0;i<wlength;i++)
  {DATA=(*des);
 //  printf("send[%d]=%bx\n",i,*des);
   des++;
  }
 wlength=0x00;
}
transmit_status.tran_length=wlength;
transmit_status.Pdata=des;
out_cmd(0xfa);         //valid buffer;
}

void pcm_init(unsigned short par)
{unsigned short temp;
 unsigned char i;
 
 PORTB=0xFF;
 Clr_Bit(PORTD,5);   //MCU_CRTL=0; then FMT[0:2]=PORTB[0:2] in the cpld;
 delay_time(10);
 Clr_Bit(PORTB,2);   //ML=0;
 
 for(i=16;i>0;i--){
 Set_Bit(PORTB,0);   //MC=1;
 delay_time(20);
 Clr_Bit(PORTB,0);   //MC=0;
 temp=par&((unsigned short)(1<<(i-1)));         //MD data 
 if(temp) Set_Bit(PORTB,1);
 else Clr_Bit(PORTB,1); 
 delay_time(10);         
 } 
Set_Bit(PORTB,0);  //MC=1;
delay_time(20);
Set_Bit(PORTB,2); //ML=1;
delay_time(10); 

Set_Bit(PORTD,5); //MCU_CRTL=1; then FMT[0:2]!=PORTB[0:2] in the cpld;


}

⌨️ 快捷键说明

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