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

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

?? at91_audio.c

?? H9200F(2.6.12)的音頻接口驅動。 操作方法: 1、將驅動程序rsound.ko拷貝到系統目錄:/lib/modules 2、執行如下命令加載模塊: insmod /
?? C
?? 第 1 頁 / 共 2 頁
字號:
                      buflp = (unsigned short *)(b->start + s->fragsize - b->size);       for(i = 0;i < chunksize;i+=2)     {         *appbuflp++ = (((unsigned long) *buflp) << 16) | *buflp;         buflp++;     }	 				 tmpint2 = chunksize/2;     b->size -= chunksize;     bufcnt -= tmpint2 ;         if(a9200_stereo == 1)   	    tmpint2 <<= 1;     if(a9200_bits == 16)        tmpint2 <<= 1;                tmpint += tmpint2 ;              		 if (b->size > 0) 		 {			  up(&b->sem);			  break;	 	 }		 /* Make current buffer available for DMA again */		 at91rm9200_dma_queue_buffer(s->dma, (void *) b,					b->dma_addr, s->fragsize);		 wmb();		   	 NEXT_BUF(s, buf);		 wmb();		 b = s->buf;		 }   ssc_regs->SSC_CR |= AT91C_SSC_RXDIS;   pdc_regs->PDC_PTCR |= AT91C_PDC_RXTDIS;	 ret = tmpint;			 DPRINTK("audio_read: return=%d\n", ret);	 return ret;}/*----------------------------------------------------- * Name :      at91_audio_write() * Function:   Write Data to Audio   * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/static ssize_t at91_audio_write(struct file *file, const char *buffer, size_t count,loff_t *ppos){   const char *buffer0 = buffer;   audio_stream_t *s = &output_stream;   int chunksize, ret = 0;   unsigned int bufcnt;   DPRINTK("audio_write: count=%d\n", count);   if (*ppos != file->f_pos)       return -ESPIPE;   	 if (!s->active) {       if (!s->buffers && at91_audio_setup_buf(s))          return -ENOMEM;   }          bufcnt = count & ~0x3;       while (bufcnt) {       audio_buf_t *b = s->buf;       /* Wait for a buffer to become free */       if (file->f_flags & O_NONBLOCK) {            ret = -EAGAIN;            if (down_trylock(&b->sem))              break;       } else {            ret = -ERESTARTSYS;            if (down_interruptible(&b->sem))               break;       }       /* Feed the current buffer */       chunksize = s->fragsize - b->size;       if (chunksize > bufcnt)           chunksize = bufcnt;       DPRINTK("write %d to %d\n", chunksize, s->buf_idx);                       if (copy_from_user(b->start + b->size, buffer, chunksize)) {            up(&b->sem);            return -EFAULT;       }              b->size += chunksize;       buffer += chunksize;       bufcnt -= chunksize;             if (b->size < s->fragsize)       {       up(&b->sem);       break;      }              /* Send current buffer to dma */       s->active = 1;       at91rm9200_dma_queue_buffer(s->dma, (void *) b,                                   b->dma_addr, b->size);       b->size = 0;    /* indicate that the buffer has been sent */              NEXT_BUF(s, buf);    }    if ((buffer - buffer0))    ret = buffer - buffer0;        DPRINTK("audio_write: return=%d\n", ret);    return ret;                        }/*----------------------------------------------------- * Name :      at91_audio_out_done_callback() * Function:   Out done callback function  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/void at91_audio_out_done_callback(void *buf_id, int size){	  audio_buf_t *b = (audio_buf_t *) buf_id;	  audio_stream_t *s = b->stream;    //release sem 		up(&b->sem);	  b->size = 0;	  /* And any process polling on write. */	  wake_up(&s->wq);	}/*----------------------------------------------------- * Name :      audio_in_done_callback() * Function:   In done callback function  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/void at91_audio_in_done_callback(void *buf_id, int size){	   audio_buf_t *b = (audio_buf_t *) buf_id;	   audio_stream_t *s = b->stream;    //release sem 		 b->size = size;	   wmb();		 up(&b->sem);	  /* And any process polling on write. */	  wake_up(&s->wq);	}/*----------------------------------------------------- * Name :      at91_audio_out_irq_oper() * Function:   diable or enable endtx irq function  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/void at91_audio_out_irq_oper(U8 size){   if(size)   {       // enable endtx interrupt    	       //ssc_regs->SSC_CR |= AT91C_SSC_TXEN;       ssc_regs->SSC_IER |= (AT91C_SSC_ENDTX | AT91C_SSC_TXBUFE) ;			 //pdc_regs->PDC_PTCR |= AT91C_PDC_TXTEN;		    }   else   {	      //Disable ssc Rx and endrx irq		      ssc_regs->SSC_IDR |= (AT91C_SSC_ENDTX | AT91C_SSC_TXBUFE);        //ssc_regs->SSC_CR |= (AT91C_SSC_ENDTX | AT91C_SSC_TXBUFE) ;				//pdc_regs->PDC_PTCR |= AT91C_PDC_TXTDIS;		    }	      	}/*----------------------------------------------------- * Name :      at91_audio_in_irq_oper() * Function:   diable or enable endrx irq function  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/void at91_audio_in_irq_oper(U8 size){   if(size)   {        // enable endrx interrupt     	        //ssc_regs->SSC_CR |= AT91C_SSC_RXEN  ;        ssc_regs->SSC_IER |= (AT91C_SSC_ENDRX | AT91C_SSC_RXBUFF); 		    //pdc_regs->PDC_PTCR |= AT91C_PDC_RXTEN;     }   else   {	      //Disable ssc Rx and endrx irq		      ssc_regs->SSC_IDR |= (AT91C_SSC_ENDRX | AT91C_SSC_RXBUFF);        //ssc_regs->SSC_CR |= AT91C_SSC_RXDIS;					//pdc_regs->PDC_PTCR |= AT91C_PDC_RXTDIS;		    }	      	}/*----------------------------------------------------- * Name :      at91_audio_in_done_callback() * Function:   In done callback function  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/void at91_audio_status_callback(U8* status){	int temp,temp2;		temp = ssc_regs->SSC_SR;	temp2 = ssc_regs->SSC_IMR;		if((temp & AT91C_SSC_TXBUFE) && (temp2 & AT91C_SSC_TXBUFE))		*status = 2;	else if((temp & AT91C_SSC_ENDTX) && (temp2 & AT91C_SSC_ENDTX))		*status = 1;	else if((temp & AT91C_SSC_RXBUFF) && (temp2 & AT91C_SSC_RXBUFF))		*status = 4;	else if((temp & AT91C_SSC_ENDRX) && (temp2 & AT91C_SSC_ENDRX))		*status = 3;	else     *status = 0 ; }/*----------------------------------------------------- * Name :      at91_audio_poll() * Function:   support poll sys-call function  * Last rework data: 06-04-14   wujh@hyesco.com *----------------------------------------------------*/static unsigned int at91_audio_poll(struct file *file,			       struct poll_table_struct *wait){	  audio_stream_t *is = &input_stream;	  audio_stream_t *os = &output_stream;	  unsigned int mask = 0;	  int i;	  DPRINTK("audio_poll(): mode=%s%s\n",		(file->f_mode & FMODE_READ) ? "r" : "",		(file->f_mode & FMODE_WRITE) ? "w" : "");	  if (file->f_mode & FMODE_READ) {		/* Start ssc input if not already active */		if (!is->active) {			if (!is->buffers && at91_audio_setup_buf(is))				return -ENOMEM;			at91_audio_prime_dma(is);		 }		 poll_wait(file, &is->wq, wait);	  }	  if (file->f_mode & FMODE_WRITE) {		if (!os->buffers && at91_audio_setup_buf(os))			return -ENOMEM;					poll_wait(file, &os->wq, wait);	 }	 if (file->f_mode & FMODE_READ) {			for (i = 0; i < is->nbfrags; i++) {				if (atomic_read(&is->buffers[i].sem.count) > 0) {					mask |= POLLIN | POLLRDNORM;					break;				}			}	 }	 if (file->f_mode & FMODE_WRITE) {			for (i = 0; i < os->nbfrags; i++) {				if (atomic_read(&os->buffers[i].sem.count) > 0) {					mask |= POLLOUT | POLLWRNORM;					break;				}			}	 }	 DPRINTK("audio_poll() returned mask of %s%s\n",		(mask & POLLIN) ? "r" : "",		(mask & POLLOUT) ? "w" : "");	 return mask;}/* file operation stuct for Audio */                                                                                 struct file_operations at91_audio_fops = { 	owner:		        THIS_MODULE,	open:           	at91_audio_open,	release:        	at91_audio_release,  read:           	at91_audio_read,		  write:           	at91_audio_write,	  	  ioctl:            at91_audio_ioctl,  poll:             at91_audio_poll,	};     /*----------------------------------------------------- * Name :      AUDIO_At91_Init() * Function:   Init Audio driver module  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/                                                                          static int __init AUDIO_At91_Init(void){                                                                                     unsigned int err=0;        DPRINTK("AT91RM9200 audio driver version 0.1, build time:" __TIME__ "\n");                audio_dev_dsp = register_sound_dsp(&at91_audio_fops, -1);          // Init SSC regs        SSC_init();         //init the output at91rm9200_dma_t struct          		    output_stream.fragsize = AUDIO_FRAGSIZE_DEFAULT;		    output_stream.nbfrags = AUDIO_NBFRAGS_DEFAULT;		    output_stream.dma = &dma_chan[OUT_CHAN];        output_stream.active = 0;		    init_waitqueue_head(&(output_stream.wq));         dma_chan[IN_CHAN].flag = 0 ; 		              dma_chan[OUT_CHAN].regs = pdc_regs ;        dma_chan[OUT_CHAN].irq_on_off = at91_audio_out_irq_oper ;                        dma_chan[OUT_CHAN].callback = at91_audio_out_done_callback ;           dma_chan[OUT_CHAN].type =  SLOT_BY_FRAME;                dma_chan[OUT_CHAN].dma_channel = 2;         //init the input at91rm9200_dma_t struct  		    input_stream.fragsize = AUDIO_FRAGSIZE_DEFAULT;		    input_stream.nbfrags = AUDIO_NBFRAGS_DEFAULT;  		    input_stream.dma = &dma_chan[IN_CHAN]; 		    init_waitqueue_head(&(input_stream.wq));        input_stream.active = 0;		                   dma_chan[IN_CHAN].flag = 1 ;                   dma_chan[IN_CHAN].regs = pdc_regs ;         dma_chan[IN_CHAN].irq_on_off = at91_audio_in_irq_oper ;                                                     dma_chan[IN_CHAN].callback = at91_audio_in_done_callback ;        dma_chan[IN_CHAN].type =  SLOT_BY_FRAME;         dma_chan[IN_CHAN].dma_channel = 2;                  audio_state.irq = AT91C_ID_SSC1 ;        audio_state.device_id = AUDIO_MODULE_NAME ;         audio_state.readstatback = at91_audio_status_callback ;          audio_state.out_chan = &dma_chan[OUT_CHAN];            audio_state.in_chan = &dma_chan[IN_CHAN];                        //register the at91rm9200_dma irq               err = at91rm9200_dma_init(&audio_state);        if(err)        {        	 DPRINTK("<1>init out at91rm9200_dma_t err! \n");		       return err;        }                                         I2C_test();                        codec_init(uda1380_rx_init);	      return 0;}/*----------------------------------------------------- * Name :      AUDIO_At91_Cleanup() * Function:   Exit Audio driver module  * Last rework data: 06-04-13   wujh@hyesco.com *----------------------------------------------------*/static void __exit AUDIO_At91_Cleanup(void){        DPRINTK("Rmmod audio driver.\n");	              at91rm9200_free_dma(&audio_state);				at91_audio_clear_buf(&input_stream);				at91_audio_clear_buf(&output_stream);	        unregister_sound_dsp(audio_dev_dsp);}                                                                                               module_init(AUDIO_At91_Init);module_exit(AUDIO_At91_Cleanup);/*-----------------------------------------------------*/MODULE_AUTHOR("casiawu <wujh@hyesco.com>");MODULE_DESCRIPTION("AT91 AUDIO Driver (AT91_AUDIO)");MODULE_LICENSE("Proprietary");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜电影久久影院| 欧美日韩精品一二三区| 欧美探花视频资源| 久久综合久久鬼色| 午夜精品久久久久久| 国产精品一区二区x88av| 欧美日韩中字一区| 亚洲黄色免费电影| 国产成人精品亚洲午夜麻豆| 欧美一区二区三区日韩视频| 亚洲精品国产第一综合99久久| 久久精品理论片| 69成人精品免费视频| 亚洲视频在线观看三级| 国产91在线观看| 精品国产免费一区二区三区四区| 亚洲图片欧美综合| 色综合天天综合狠狠| 国产精品女主播av| 国产丶欧美丶日本不卡视频| 日韩欧美电影一二三| 丝袜美腿亚洲综合| 欧美精三区欧美精三区| 亚洲国产精品精华液网站| 91麻豆福利精品推荐| 欧美国产日韩在线观看| 国产精品亚洲综合一区在线观看| 精品久久五月天| 精品一区二区三区的国产在线播放 | 91美女在线观看| 国产精品全国免费观看高清| 国产成人精品影视| 日本一区二区三区高清不卡| 国产麻豆精品95视频| 久久久久99精品国产片| 国产另类ts人妖一区二区| 久久久久久久精| 国产精品99久久久久久宅男| 久久久精品国产免费观看同学| 国产精品66部| 国产精品久久久久国产精品日日 | 欧美亚洲综合色| 亚洲自拍另类综合| 欧美伦理影视网| 日本人妖一区二区| www欧美成人18+| 国产 欧美在线| 综合久久久久久| 欧美视频一区二区三区四区| 婷婷开心激情综合| 精品欧美一区二区久久| 久久99蜜桃精品| 欧美国产精品中文字幕| 91丨国产丨九色丨pron| 日一区二区三区| 久久午夜羞羞影院免费观看| 成人免费毛片aaaaa**| 综合久久一区二区三区| 欧美日韩二区三区| 国内成人免费视频| 亚洲男人的天堂网| 在线不卡中文字幕| 国产99久久久国产精品| 亚洲精品中文字幕乱码三区| 日韩欧美中文字幕制服| 国产·精品毛片| 性欧美大战久久久久久久久| 精品久久久久久久久久久久包黑料| 懂色av一区二区三区蜜臀| 一区2区3区在线看| 久久久久久99久久久精品网站| jiyouzz国产精品久久| 日本aⅴ亚洲精品中文乱码| 国产欧美视频在线观看| 欧美中文字幕久久| 国产激情一区二区三区| 亚洲成av人片观看| 中文子幕无线码一区tr| 91麻豆精品国产91| 成av人片一区二区| 韩国女主播成人在线观看| 亚洲国产精品久久艾草纯爱| 国产精品网友自拍| 91超碰这里只有精品国产| 国产成人福利片| 男男视频亚洲欧美| 日本美女一区二区| 制服丝袜一区二区三区| 99久久夜色精品国产网站| 麻豆精品视频在线观看视频| 亚洲美女视频在线观看| 久久久av毛片精品| 欧美成人a视频| 欧美亚洲国产一区二区三区va| 国产成人av一区| 看片的网站亚洲| 偷偷要91色婷婷| 亚洲成av人在线观看| 一区二区三区在线视频免费| 日本一区二区成人| 欧美国产精品专区| 国产农村妇女精品| 久久久99免费| 久久综合一区二区| 欧美一区二区免费| 欧美美女视频在线观看| 色哦色哦哦色天天综合| 成人av网在线| 成人免费精品视频| 国产91清纯白嫩初高中在线观看 | 不卡在线观看av| 国产精品一区二区果冻传媒| 国产美女av一区二区三区| 久久99精品久久久久婷婷| 蜜桃在线一区二区三区| 日韩精品91亚洲二区在线观看| 偷拍一区二区三区| 秋霞影院一区二区| 舔着乳尖日韩一区| 日韩精品电影在线观看| 日韩成人免费电影| 久久国产三级精品| 国产成人在线观看| 成人在线一区二区三区| www.日韩在线| 欧美性高清videossexo| 欧美日韩aaa| 欧美一区二区三区视频免费播放 | 欧美日韩成人在线一区| 欧美日韩另类一区| 欧美一区二区三区不卡| 精品国产电影一区二区| 久久久久久久一区| 中文字幕一区二区三区av| 亚洲精品国产精华液| 日本中文在线一区| 国产一区二区在线影院| 成人网男人的天堂| 欧美综合一区二区三区| 91精品国产综合久久久蜜臀粉嫩| 日韩欧美在线观看一区二区三区| 2021久久国产精品不只是精品| 国产精品色婷婷久久58| 洋洋av久久久久久久一区| 日韩av在线发布| 精品国产一区久久| 欧美色综合天天久久综合精品| 欧美人与性动xxxx| 久久精品夜夜夜夜久久| 中文字幕在线不卡一区二区三区| 亚洲自拍偷拍欧美| 国产一区二三区好的| 在线观看一区二区视频| 久久亚洲精品小早川怜子| 亚洲激情网站免费观看| 韩日精品视频一区| 欧美性xxxxxxxx| 国产亚洲综合色| 亚洲成a人v欧美综合天堂| 国产成人99久久亚洲综合精品| 色94色欧美sute亚洲线路一ni| 精品国产免费一区二区三区四区 | 国产一区亚洲一区| 91久久精品一区二区| 欧美一级日韩免费不卡| 亚洲视频每日更新| 国产精品91一区二区| 欧美日韩国产精品成人| 日韩理论在线观看| 国产成人精品影视| 欧美大尺度电影在线| 亚洲色图在线视频| 成人性生交大片免费看中文网站| 7777精品久久久大香线蕉| 亚洲精品成人精品456| 国产精品白丝jk白祙喷水网站| 91麻豆精品国产91久久久久| 亚洲国产裸拍裸体视频在线观看乱了| 国产一区二区精品久久99| 欧美挠脚心视频网站| 亚洲精选一二三| 99v久久综合狠狠综合久久| 久久免费视频色| 蜜乳av一区二区| 7777精品久久久大香线蕉| 亚洲一卡二卡三卡四卡无卡久久| 成人高清在线视频| 中文字幕精品一区二区精品绿巨人| 老司机午夜精品| 日韩一级成人av| 日韩高清一区在线| 欧美在线一二三四区| 一区二区在线观看免费视频播放 | 日韩美女视频一区二区| 国产成人免费在线观看| 国产日韩精品一区二区三区| 国产成人免费在线观看| 亚洲国产精品成人综合色在线婷婷| 男女视频一区二区| 欧美一区二区三区在线观看视频|