?? wtaudioplay.c
?? MCF5249的音頻驅(qū)動程序,可以實(shí)現(xiàn)PCM的實(shí)時播放和采集
?? C
?? 第 1 頁 / 共 3 頁
字號:
??
//****************************************************************//*** For 5249 AudioPlay//****************************************************************#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/stat.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/wait.h>#include <time.h>#include <sys/time.h>#include <signal.h>#include <unistd.h>#include <fcntl.h>#include <malloc.h>#include <sys/mman.h>#include <sys/ioctl.h>#include <signal.h>//***************************************************************#define WT_AUDIO#define _AUDIO_ADPCM_ //#define _AUDIO_PCM_ //#define _AUDIO_UPCM_ //#define _AUDIO_APCM_ //#define AUDIO_RECODE#define AUDIO_PLAYBACK//#define RX_IRQ#define DMA_TEST#define HAVE_MAP//**********************************************************//Data type define#define DWORD unsigned long#define BYTE unsigned char#define WORD unsigned short#define INDATA_T unsigned short#define OUTDATA_T unsigned long//typedef INDATA_T * pInData;//typedef OUTDATA_T * pOutData;typedef void AU_SEND(void* indata, OUTDATA_T* outdata,int nSrcSize, BYTE *private);#define R4(indata, x) (indata>>((x-1)*4))//***************************************************************//*** for debug **#define DEBUG 1#ifdef DEBUG#define PDEBUG(fmt, args...) printf(fmt,##args)#define KDEBUG(fmt, args...) printk("KDEBUG: "fmt, ##args)#else#define PDEBUG(fmt, args...)#define KDEBUG(fmt, args...)#endif//***************************************************************#define VIDEOBLOCKNUM (1024) #define VIDEORAW (512)#define VIDEOHEAD (20) #define VIDEOPACKSIZE (VIDEORAW+VIDEOHEAD)#define VIDEOBUFSIZE (sizeof(char)*VIDEOBLOCKNUM*VIDEOPACKSIZE)#define LEAFLET (8) //READ LEAFLET PACKAGE FORM VIDEO DRIVER#define APACKCOUNT (512) //(AUDIOBUFSIZE/ADSAMP_PER_PACK)#define ADSAMP_PER_PACK ((508-4)*2+1) // 1009#define USAMP_PER_PACK (508)#define APCMPACKSIZE (508)//#define UPCMPACKSIZE ((508-4)*2+1)#define AUDIOBUFSIZE (APACKCOUNT*ADSAMP_PER_PACK)//#define AUDIOPACKSIZE (PACKSIZE*8)#define DELAY (2)#define RECODERSIZE (4*120)#define AUDIO_ENCODING_ULAW (1) /* ISDN u-law */#define AUDIO_ENCODING_ALAW (2) /* ISDN A-law */#define AUDIO_ENCODING_LINEAR (3) /* PCM 2's-complement (0-center) */#define AUDIO_ENCODING_ADPCM (4) /*IMA ADPCM */#define BUFFERINC(x,y,z) ((x+y)%z) //z: num of package y: inc x: indicate//**************************************************typedef struct WTAudioStream{ int coding; AU_SEND *AudioSend; BYTE * destBuffer; int destBufSize; int nDestTag; int nOutPSize; //send package size char *private; }WTAudioStream;typedef struct WTMediaStream{ BYTE * srcBuffer; int srcBufSize; int nSrcTag; int nInPSize; //send package size int nInBSize; WORD ChnNo; WORD MediaType; WORD FrameSize;}WTMediaStream;// audio devicetypedef struct WTAudio_dev{ int major; int tx_irq; int tx_nBufT; int tx_nBufB; int tx_nDmaStart; int tx_nDmaCount; //unsigned long SysDelay; unsigned long mmstart; //buffer base addr unsigned long mmsize; //buffer size = packsize*packcount unsigned long dmasize; //dma buffer size = packsize*dmasize unsigned long packsize; //adpcm:1009 upcm: 508 unsigned long mmcount; // mmsize/packsize unsigned long dmacount; // dmssize/packsize#ifdef AUDIO_RECODE int rx_nBufT; int rx_nBufB; //int rx_nDmaCount; unsigned long rxmmstart; //mmstart+mmsize unsigned long rxmmsize; // unsigned long rxpacksize; // unsigned long rxmmcount; //rxmmsize/rxpacksize#endif}WTAudio_dev;typedef struct WTDevBufStatus{ int tx_nBufT; int tx_nBufB; int tx_nDmaStart;}WTDevBufStatus;//**************************//unsigned char *VBuffer; //video buffer map from kernel (wtmpeg)//unsigned char *ABuffer; //audio buffer map from kernel (wtaudio)//int nVRD = 0; //indicate the read offset from video buffer base//int nAWR = 0;WTAudioStream AU_Stream = {AUDIO_ENCODING_ADPCM,NULL,NULL,AUDIOBUFSIZE,0, ADSAMP_PER_PACK,NULL};WTMediaStream VU_Stream = {NULL,VIDEOBUFSIZE,0,VIDEOPACKSIZE,LEAFLET,0,0,0};//**************************//*************************************//** audio ioctl ***#define IOC_MAGIC ('k')#define IOCASTOP _IO(IOC_MAGIC,0)#define IOCASTART _IO(IOC_MAGIC,1)#define IOCASPACKSIZE _IOW(IOC_MAGIC,2,int)#define IOCAGDEVBUFSTATUS _IOR(IOC_MAGIC,3,sizeof(WTDevBufStatus))#define IOCAGDEVSTATUS _IOR(IOC_MAGIC,4,sizeof(WTAudio_dev)) #define IOCASRXSTART _IO(IOC_MAGIC,5)//#define IOCASDELAYSIZE _IOW(IOC_MAGIC,5,int)//** video ioctl ***#define IOCVGSTATUE _IOR(IOC_MAGIC,0,int)//*************************************#ifdef _MCF5249_//Define base address#define IME_MBAR 0x30000000#define MCF_MBAR 0x10000000#define MCF_MBAR2 0x80000000//ime6400 Register define#define BaseAddress0 (0x12<<1)#define BaseAddress1 (0x14<<1)#define Status (0x1e<<1)#define Data (0x02<<1)#define Command 0x00#define User0 (0x04<<1)#define User4 (0x0c<<1)#define User3 (0x0a<<1)#define EncodedStream (0x10<<1)#else //Define base address#define IME_MBAR 0x01000000#define MCF_MBAR 0x10000000//ime6400 Register define#define BaseAddress0 0x12#define BaseAddress1 0x14#define Status 0x1e#define Data 0x02#define Command 0x00#define User0 0x04#define User4 0x0c#define User3 0x0a#define EncodedStream 0x10#endif//=======================Get config parameters =======================#define SERVER_IP 0#define SERVER_PORT 1#define DEVICE_IP 2#define DEVICE_NETMASK 3#define DEVICE_BROADCAST 4#define DEVICE_GW 5#define STREAM_TYPE 6#define VIDEO_FORMAT 7#define VIDEO_FRAME_RATE 8#define VIDEO_ENCODE_TYPE 9#define I_FRAME_INTERVAL 10#define BITRATE_CONTROL 11#define CBR_TARGET_BITRATE 12#define VBR_INIT_QUALITY 13#define HYBRID_BITRATE_MIN 14#define HYBRID_BITRATE_MAX 15#define MPEG1L2_AUDIO 16#define ADPCM_AUDIO 17#define CF_VALUE 18#define COMMAND_TYPE 19#define BASE_SIGN 20 //98 #define AMOUNT_CHANNEL 21 // 99#define BRIGHT 22//24#define CONTRAST 23//25//============================================================char *MPEGConfig[]={"","","","","","","system","PAL 352*288","1","I/P", "32","Vbr","320","10","400","400","","ADPCM","32","","270091000","128","128"};//global #ifdef AUDIO_RECODE//int AudioIN;#endifint VideoIN, AudioID;//******************************************//*** Function ****//******************************************// Big-endian <==> Little-endian#ifdef _REVERSE_#define Reverse16(r) (((WORD)r<<8)|((WORD)r>>8))#else#define Reverse16(r) (r)#endif//*** pointer for mem space#define mcf32p(r) ((DWORD *) (r))#define mcf16p(r) ((WORD *) (r))#define mcf8p(r) ((BYTE *) (r))//*** pointer for mbar register#define mcfReg32p(r) (mcf32p(MCF_MBAR + (r)))#define mcfReg16p(r) (mcf16p(MCF_MBAR + (r)))#define mcfReg8p(r) (mcf8p(MCF_MBAR + (r)))#ifdef _MCF5249_//*** pointer for 5249 mbar2 register#define mcf2Reg32p(r) (mcf32p(MCF_MBAR2 + (r)))#define mcf2Reg16p(r) (mcf16p(MCF_MBAR2 + (r)))#define mcf2Reg8p(r) (mcf8p(MCF_MBAR2 + (r)))#endif//*** pointer for ime6400 register#define I6400Reg32p(r) (mcf32p(IME_MBAR + (r)))#define I6400Reg16p(r) (mcf16p(IME_MBAR + (r)))#define I6400Reg8p(r) (mcf8p(IME_MBAR + (r)))//******** the old functions//===========================mcf Access =====================#define M5272ReadMem(r) (*mcf32p(r))#define M5272ReadReg(r) (*mcfReg32p(r))#define M5272WriteReg(x, y) (mcf32Write(x,y))inline void mcf32Write(DWORD dIndex,DWORD dValue){ *(mcfReg32p(dIndex))=dValue; return;}//===========================IME 6400 Access =====================#define I6400ReadReg(r) (Reverse16(*I6400Reg16p(r)))inline void I6400WriteReg(DWORD dIndex,WORD wValue){ *(I6400Reg16p(dIndex))=Reverse16(wValue); return;}WORD I6400ReadMem(DWORD dAddr){ WORD wRet; WORD wUpper16,wLower16; wUpper16=dAddr>>16; wLower16=dAddr&0xFFFF; I6400WriteReg(BaseAddress1,wUpper16); I6400WriteReg(BaseAddress0,wLower16); I6400WriteReg(Command,0x00); while((I6400ReadReg(Status)&0x0001)==0); wRet=I6400ReadReg(Data); return wRet;}void I6400WriteMem(DWORD dAddr,WORD wValue){ WORD wUpper16,wLower16; wUpper16=dAddr>>16; wLower16=dAddr&0xFFFF; I6400WriteReg(BaseAddress1,wUpper16); I6400WriteReg(BaseAddress0,wLower16); I6400WriteReg(Data,wValue); I6400WriteReg(Command,0x01); while((I6400ReadReg(Status)&0x0001)==0); //printf("Write IME6400 Address %x successfully\n",dAddr); return;}int ReadValue(char *value, int index,int nChannel){ sprintf(value,"%s",MPEGConfig[index*nChannel]);}//==============829===============// IIC GROUPtypedef struct _UserIICTab { DWORD user_iic_ctrl; //big endian DWORD user_iic_data; }UserIICTab;//==================BT829=====================//index is 0,1,2 for NTSC// 4,5,6,7 for PAL//for NTSCUserIICTab BT829_320x240[] = { //index 0 {0x00880400, 0x00580011}, {0x04880400, 0x1ce04040}, //{0x04880400, 0x16e04040}, old {0x08880400, 0x14d80020}, //{0x08880400, 0x14f00020}, old {0x0c880400, 0xd8feb400}, {0x10880400, 0x00cf0640}, {0x14880400, 0x00010070}, {0x18880400, 0x685d8200}, {0x1c880300, 0x00007f00}, {0x00000000, 0x00000000}};UserIICTab BT829_640x480[] = { //index 1 {0x00880400, 0x00580012},// ; 0x00~0x03 {0x04880400, 0x1ce0a083}, //{0x04880400, 0x1ce07e80},// ; 0x04~0x07 //{0x04880400, 0x16e07880}, old {0x08880400, 0x028c0020},// ; 0x08~0x0b //{0x08880400, 0x02ac0020}, //old {0x0c880400, 0xd8feb400},// ; 0x0c~0x0f {0x10880400, 0x00cf0660},// ; 0x10~0x13 {0x14880400, 0x00010070},// ; 0x14~0x17 {0x18880400, 0x685d8200},// ; 0x18~0x1b {0x1c880300, 0x00007f00},// ; 0x1c~0x1e {0x00000000, 0x00000000}};//==============================================UserIICTab BT829_640x240[] = { //index 1 {0x00880400, 0x00580012},// ; 0x00~0x03 {0x04880400, 0x1ce0a080}, {0x08880400, 0x028c0020},// ; 0x08~0x0b {0x0c880400, 0xd8feb400},// ; 0x0c~0x0f {0x10880400, 0x00cf0640},// ; 0x10~0x13 {0x14880400, 0x00010070},// ; 0x14~0x17 {0x18880400, 0x685d8200},// ; 0x18~0x1b {0x1c880300, 0x00007f00},// ; 0x1c~0x1e {0x00000000, 0x00000000}};//==============================================UserIICTab BT829_720x480[] = { //index 2 {0x00880400, 0x00580012},// ; 0x00~0x03 {0x04880400, 0x16e080d0},// ; 0x04~0x07 {0x08880400, 0x00f80020},// ; 0x08~0x0b {0x0c880400, 0xd8feb400},// ; 0x0c~0x0f {0x10880400, 0x00cf0660},// ; 0x10~0x13 {0x14880400, 0x00010070},// ; 0x14~0x17 {0x18880400, 0x685d8200},// ; 0x18~0x1b {0x1c880300, 0x00007f00},// ; 0x1c~0x1e {0x00000000, 0x00000000}};//for PALUserIICTab BT829_320x288[] = { //index 4 {0x00880400, 0x00580021},//; 0x00~0x03 {0x04880400, 0x16404880},//; 0x04~0x07 {0x08880400, 0x1a090020},//; 0x08~0x0b {0x0c880400, 0xd8feb400},//; 0x0c~0x0f {0x10880400, 0x00cf0640},//; 0x10~0x13 {0x14880400, 0x00010070},//; 0x14~0x17 {0x18880400, 0x7f728200},//; 0x18~0x1b {0x1c880300, 0x00007f00},//; 0x1c~0x1e {0x00000000, 0x00000000}};UserIICTab BT829_352x288[] = { //index 5 {0x00880400, 0x005b0021},// ; 0x00~0x03 {0x04880400, 0x1c404860 },// ; 0x04~0x07 //{0x04880400, 0x16404860 }, {0x08880400, 0x1a090020},// ; 0x08~0x0b {0x0c880400, 0xd8feb400},// ; 0x0c~0x0f {0x10880400, 0x00cf0540},// ; 0x10~0x13 {0x14880400, 0x00010070},// ; 0x14~0x17 {0x18880400, 0x7f728200},// ; 0x18~0x1b {0x1c880300, 0x00007f00},// ; 0x1c~0x1e {0x00000000, 0x00000000}};UserIICTab BT829_704x576[] = { //index 6 {0x00880400, 0x18d30022},//; 0x00~0x03 {0x04880400, 0x20408dc0},//; 0x04~0x07 //{0x04880400, 0x204086c0}, old //{0x08880400, 0x05040020},//; 0x08~0x0b {0x08880400, 0x05040030},//; 0x08~0x0b {0x0c880400, 0xd8feb400},//; 0x0c~0x0f {0x10880400, 0x00cf0660},//; 0x10~0x13 {0x14880400, 0x00010070},//; 0x14~0x17 {0x18880400, 0x7f728200},//; 0x18~0x1b {0x1c880300, 0x00007f00},//; 0x1c~0x1e {0x00000000, 0x00000000}};//================================================UserIICTab BT829_704x288[] = { //index 6 {0x00880400, 0x18d30022},//; 0x00~0x03 {0x04880400, 0x20408dc0},//; 0x04~0x07 {0x08880400, 0x05040030},//; 0x08~0x0b {0x0c880400, 0xd8feb400},//; 0x0c~0x0f {0x10880400, 0x00cf0640},//; 0x10~0x13 {0x14880400, 0x00010070},//; 0x14~0x17 {0x18880400, 0x7f728200},//; 0x18~0x1b {0x1c880300, 0x00007f00},//; 0x1c~0x1e {0x00000000, 0x00000000}};//================================================UserIICTab BT829_720x576[] = { //index 7 {0x00880400, 0x18d30022},//; 0x00~0x03 {0x04880400, 0x204086d0},//; 0x04~0x07 {0x08880400, 0x05040020},//; 0x08~0x0b {0x0c880400, 0xd8feb400},//; 0x0c~0x0f {0x10880400, 0x00cf0660},//; 0x10~0x13 {0x14880400, 0x00010070},//; 0x14~0x17 {0x18880400, 0x7f728200},//; 0x18~0x1b {0x1c880300, 0x00007f00},//; 0x1c~0x1e {0x00000000, 0x00000000}};UserIICTab BT829p_640x480[] ={ //index 8 {0x00880400, 0x00580022},//0x00~0x03 {0x04880400, 0x1f388380},//0x04~0x07 {0x08880400, 0x070c0030},//0x08~0x0b {0x0c880400, 0xd8feb400},//0x0c~0x0f {0x10880400, 0x00cf067f},//0x10~0x13 {0x14880400, 0x9a010070},//0x14~0x17 {0x18880400, 0x7f728200},//0x18~0x1b {0x1c880300, 0x00007f00},//0x1c~0x1e {0x00000000, 0x00000000}}; void I6400WriteUserIIC(UserIICTab * pUserIIC,DWORD dev_id){ DWORD dwData; DWORD dwAddress; while(pUserIIC->user_iic_ctrl) { dwData=pUserIIC->user_iic_data; I6400WriteMem(0x2026,dwData>>16); //user_iic_data Upper 16bits write I6400WriteMem(0x2024,dwData&0xFFFF); //user_iic_data Lower 16bits Write //start,write bit starting dwData=pUserIIC->user_iic_ctrl|0x00000003|(dev_id<<16); I6400WriteMem(0x2022,dwData>>16); //user_iic_ctrl Upper 16bits write I6400WriteMem(0x2020,dwData&0xFFFF); //user_iic_ctrl Lower 16bits write dwAddress=0x2020; while(1) { WORD wLower16=I6400ReadMem(0x2020); if((wLower16&0x0002)==0) break; } pUserIIC++; } I6400WriteMem(0x2020,0); return;}// Initial IIC void SetBright(char bt)//default 0{ DWORD dwData; DWORD dwAddress; //while(pUserIIC->user_iic_ctrl) // { //dwData=pUserIIC->user_iic_data; dwData = bt<<24; //printf("Write date:%x\n",dwData); I6400WriteMem(0x2026,dwData>>16); //user_iic_data Upper 16bits write I6400WriteMem(0x2024,dwData&0xFFFF); //user_iic_data Lower 16bits Write //start,write bit starting dwData=0x0a880103; I6400WriteMem(0x2022,dwData>>16); //user_iic_ctrl Upper 16bits write I6400WriteMem(0x2020,dwData&0xFFFF); //user_iic_ctrl Lower 16bits write dwAddress=0x2020; while(1) { WORD wLower16=I6400ReadMem(0x2020); if((wLower16&0x0002)==0) break; } // pUserIIC++; // } I6400WriteMem(0x2020,0); return;}void SetContrast(BYTE bt)//default 126{ DWORD dwData; DWORD dwAddress; //while(pUserIIC->user_iic_ctrl) // { //dwData=pUserIIC->user_iic_data; dwData = bt<<24; //printf("Write date:%x\n",dwData); I6400WriteMem(0x2026,dwData>>16); //user_iic_data Upper 16bits write I6400WriteMem(0x2024,dwData&0xFFFF); //user_iic_data Lower 16bits Write //start,write bit starting dwData=0x0C880103; I6400WriteMem(0x2022,dwData>>16); //user_iic_ctrl Upper 16bits write
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -