亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uda1341ts.c.svn-base

?? 本驅動是 s3c2410 聲卡驅動,實現了 mp3,wav格式的音頻文件的播放 
?? SVN-BASE
字號:

#include "config.h"
#include "lib.h"

#ifdef _DEBUG
#include <stdio.h>
#endif /* _DEBUG */

#define L3CLOCK  (0x10)   /*(1<<4) GPB4 = L3CLOCK*/
#define L3DATA   (0x8)    /*(1<<3) GPB3 = L3DATA */
#define L3MODE   (0x4)    /*(1<<2) GPB2 = L3MODE */

#define GPB2_OUTPUT  (0x1 << 4) /* set output */
#define GPB3_OUTPUT  (0x1 << 6)
#define GPB4_OUTPUT  (0x1 << 8)
	 
#define GPE0_I2SLRCK  (0x2 << 0)
#define GPE1_I2SSCLK  (0x2 << 2)
#define GPE2_CDCLK    (0x2 << 4)
#define GPE3_I2SSDI   (0x2 << 6)
#define GPE4_I2SSDO   (0x2 << 8)
  
#define L3MODE_LOW()  {GPBDAT &= ~(L3MODE);}
#define L3MODE_HIGH() {GPBDAT |= (L3MODE);}
#define L3DATA_LOW()  {GPBDAT &= ~(L3DATA);}
#define L3DATA_HIGH() {GPBDAT |= (L3DATA);}
#define L3CLOCK_LOW()  {GPBDAT &= ~(L3CLOCK);}
#define L3CLOCK_HIGH() {GPBDAT |= (L3CLOCK);}

#define UDA1341_ADDR		((1 << 2) + (1 << 4))  /*0x14*/

#define UDA1341_REG_DATA0 	(0 << 0) /*0x0*/
#define UDA1341_REG_STATUS	(2 << 0) /*0x2*/

#define UDA1341_EXT_ADDR ((1 << 7) + (1 << 6)) /*0xC0*/

#define VOLUME_MAX   ((1 << 5) + (1 << 4) + (1 << 3) + (1 << 2) + (1 << 1) + (1 << 0))  /*0x3F*/
#define BASS_MAX     ((1 << 3) + (1 << 2) + (1 << 1) + (0 << 0))  /*0xE*/
#define TREBLE_MAX   ((1 << 1) + (1 << 0))     /*0x3*/

#define NO_RESET     (0x0 << 6)
#define RESET        (0x1 << 6)

#define _SC_256_FS

#ifdef  _SC_256_FS
#define EXTCLK_FRE	 (0x2 << 4)
#define MASCLK_FRE   (0x0 << 2)
#define SYSTEM_CLK   256

#else
#define EXTCLK_FRE   (0x1 << 4)
#define MASCLK_FRE   (0x1 << 2) 
#define SYSTEM_CLK   384     

#endif

#define IF_IIS			(0x0 << 1)
#define IF_LSB_16		(0x1 << 1)
#define IF_LSB_18		(0x2 << 1)
#define IF_LSB_20		(0x3 << 1)
#define IF_MSB			(0x4 << 1)

#define NO_DC_FLITERING         (0x0 << 0)
#define DC_FLITERING            (0x1 << 1)

#define TR_DMA_DISABLE          (0x0 << 5)
#define TR_DMA_ENABLE           (0x1 << 5)

#define RE_DMA_DISABLE          (0x0 << 4)
#define RE_DMA_ENABLE           (0x1 << 4)

#define TR_CHA_NO_IDLE          (0x0 << 3)
#define TR_CHA_IDLE             (0x1 << 3)

#define RE_CHA_NO_IDLE          (0x0 << 2)
#define RE_CHA_IDLE             (0x1 << 2)

#define IIS_PSR_DISABLE         (0x0 << 1)
#define IIS_PSR_ENABLE          (0x1 << 1)

#define IIS_INTFCE_ STOP        (0x0 << 0)
#define IIS_INTFCE_START        (0x0 << 0)

#define IIS_MASTER_MOD          (0x0 << 8)
#define IIS_SLAVE_MOD           (0x1 << 8)

#define IIS_NO_TR               (0x0 << 6)
#define IIS_RE_MOD              (0x1 << 6)
#define IIS_TR_MOD              (0x2 << 6)
#define IIS_RE_TR_MOD           (0x3 << 6)

#define IIS_LOW_LCHA            (0x0 << 5)
#define IIS_HIGH_LCHA           (0x1 << 5)

#define IIS_COMP_FORMAT         (0x0 << 4)
#define MSB_JUST_FORMAT         (0x1 << 4)

#define PER_CHA_8bit            (0x0 << 3)
#define PER_CHA_16bit           (0x1 << 3)

#define SBCLK_FRE_16fs          (0x0 << 0)
#define SBCLK_FRE_32fs          (0x1 << 0)
#define SBCLK_FRE_48fs          (0x2 << 0)

#define TR_FIFO_NOR             (0x0 << 15)
#define TR_FIFO_DMA             (0x1 << 15)

#define RE_FIFO_NOR             (0x0 << 14)
#define RE_FIFO_DMA             (0x1 << 14)

#define TR_FIFO_DISABLE         (0x0 << 13)
#define TR_FIFO_ENABLE          (0x1 << 13)

#define RE_FIFO_DISABLE         (0x0 << 12)
#define RE_FIFO_ENABLE          (0x1 << 12)

static int g_volume = 80, g_bass = 0, g_treble = 0, g_mute = 0;

static
void L3_write_addr(unsigned char data)
{
	int i,j;
	
	L3MODE_LOW();
	L3CLOCK_HIGH();
	
	for(j=0;j<4;j++)             /*L3 set up time > 190ns */
	     ;
	     
	for(i=0;i<8;i++)
	{
		if(data&0x1)
		{
				L3CLOCK_LOW();
				L3DATA_HIGH();
				for(j=0;j<4;j++)       /*L3 clock cycle time > 500ns */
				   ;
				L3CLOCK_HIGH();
				L3DATA_HIGH();
				for(j=0;j<4;j++)
				   ;
		}
		else
		{
			L3CLOCK_LOW();
			L3DATA_LOW();
			for(j=0;j<4;j++)
			   ;
			L3CLOCK_HIGH();
			L3DATA_LOW();
			for(j=0;j<4;j++)
			   ;
		}
		data >>= 1;			
	}
	L3CLOCK_HIGH();
	L3MODE_HIGH();
	
}

static
void L3_write_data(unsigned char data, int halt)
{
	int i,j;
	
	if(halt)
	{
		L3CLOCK_HIGH();
		for(j=0;j<4;j++)              /*tstp(L3) > 190ns */
		   ;
	}
	
	L3CLOCK_HIGH();
	L3MODE_HIGH();
	for(j=0;j<4;j++)               /*tsu(L3) > 190ns */
	    ;
	
	for(i=0;i<8;i++)
	{
		if(data & 0x1)
		{
			L3MODE_HIGH();
			L3CLOCK_LOW();
			L3DATA_HIGH();
			for(j=0;j<4;j++)
			   ;
			L3MODE_HIGH();
			L3CLOCK_HIGH();
			L3DATA_HIGH();
			for(j=0;j<4;j++)
			   ;
		}
		else
		{
			L3MODE_HIGH();
			L3CLOCK_LOW();
			L3DATA_LOW();
			for(j=0;j<4;j++)
			   ;
			L3MODE_HIGH();
			L3CLOCK_HIGH();
			L3DATA_LOW();
			for(j=0;j<4;j++)
			   ;
		}
		data >>= 1; 
	}
	L3CLOCK_HIGH();
	L3MODE_HIGH();
}

void set_volume(int val)
{
	if(val < 0)
		val = 0;
	if(val > 100)
		val = 100;
  
  g_volume = val;
  
	val = VOLUME_MAX - (val * VOLUME_MAX) / 100;

	L3_write_addr( UDA1341_ADDR + UDA1341_REG_DATA0 );
	L3_write_data(val, 0);
}

void set_bass(int val)
{
	if(val < 0)
		val = 0;
	if(val > 100)
		val = 100;
		
  g_bass = val;
  
	val = BASS_MAX - (val * BASS_MAX) / 100;
	
	val = (1 << 6) + (val << 2) + (TREBLE_MAX - (g_treble * TREBLE_MAX) / 100);
	
	L3_write_addr( UDA1341_ADDR + UDA1341_REG_DATA0 );
	L3_write_data(val,0);
	
}

void set_treble(int val)
{
	if(val < 0)
		val = 0;
	if(val > 100)
		val = 100;
		
	g_treble = val;
  
	val = TREBLE_MAX - (val * TREBLE_MAX) / 100;
	
	val = (1 << 6) + ((BASS_MAX - (g_bass * BASS_MAX) / 100) << 2) + val;

	L3_write_addr( UDA1341_ADDR + UDA1341_REG_DATA0 );
	L3_write_data(val, 0);
}

void set_mute(int val)
{
  g_mute = (val != 0);
	val = (1 << 7) + (1 << 5) + (0 << 3) + (val ? (1 << 2) : 0) + 0;	

	L3_write_addr( UDA1341_ADDR + UDA1341_REG_DATA0 );
	L3_write_data(val, 0);
}

void init_uda1341ts(int mode)
{
	/*
	 * L3MODE   GPB2
	 * L3DATA   GPB3
	 * L3CLOCK  GPB4
	*/
	GPBCON &= (~0x3F0);
	GPBCON |= (GPB4_OUTPUT | GPB3_OUTPUT | GPB2_OUTPUT);
	GPBUP = GPBUP | 0x1c;	
	
	L3MODE_HIGH();
	L3CLOCK_HIGH();
	
	/* 0,1,10,000,0:reset,256fs,iis,no dcfilter */
	L3_write_addr( UDA1341_ADDR + UDA1341_REG_STATUS );
	L3_write_data( RESET + EXTCLK_FRE + IF_IIS + NO_DC_FLITERING, 0 );  
	
	/*0,0,10,000,0:no reset,256fs,iis,no dcfilter */
	L3_write_addr( UDA1341_ADDR + UDA1341_REG_STATUS );
	L3_write_data( NO_RESET + EXTCLK_FRE + IF_IIS + NO_DC_FLITERING, 0 );  
	
	/*1,0,0,0,0,0,01:OGS=0,IGS=0,ADC_non-inverting,DAC_non-inverting,single speed playback,ADCoffDACon */
	L3_write_addr( UDA1341_ADDR + UDA1341_REG_STATUS );
	L3_write_data((1 << 7) + (1 << 0), 0);  
	
	set_volume(g_volume);
	set_bass(g_bass);
	set_treble(g_treble);
	set_mute(g_mute);
  
	/*
	 * I2SLRCK   GPE0
	 * I2SSCLK   GPE1
	 * CDCLK     GPE2
	 * I2SSDI    GPE3
	 * I2SSDO    GPE4
	 */
	GPECON &= (~0x3FF);
	GPECON |= (GPE4_I2SSDO | GPE3_I2SSDI | GPE2_CDCLK | GPE1_I2SSCLK | GPE0_I2SLRCK);
	GPEUP = GPEUP | 0x1f;

  /*XXX - 根據mode修改相應的IISCON和IISFCON配置*/
  
  /* Initialize the IIS bus */
  /*Tx DMA disable,Rx DMA disable, Tx no idle, Rx idle, enable pre-divider*/
	IISCON = TR_DMA_DISABLE | RE_DMA_DISABLE | TR_CHA_NO_IDLE | RE_CHA_IDLE | IIS_PSR_ENABLE;
	/*Tx FIFO access normal,Tx FIFO enable*/
	IISFCON = TR_FIFO_NOR | TR_FIFO_ENABLE;
		
	/* XXX
	 * 1. 是不是所有的音頻文件都可以用IIS data format播放或錄音?
	 * 2. ======================是16位/聲道?
	 * 3. ======================都采用256fs?
	 * 4. ======================都采用32fs?
	 */
	/*main mode, transmit mode,low,IIS data format,16 bit,256fs,32fs*/
	IISMOD = IIS_MASTER_MOD | IIS_TR_MOD | IIS_LOW_LCHA  | IIS_COMP_FORMAT | PER_CHA_16bit | MASCLK_FRE | SBCLK_FRE_32fs;
	
	/*
	 * 1. 參考Linux中的代碼,計算IISPSR
	 */
	/*IISPSR = (5<<5) | 5;XXX*/
	
	/*IISPSR = (8 << 5) | 8;*/
	
	
	if(mode) /*record*/
	{
    /*1,0,1,0,0,0,10 : OGS=0,IGS=1,ADC_NI,DAC_NI,sngl speed,AonDoff*/
    L3_write_addr( UDA1341_ADDR + UDA1341_REG_STATUS );     /*STATUS (000101xx+10)*/
    L3_write_data( (1 << 7) + (1 << 5) + (1 << 1) , 0 );       

    /*11000,010  : DATA0, Extended addr(010) */
    L3_write_addr( UDA1341_ADDR + UDA1341_REG_DATA0 );     /*DATA0 (000101xx+00)*/
    L3_write_data( UDA1341_EXT_ADDR + (2 << 0) , 0 );  
     
    /*010,011,01 : DATA0, MS=9dB, Ch1=on Ch2=off, */   
    L3_write_data( (2 << 5) + (3 << 2) + (1 << 0) , 0 ); 
    
    /* Initialize the IIS bus */
	  /*Tx DMA disable,Rx DMA disable, Tx no idle, Rx idle, enable pre-divider*/
		IISCON = TR_DMA_DISABLE | RE_DMA_DISABLE | TR_CHA_IDLE | RE_CHA_NO_IDLE | IIS_PSR_ENABLE;
		/*Re FIFO access normal,Re FIFO enable*/
		IISFCON = RE_FIFO_NOR | RE_FIFO_ENABLE;
			
		/*main mode, transmit mode,low,IIS data format,16 bit,256fs,32fs*/
		IISMOD = IIS_SLAVE_MOD | IIS_RE_MOD | IIS_LOW_LCHA  | IIS_COMP_FORMAT | PER_CHA_16bit | MASCLK_FRE | SBCLK_FRE_32fs;;     
  }
}

void wav_play(struct WAVE *hdr, int *data)
{
	int i, NumSamples,Psr_Divider;
	
#ifdef _DEBUG
	printf("ChunkID=0x%08x\nFormat=0x%08x\nSubchunk1ID=0x%08x\nSubchunk2ID=0x%08x\n",
	hdr->ChunkID, hdr->Format, hdr->Subchunk1ID, hdr->Subchunk2ID);
	printf("NumChannels=%d\nSampleRate=%d\nBitsPerSample=%d\n",
	hdr->NumChannels, hdr->SampleRate, hdr->BitsPerSample);
#endif	

  Psr_Divider = PCLK / ( SYSTEM_CLK * (hdr->SampleRate)) - 1;
  
  IISPSR = (Psr_Divider << 5) | Psr_Divider;
	
	IISCON |= 0x1;
	
	NumSamples = hdr->Subchunk2Size/hdr->NumChannels/(hdr->BitsPerSample/8);
	
	for(i = 0; i < NumSamples; i++) 
	{
		
		while(IISCON & 0x80)
			;
		
		IISFIFO = *(data++);	
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产999大香线蕉| 午夜国产不卡在线观看视频| 欧美一级夜夜爽| 欧美精选在线播放| 欧美高清视频在线高清观看mv色露露十八 | 欧美精品一区男女天堂| 日韩欧美一级二级三级| 亚洲精品一区二区三区影院| 精品三级在线看| 久久麻豆一区二区| 国产精品久久久久久户外露出| 最近中文字幕一区二区三区| 亚洲精品国久久99热| 亚洲影院免费观看| 蜜桃视频一区二区三区在线观看| 欧美96一区二区免费视频| 国内精品免费在线观看| 成人免费观看男女羞羞视频| 99re热这里只有精品视频| 欧美亚洲图片小说| 日韩视频一区在线观看| 国产情人综合久久777777| ...xxx性欧美| 欧美a一区二区| 成人91在线观看| 欧美高清视频www夜色资源网| 2021中文字幕一区亚洲| 成人免费在线播放视频| 亚洲高清免费观看高清完整版在线观看| 日韩电影一区二区三区| 国产精品综合二区| 欧美视频在线观看一区二区| 精品国产一区二区三区久久影院| 国产精品久久夜| 日韩电影免费在线| av成人动漫在线观看| 欧美一区二区精品久久911| 国产午夜精品美女毛片视频| 亚洲成av人片一区二区梦乃| 国产美女在线观看一区| 色88888久久久久久影院野外| 欧美一区二区三区在线观看视频| 国产午夜精品久久久久久久| 日韩电影在线一区二区| 99视频超级精品| 精品国产91九色蝌蚪| 亚洲国产精品一区二区www在线| 风间由美中文字幕在线看视频国产欧美 | 久久精品视频网| 爽爽淫人综合网网站| 91免费版pro下载短视频| 精品国产青草久久久久福利| 亚洲国产色一区| voyeur盗摄精品| 精品91自产拍在线观看一区| 亚洲成人在线网站| 91蜜桃免费观看视频| 久久综合丝袜日本网| 日韩激情中文字幕| 欧美视频完全免费看| 国产精品成人在线观看| 国产精品小仙女| 精品乱人伦小说| 日韩电影在线观看一区| 欧美三级电影一区| 亚洲黄色免费电影| 99久久综合精品| 自拍偷自拍亚洲精品播放| 国产成人精品综合在线观看| 26uuu欧美| 国产乱淫av一区二区三区| 9191精品国产综合久久久久久| 亚洲黄一区二区三区| 91精彩视频在线| 亚洲黄色av一区| 欧美少妇一区二区| 亚洲一区二区三区美女| 日本电影亚洲天堂一区| 一区二区三国产精华液| 色综合色综合色综合色综合色综合| 国产精品美女一区二区| 成人av第一页| 一区二区三区四区视频精品免费 | 国产在线视频精品一区| 久久人人97超碰com| 国产不卡免费视频| 国产精品九色蝌蚪自拍| 91社区在线播放| 亚洲精品v日韩精品| 欧美三级午夜理伦三级中视频| 亚洲国产精品影院| 欧美嫩在线观看| 日本午夜一本久久久综合| 日韩欧美的一区| 成人黄色国产精品网站大全在线免费观看 | 成人永久看片免费视频天堂| 国产精品日韩精品欧美在线| www.爱久久.com| 五月婷婷激情综合网| 日韩一区国产二区欧美三区| 国产一区在线视频| 亚洲免费观看高清在线观看| 欧美日韩三级视频| 国产精品一区二区黑丝| 蓝色福利精品导航| 国产女主播一区| 欧美区在线观看| 福利电影一区二区| 亚洲chinese男男1069| 久久久久88色偷偷免费 | 亚洲v精品v日韩v欧美v专区| 精品国产一区二区三区久久久蜜月| 国产.欧美.日韩| 亚洲电影中文字幕在线观看| 久久久综合网站| 欧美日韩国产电影| 丁香婷婷深情五月亚洲| 亚洲午夜久久久久久久久电影网 | 一区二区三区国产精品| 精品成人一区二区| 91老师国产黑色丝袜在线| 精品亚洲aⅴ乱码一区二区三区| 国产精品日产欧美久久久久| 日韩视频在线永久播放| 91成人国产精品| 国产成人欧美日韩在线电影| 日本午夜一本久久久综合| 亚洲欧美色图小说| 久久久久久久综合色一本| 91精品国产色综合久久不卡电影| 99re热视频精品| 国产成a人亚洲精品| 秋霞午夜鲁丝一区二区老狼| 亚洲激情一二三区| 国产精品人成在线观看免费| 久久久美女毛片| 日韩欧美一级二级三级久久久| 欧美日韩五月天| 日本韩国欧美在线| av激情成人网| 懂色中文一区二区在线播放| 国产一区二区在线电影| 久久se精品一区精品二区| 天天色天天操综合| 亚洲美女视频在线观看| 亚洲同性同志一二三专区| 国产精品美女一区二区三区| 国产色一区二区| 国产亚洲成aⅴ人片在线观看 | 日本美女一区二区三区| 性欧美疯狂xxxxbbbb| 一区二区三区日韩欧美精品| 亚洲欧美激情视频在线观看一区二区三区 | 老司机精品视频线观看86| 日韩精品午夜视频| 日韩电影一二三区| 美女一区二区在线观看| 激情综合色综合久久综合| 久久99精品国产麻豆不卡| 久久99蜜桃精品| 国产精品一区二区果冻传媒| 岛国精品一区二区| 99re亚洲国产精品| 欧美日韩美女一区二区| 欧美一区二区三区免费视频| 久久综合中文字幕| 国产精品视频观看| 一区二区三区中文在线| 偷拍亚洲欧洲综合| 国产综合久久久久久鬼色| 懂色中文一区二区在线播放| 91视频一区二区| 欧美三级电影网站| 亚洲精品一区二区三区在线观看| 国产女同互慰高潮91漫画| 亚洲激情一二三区| 免费成人在线观看视频| 国产不卡视频在线观看| 欧美在线啊v一区| 精品美女在线播放| 亚洲欧美日韩国产另类专区| 日韩精品亚洲一区二区三区免费| 国产精品自拍毛片| 欧洲中文字幕精品| 精品国产一区二区三区忘忧草| 成人免费视频在线观看| 日日夜夜精品视频天天综合网| 国产精品自在欧美一区| 欧美视频在线不卡| 欧美国产一区二区在线观看| 亚洲午夜精品一区二区三区他趣| 精品一区二区国语对白| 色综合久久精品| 26uuu欧美日本| 午夜亚洲福利老司机| 成人97人人超碰人人99| 日韩一区二区三区四区五区六区| 亚洲欧洲精品一区二区三区不卡| 欧美a级理论片| 欧美性猛交xxxx黑人交|