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

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

?? at91_audio.c

?? H9200F(2.6.12)的音頻接口驅動。 操作方法: 1、將驅動程序rsound.ko拷貝到系統(tǒng)目錄:/lib/modules 2、執(zhí)行如下命令加載模塊: insmod /
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*----------------------------------------------------------**	linux/drivers/at91/at91_audio.c**		****	Copyright (C) 2006 Hyesco Technology Co.,Ltd****	Author: casiawu <wujh@hyesco.com>****	History:****	2006.4   casiawu  <wujh@hyesco.com>**               Original version**---------------------------------------------------------*/#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/poll.h>#include <linux/slab.h>#include <linux/delay.h>#include <linux/ioport.h>//#include <sound_config.h>//#include <dev_table.h>#include <linux/soundcard.h>#include <linux/sound.h>#include <linux/interrupt.h>#include <asm/arch/AT91RM9200_SSC.h>#include <asm/arch/board.h>#include "at91_audio.h"#include "i2c.h"#define I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\AT91C_SSC_CKS_DIV   +\AT91C_SSC_CKO_CONTINOUS      +\AT91C_SSC_START_FALL_RF +\((1<<16) & AT91C_SSC_STTDLY) +\((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24))#define I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\(nb_bit_by_slot-1)  +\AT91C_SSC_MSBF   +\(((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB)  +\(((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\AT91C_SSC_FSOS_NEGATIVE)#define NEXT_BUF(_s_,_b_) { \        (_s_)->_b_##_idx++; \        (_s_)->_b_##_idx %= (_s_)->nbfrags; \        (_s_)->_b_ = (_s_)->buffers + (_s_)->_b_##_idx; }                                                                         #define AUDIO_MODULE_NAME "AT91_AUDIO"     /* global definitions */#define AUDIO_NBFRAGS_DEFAULT	8#define AUDIO_FRAGSIZE_DEFAULT	(8*1024)                                                                                                                                                                                                                                     #define SLOT_BY_FRAME	2#define BITS_BY_SLOT	16static int audio_dev_dsp; static unsigned int a9200_stereo;static unsigned int a9200_bits;AT91PS_SSC ssc_regs;AT91PS_PDC pdc_regs;unsigned char uda1380_rx_init[] = {	0x00, 0x0f, 0x3f,	0x01, 0x00, 0x88,	0x02, 0xaf, 0xff,	0x03, 0x00, 0x00,	0x04, 0x02, 0x02,	0x10, 0x00, 0x00,	0x11, 0xb0, 0xb0,	0x12, 0x00, 0x00,	0x13, 0x00, 0x00,	0x14, 0x00, 0x00,	0x20, 0x00, 0x00,	0x21, 0x08, 0x08,	0x22, 0x16, 0x0C,	0x23, 0x00, 0x00};	/*----------------------------------------------------- * Name :      codec_init() * Function:   Init the code chip  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/	void codec_init(unsigned char *command){        int ic;        unsigned int msb, lsb, data, reg;                                                                                        DPRINTK("Testing I2C\n");                for (ic = 0; ic < 42; ic += 3) {                reg = command[ic];                lsb = command[ic + 1];                msb = command[ic + 2];                data = msb << 8 | lsb;                I2C_write(reg, data, 2);        }}  /*----------------------------------------------------- * Name :      AT91F_SSC_SetBaudrate() * Function:   Set the baudrate according to the CPU clock * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/__inline void AT91F_SSC_SetBaudrate (        AT91PS_SSC pSSC,        // \arg pointer to a SSC controller        unsigned int mainClock, // \arg peripheral clock        unsigned int speed)     // \arg SSC baudrate{        unsigned int baud_value;        //* Define the baud rate divisor register        if (speed == 0)           baud_value = 0;        else        {           baud_value = (unsigned int) (mainClock * 10)/(2*speed);           if ((baud_value % 10) >= 5)                  baud_value = (baud_value / 10) + 1;           else                  baud_value /= 10;        }        pSSC->SSC_CMR = baud_value;}                                                                              /*----------------------------------------------------- * Name :      SSC_init() * Function:   Init the PIO and SSC REG  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/	                                                                            void SSC_init(void){     DPRINTK("Init SSC...\n");          //init the global variables     a9200_bits = 16;     a9200_stereo = 1;            ssc_regs = (AT91PS_SSC) AT91C_VA_BASE_SSC1;     pdc_regs = (AT91PS_PDC) AT91C_VA_BASE_PDC_SSC1;        	   // Configure SSC1 PIOs  TF/TK/TD       AT91_SYS->PIOB_PDR = AT91C_PB6_TF1 | AT91C_PB7_TK1 | AT91C_PB8_TD1 | AT91C_PB9_RD1 | AT91C_PB10_RK1;     AT91_SYS->PIOB_ASR = AT91C_PB6_TF1 | AT91C_PB7_TK1 | AT91C_PB8_TD1 | AT91C_PB9_RD1 | AT91C_PB10_RK1;                                                                          AT91_SYS->PMC_PCER = 1 << AT91C_ID_SSC1;/* Peripheral Clock Enable */     /*soft reset */     ssc_regs->SSC_CR = AT91C_SSC_SWRST;                                                                                     AT91F_SSC_SetBaudrate(ssc_regs, at91_master_clock,FILE_SAMPLING_FREQ *(BITS_BY_SLOT * SLOT_BY_FRAME));     ssc_regs->SSC_IDR = 0xCFF;      //disabled all                                                                                     /* SSC Transmit Clock Mode Register */     ssc_regs->SSC_TCMR = I2S_ASY_MASTER_TX_SETTING(BITS_BY_SLOT,SLOT_BY_FRAME);     /* SSC Transmit Frame Mode Register */     ssc_regs->SSC_TFMR = I2S_ASY_TX_FRAME_SETTING(BITS_BY_SLOT,SLOT_BY_FRAME);     /* SSC_RFMR */     ssc_regs->SSC_RFMR = I2S_ASY_TX_FRAME_SETTING(BITS_BY_SLOT,SLOT_BY_FRAME);     /* SSC_RCMR */     ssc_regs->SSC_RCMR = I2S_ASY_MASTER_TX_SETTING(BITS_BY_SLOT,SLOT_BY_FRAME);          ssc_regs->SSC_CR |= (AT91C_SSC_RXDIS | AT91C_SSC_TXEN)  ;		// ssc_regs->SSC_IER |= (AT91C_SSC_ENDTX | AT91C_SSC_TXBUFE | AT91C_SSC_ENDRX | AT91C_SSC_RXBUFF);		 		 pdc_regs->PDC_PTCR |= (AT91C_PDC_RXTDIS | AT91C_PDC_TXTEN );       }/*----------------------------------------------------- * Name :      at91_audio_open() * Function:   Open aduio dev  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/ int at91_audio_open(struct inode * inode, struct file * filp){	// MOD_INC_USE_COUNT;	 return 0;}/*----------------------------------------------------- * Name :      at91_audio_release() * Function:   Release audio dev  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/int at91_audio_release(struct inode * inode,struct file * filp){	// MOD_DEC_USE_COUNT;	 return 0;}	/*----------------------------------------------------- * Name :      at91_audio_ioctl() * Function:   Audio IO Control  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/ int at91_audio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg){	  return 0;}                                                                                                                                                         /*----------------------------------------------------- * Name :      at91_audio_clear_buf() * Function:   frees all buffers  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/static void at91_audio_clear_buf(audio_stream_t * s){	  DPRINTK("aduio_clear_buf\n");	  s->active = 0;	  	  at91rm9200_dma_flush_all(s->dma);	  if (s->buffers) {		  int frag;		  for (frag = 0; frag < s->nbfrags; frag++) {			if (!s->buffers[frag].master)				  continue;			dma_free_coherent(NULL, s->buffers[frag].master, s->buffers[frag].start, s->buffers[frag].dma_addr);					}				kfree(s->buffers);		s->buffers = NULL;	}	  s->buf_idx = 0;	  s->buf = NULL;}/*----------------------------------------------------- * Name :      at91_audio_setup_buf() * Function:   This function allocates the buffer structure array  * and buffer data space according to the current number of  * fragments and fragment size.  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/static int at91_audio_setup_buf(audio_stream_t * s){	int frag;	int dmasize = 0;	char *dmabuf = NULL;	dma_addr_t dmaphys = 0;	if (s->buffers)		return -EBUSY;	s->buffers = (audio_buf_t *)kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);	if (!s->buffers)		goto err;	memset(s->buffers, 0, sizeof(audio_buf_t) * s->nbfrags);	for (frag = 0; frag < s->nbfrags; frag++) {		audio_buf_t *b = &s->buffers[frag];		/*		 * Let's allocate non-cached memory for DMA buffers.		 * We try to allocate all memory at once.		 * If this fails (a common reason is memory fragmentation),		 * then we allocate more smaller buffers.		 */		if (!dmasize) {			dmasize = (s->nbfrags - frag) * s->fragsize;			do {					dmabuf = dma_alloc_coherent(NULL, dmasize, &dmaphys, GFP_KERNEL);				if (!dmabuf)					dmasize -= s->fragsize;			} while (!dmabuf && dmasize);			if (!dmabuf)				goto err;			b->master = dmasize;			memzero(dmabuf, dmasize);		}		b->start = dmabuf;		b->dma_addr = dmaphys;		b->stream = s;		sema_init(&b->sem, 1);		DPRINTK("buf %d: start %p dma %p\n", frag, b->start,			b->dma_addr);		dmabuf += s->fragsize;		dmaphys += s->fragsize;		dmasize -= s->fragsize;	}	s->buf_idx = 0;	s->buf = &s->buffers[0];	return 0;err:	printk(" unable to allocate audio memory\n ");	at91_audio_clear_buf(s);	return -ENOMEM;}/*----------------------------------------------------- * Name :      at91_audio_prime_dma() * Function:   Send data buffer to dma queue  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/static void at91_audio_prime_dma(audio_stream_t *s){	int i;	s->active = 1;	for (i = 0; i < s->nbfrags; i++) {		audio_buf_t *b = s->buf;		down(&b->sem);		at91rm9200_dma_queue_buffer(s->dma, (void *) b,					b->dma_addr, s->fragsize);		NEXT_BUF(s, buf);	}}/*----------------------------------------------------- * Name :      at91_audio_read() * Function:   Read Data from Audio and Send to user  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/static ssize_t at91_audio_read(struct file *file, char *buffer,		      size_t count, loff_t * ppos){	 audio_stream_t *s = &input_stream;	 unsigned long bufcnt,chunksize;	 unsigned long ret = 0,i=0,tmpint=0,tmpint2=0;     unsigned short *buflp;   unsigned long *appbuflp;   audio_buf_t *b;      bufcnt = count ;   appbuflp = (unsigned long *)buffer;		 ret = -ERESTARTSYS;	 DPRINTK("audio_read: count=%d\n", count);   if(a9200_stereo == 1)   	  bufcnt >>= 1;   if(a9200_bits == 16)      bufcnt >>= 1;	 if (!s->active) {		     if (!s->buffers && at91_audio_setup_buf(s))			   return -ENOMEM;                           DPRINTK("audio_read: audio_prime_dma(s)\n");						     at91_audio_prime_dma(s);	 }	 wmb();	 b = s->buf;	    ssc_regs->SSC_CR |= AT91C_SSC_RXEN  ;   pdc_regs->PDC_PTCR |= AT91C_PDC_RXTEN;	    wmb();	 	 while (bufcnt) {		  			if (down_interruptible(&b->sem))				break;		  			 /* Grab data from the current buffer */		 chunksize = b->size;		 if (chunksize > 2*bufcnt)		 chunksize = 2*bufcnt;					 DPRINTK("read %d from %d\n", chunksize, s->buf_idx);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区日韩精品| 国产福利视频一区二区三区| 亚洲综合999| 亚洲成a人片在线不卡一二三区| 亚洲免费观看在线视频| 亚洲免费大片在线观看| 亚洲一区二区三区视频在线播放| 亚洲成年人影院| 国内成人精品2018免费看| 国产黑丝在线一区二区三区| 不卡av电影在线播放| 国产目拍亚洲精品99久久精品| 亚洲天堂av一区| 日韩电影一区二区三区四区| 国产成人综合自拍| 在线精品视频小说1| 亚洲精品一区二区三区香蕉 | 在线视频亚洲一区| 日韩欧美久久久| 中文字幕一区二区在线播放| 亚洲h动漫在线| 91视频精品在这里| av激情综合网| 一本一道久久a久久精品综合蜜臀| 成人高清免费在线播放| 精品国产污污免费网站入口| 国产精品99久久不卡二区| 国产欧美精品国产国产专区| 久久99国产精品尤物| 91丨porny丨国产| 国产日韩欧美综合一区| 一区二区视频免费在线观看| 久久精品国产精品青草| 91丨porny丨蝌蚪视频| 欧美一级日韩不卡播放免费| 国产精品女主播av| 精久久久久久久久久久| 欧美日韩视频专区在线播放| 久久久www免费人成精品| 色婷婷香蕉在线一区二区| 国产网站一区二区三区| 成人免费视频免费观看| 亚洲欧美日韩系列| 在线免费观看一区| 亚洲成人综合视频| 欧美一级精品大片| 国产精品资源在线看| 久久综合九色综合97婷婷女人 | 欧美一区二区三区小说| 蜜桃av一区二区三区| 精品盗摄一区二区三区| 成人a区在线观看| 视频一区中文字幕| 国产精品女同一区二区三区| 精品裸体舞一区二区三区| 性做久久久久久久免费看| 国产午夜精品在线观看| 日韩一级视频免费观看在线| 色乱码一区二区三区88| av电影天堂一区二区在线观看| 国产在线不卡一卡二卡三卡四卡| 日本不卡在线视频| 亚洲国产中文字幕| 国产精品伦理一区二区| 亚洲精品在线免费播放| 欧美视频中文字幕| 97精品电影院| 国产成人8x视频一区二区| 麻豆精品视频在线观看免费| 图片区小说区区亚洲影院| 亚洲精品va在线观看| 亚洲欧美一区二区三区国产精品| 2欧美一区二区三区在线观看视频| 精品视频一区三区九区| 色琪琪一区二区三区亚洲区| 91麻豆福利精品推荐| 91网站视频在线观看| 91亚洲永久精品| 9色porny自拍视频一区二区| 国产成人在线网站| 国产99久久久精品| 不卡的av在线| 91免费在线视频观看| 在线中文字幕一区二区| 欧美日韩国产高清一区二区三区 | 欧美日韩二区三区| 色噜噜偷拍精品综合在线| 一本大道综合伊人精品热热| 欧美性极品少妇| 日韩亚洲欧美综合| 国产欧美综合在线观看第十页| 欧美激情中文不卡| 亚洲精品免费电影| 偷拍自拍另类欧美| 国产精品99久久久久久久女警 | 久久精品在线免费观看| 亚洲欧美精品午睡沙发| 无吗不卡中文字幕| 成人免费va视频| 欧美精品在线一区二区三区| 欧美激情一区三区| 日日夜夜精品视频免费| 成人激情视频网站| 5858s免费视频成人| 亚洲视频在线一区二区| 久久国产欧美日韩精品| 欧美亚一区二区| 欧美国产日本韩| 麻豆精品久久久| 欧美精品久久99| 国产精品久久久久三级| 九九九久久久精品| 91精品国产综合久久久久久| 国产精品理伦片| eeuss鲁片一区二区三区在线看| 欧美一区二区播放| 亚洲成a人片在线观看中文| av成人免费在线| 1024精品合集| 成人黄色在线看| 中文字幕电影一区| 国产成人av影院| 国产日韩欧美综合一区| 91老师片黄在线观看| 国产三级欧美三级日产三级99| 国内精品嫩模私拍在线| 久久久久久9999| 国产精品亚洲第一区在线暖暖韩国| 欧美精品一区二区三区高清aⅴ | 日韩精品中午字幕| 老司机精品视频在线| 久久影院视频免费| 波多野结衣中文字幕一区| 中文字幕亚洲一区二区av在线 | 麻豆成人在线观看| 欧美激情一区二区三区不卡 | 亚洲精品国产精品乱码不99| 色婷婷av一区二区三区gif| 五月激情综合网| 久久精品欧美一区二区三区不卡 | 国产精品你懂的在线欣赏| www.欧美日韩国产在线| 亚洲日本va在线观看| 蜜桃av噜噜一区| 日韩一区二区在线播放| 亚洲色图在线看| 国产日韩欧美精品电影三级在线| 日韩欧美一二区| 精品三级在线看| 久久九九全国免费| 国产亚洲污的网站| 欧美va亚洲va在线观看蝴蝶网| 色国产综合视频| 91网站在线播放| 色婷婷国产精品久久包臀| 国产丶欧美丶日本不卡视频| 日韩精品1区2区3区| 亚洲在线视频一区| 亚洲国产精品一区二区www在线| 国产欧美一区二区在线| 欧美一卡2卡三卡4卡5免费| 欧美三级乱人伦电影| 欧美综合一区二区| 欧美三级三级三级| 欧美日韩国产小视频| 欧美精品丝袜中出| 日韩写真欧美这视频| 26uuu亚洲综合色| 国产精品系列在线| 中文字幕日韩一区二区| 一区二区三区在线观看动漫| 亚洲私人影院在线观看| 五月婷婷综合激情| 精品一区二区三区免费观看| 国产精品一级黄| 91在线丨porny丨国产| 欧美无砖专区一中文字| 日韩免费高清视频| www亚洲一区| 亚洲视频在线一区二区| 三级久久三级久久| 99麻豆久久久国产精品免费| 欧美日韩国产大片| 国产精品萝li| 蜜臀99久久精品久久久久久软件| 国产乱妇无码大片在线观看| 一本一本大道香蕉久在线精品 | 色婷婷精品久久二区二区蜜臂av| 欧美放荡的少妇| 一区二区三区在线视频免费| 国产福利精品一区| 精品理论电影在线| 久久99精品国产麻豆婷婷| 777午夜精品视频在线播放| 亚洲国产日日夜夜| 欧美综合一区二区三区| 亚洲综合久久久久| 91精品国产色综合久久| 美女视频免费一区| 精品美女一区二区|