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

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

?? at91_pdc.h

?? H9200F(2.6.12)的音頻接口驅動。 操作方法: 1、將驅動程序rsound.ko拷貝到系統目錄:/lib/modules 2、執行如下命令加載模塊: insmod /
?? H
字號:
/*----------------------------------------------------------
**	linux/drivers/at91/at91_pdc.h(DMA)
**		
**
**	Copyright (C) 2006 Hyesco Technology Co.,Ltd
**
**	Author: casiawu <wujh@hyesco.com>
**
**	History:
**
**	2006.4   casiawu  <wujh@hyesco.com>
**               Original version
**---------------------------------------------------------*/

#ifndef __AT91_PDC_H_
#define __AT91_PDC_H_

#include <linux/types.h>
#include <linux/dma-mapping.h>
#include <asm/semaphore.h>
#include <asm/mach-types.h>

#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/arch/hardware.h>
#include <asm/arch/AT91RM9200_PDC.h>
#include <asm/irq.h>

#undef DEBUG 
//#define DEBUG 1 
#ifdef DEBUG
#define DPRINTK( x... )  printk(x)
#else
#define DPRINTK( x... )
#endif


#define dma_regs_t AT91PS_PDC

/* Maximum physical DMA buffer size */
//#define MAX_DMA_SIZE		(16*1024)

/* Typedefs for integer types */
typedef unsigned char U8;	           /* unsigned 8 bit data  */
typedef unsigned short U16;	         /* unsigned 16 bit data */
typedef unsigned long U32;	         /* unsigned 32 bit data */
typedef signed char S8;		           /* signed 8 bit data    */
typedef short S16;		               /* signed 16 bit data   */
typedef long  S32;		               /* signed 32 bit data   */

typedef void (*dma_callback_t)( void *buf_id, int size );
typedef void (*dma_readstat_t)( U8 * size );
typedef void (*dma_irq_t)( U8 size );


/*
 * DMA buffer structure
 */

typedef struct dma_buf_s {
	U32 size;		                        /* buffer size */
	dma_addr_t dma_start;	              /* starting DMA address */
	dma_addr_t dma_ptr;	                /* next DMA pointer to use */
	void *id;		                        /* to identify buffer from outside */
	struct dma_buf_s *next;	            /* next buffer to process */
} dma_buf_t;


/*
 * DMA channel structure.
 */

typedef struct {
	dma_buf_t *head;	                  /* where to insert buffers */
	dma_buf_t *tail;	                  /* where to remove buffers */
	dma_buf_t *curr;	                  /* buffer currently DMA'ed */
	dma_regs_t regs;	                  /* points to appropriate DMA registers */
	dma_irq_t  irq_on_off;              /* ... enable or disable irq */	
	dma_callback_t callback;            /* ... to call when buffers are done */		 
	U8 flag;                            /* 0 : wtite dma channel; 1: read dma channel */	
	U8 type;                            /* dma transmit type,1 : byte; 2: half word 4: word*/	
	U8 dma_channel;	                    /* dma channel,0 : 1 : 2 */
} at91rm9200_dma_t;


/*
 * DMA channel user state stucture
 */
typedef struct {
	U32 in_use;	                        /* Device is allocated */
	const char  * device_id;	          /* Device name */	
	U8 irq;		                          /* IRQ used by the channel */	 
	at91rm9200_dma_t* out_chan;         /* DMA output channel      */
	at91rm9200_dma_t* in_chan;         /* DMA output channel       */
	dma_readstat_t readstatback ;       /* read device status  reg */ 
} at91rm9200_dma_state_t;
	
 
/*-----------------------------------------------------
 * Name :      at91rm9200_start_dma()
 * Function:   Process the dma transmition  
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/

static int at91rm9200_start_dma(at91rm9200_dma_t * dma, dma_buf_t *buf1, dma_buf_t *buf2, int flag)
{
	 dma_regs_t regs = dma->regs;
	 U8 channel = dma->flag ;
	 int type=0;
	 
	 type = dma->type;
	 
	 DPRINTK("coming into at91rm9200_start_dma\n\r");
	 
	 //rx
	 if(channel)	 
	 {
	 	if(buf2 != NULL)
	 	{
			regs->PDC_RPR  = buf1->dma_ptr;
   	  regs->PDC_RCR  = buf1->size / type;
   	  regs->PDC_RNPR = buf2->dma_ptr;
   	  regs->PDC_RNCR = buf2->size / type;   	  	 		
	  }
	  else
	  {
	  	if(flag == 2)
	  	{
	  		regs->PDC_RPR  = buf1->dma_ptr;
   	  	regs->PDC_RCR  = buf1->size / type;
   	  }
   	  else
   	  {
	  		regs->PDC_RNPR  = buf1->dma_ptr;
   	  	regs->PDC_RNCR  = buf1->size / type;   	  	
   	  }
	  }
	 }
	 //tx
	 else
	 {
	 	if(buf2 != NULL)
	 	{
			regs->PDC_TPR  = buf1->dma_ptr;
   	  regs->PDC_TCR  = buf1->size / type;
   	  regs->PDC_TNPR = buf2->dma_ptr;
   	  regs->PDC_TNCR = buf2->size / type;   	  	 		
	  }
	  else
	  {
	  	if(flag == 2)
	  	{
	  		regs->PDC_TPR  = buf1->dma_ptr;
   	  	regs->PDC_TCR  = buf1->size / type;
   	  }
   	  else
   	  {
	  		regs->PDC_TNPR  = buf1->dma_ptr;
   	  	regs->PDC_TNCR  = buf1->size / type;   	  	
   	  }
	  } 	
	 }
	 wmb();
   if ((dma->irq_on_off) && (flag == 2))
   	dma->irq_on_off(1);  

	 return 0;
}


/*-----------------------------------------------------
 * Name :      process_dma()
 * Function:   Set the callback function for dma 
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/

/* This must be called with IRQ disabled */
static void process_dma(at91rm9200_dma_t * dma)
{
	 dma_buf_t *buf;
	 int type=0;
	 
	 type = dma->type;

	 DPRINTK("coming into process_dma\n\r");

	for (;;) {
		buf = dma->tail;

		if (buf == NULL )     break;    // exit the cycle

		/*
		 * Let's try to start DMA on the current buffer.
		 * If DMA is busy then we break here.
		*/
		
		switch(dma->dma_channel)
		{
			case 2:
				if(buf->next == NULL)
				{
					at91rm9200_start_dma(dma, buf,NULL,2);
					dma->tail = buf->next;
				}
				else
				{
					at91rm9200_start_dma(dma, buf,buf->next,2);
					dma->tail = buf->next->next;
				}
				dma->dma_channel = 0;
				break;
				
			case 1:
					at91rm9200_start_dma(dma, buf,NULL,1);
					dma->tail = buf->next;
					dma->dma_channel = 0;
				break;
				
			case 0:
			default:
				return;
		}

		if (!dma->curr)
			dma->curr = buf;
	}
	
   DPRINTK("exit process_dma\n\r");
}


/*-----------------------------------------------------
 * Name :      at91rm9200_dma_done()
 * Function:   Do some addition work after the transmit have done 
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/

void at91rm9200_dma_done(at91rm9200_dma_t *dma)
{
	 dma_buf_t *buf = dma->curr;
	 
	 DPRINTK("coming into at91rm9200_dma_done\n\r");	 
   
	 if ((dma->irq_on_off) &&(dma->dma_channel == 2))
   	dma->irq_on_off(0);  
   
	 if (buf != NULL) 
   {
		 /*
		  * Current buffer is done.
			* Move current reference to the next one and send
			* the processed buffer to the callback function,
			* then discard it.
			*/
			dma->curr = buf->next;
			if (dma->head == buf)
				dma->head = NULL;
			if (dma->callback) 
			{
				dma->callback(buf->id, buf->size);
			}
			kfree(buf);
	}

	wmb();
	process_dma(dma);
}


/*-----------------------------------------------------
 * Name :      at91rm9200_dma_queue_buffer()
 * Function:   Place the buffer to DMA handle queue 
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/

int at91rm9200_dma_queue_buffer(at91rm9200_dma_t *dma, void *buf_id,
			    dma_addr_t data, int size)
{
	 dma_buf_t *buf;
	 int flags;

	 DPRINTK("at91rm9200_dma_queue_buffer\n\r");

	 buf = kmalloc(sizeof(*buf), GFP_ATOMIC);
	 if (!buf)
		return -ENOMEM;

	 buf->next = NULL;
	 buf->dma_ptr = buf->dma_start = data;
	 buf->size = size;
	 buf->id = buf_id;

	 local_irq_save(flags);
	 
	 if (dma->head)
	 dma->head->next = buf;

	 dma->head = buf;
	 
	 if (!dma->tail)
	 dma->tail = buf;
	 
	 wmb();
	 
	 process_dma(dma);
	 local_irq_restore(flags);

	 return 0;
}


/*-----------------------------------------------------
 * Name :      at91rm9200_dma_flush_all()
 * Function:   flush out at91rm9200_dma_t struct before free it
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/
 
int at91rm9200_dma_flush_all(at91rm9200_dma_t *dma)
{
    int flags;
    dma_buf_t *buf, *next_buf;
    
	  DPRINTK("at91rm9200_dma_flush_all\n\r");    

	  local_irq_save(flags);
		
	  buf = dma->curr;
	  if (!buf)
		  buf = dma->tail;
	  
	  dma->head = dma->tail = dma->curr = NULL;
	  //process_dma(dma);
	  
	  local_irq_restore(flags);
	
	  while (buf) {
		next_buf = buf->next;
		kfree(buf);
		buf = next_buf;
	 }

	 return 0;
}


/*-----------------------------------------------------
 * Name :      dma_irq_handler()
 * Function:   dma irq servive function
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/

static irqreturn_t dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{   
    at91rm9200_dma_state_t *state = (at91rm9200_dma_state_t *) dev_id;
    U8 status = 0;   
    
    DPRINTK("dma_irq_handler\n\r"); 
                      
    if(state->readstatback)
    state->readstatback(&status);  
          
    switch(status)
    {
        case 1:
              state->out_chan -> dma_channel = 1;        	
              at91rm9200_dma_done (state->out_chan);
        break;
        
        case 2:
              state->out_chan -> dma_channel = 2;         	
              at91rm9200_dma_done (state->out_chan);
        break;
     
        case 3:
              state->in_chan -> dma_channel = 1;         	
       		    at91rm9200_dma_done (state->in_chan);    		    
        break;  

        case 4:
              state->in_chan -> dma_channel = 2;         	
       		    at91rm9200_dma_done (state->in_chan);    		    
        break;           		  
          		   
        default:
  	    break;
           	     
    } 
		
  return IRQ_HANDLED;       	   
}


/*-----------------------------------------------------
 * Name :      at91rm9200_dma_init()
 * Function:   Init the at91rm9200_dma_t struct for the device 
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/
 
int at91rm9200_dma_init(at91rm9200_dma_state_t *state)
{
	  int err = 0;
	  
	  state->in_use = 1;
	  
	  DPRINTK("at91rm9200_dma_init\n\r"); 	  
	  
	  err = request_irq(state->irq, dma_irq_handler, SA_INTERRUPT,
			  state->device_id, (void *) state);
			  
	  if (err) {
		    printk(KERN_ERR
		       "%s: unable to request IRQ %d for DMA channel\n",
		       state->device_id, state->irq);
		    return err;
	  }

	  return 0;	  
}

/*-----------------------------------------------------
 * Name :      at91rm9200_free_dma()
 * Function:   free the dma irq for the device 
 * Last rework data: 06-04-13   wujh@hyesco.com
 *----------------------------------------------------*/

void at91rm9200_free_dma(at91rm9200_dma_state_t *state)
{
	 if (!state->in_use) {
		 //printk(KERN_ERR "Trying to free free DMA%d\n", state->irq);
		 return;
	 }

	 DPRINTK("at91rm9200_free_dma\n\r"); 

	 at91rm9200_dma_flush_all(state->out_chan);
	 at91rm9200_dma_flush_all(state->in_chan);	 
	 
	 free_irq(state->irq, (void *) state);
	
	 state->in_use = 0;

}


#endif // __AT91_PDC_H_

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一级片在线观看| 国产成人精品亚洲日本在线桃色| 欧美在线你懂得| 亚洲国产精品一区二区www在线| 在线视频欧美精品| 天天综合天天做天天综合| 欧美一区二区三区四区视频| 久久99久久99小草精品免视看| 精品国产免费一区二区三区四区 | ㊣最新国产の精品bt伙计久久| 成人精品gif动图一区| 国产精品电影院| 91小视频在线免费看| 亚洲综合一二三区| 欧美一区二区三区在线看| 寂寞少妇一区二区三区| 国产视频一区二区三区在线观看| av中文字幕不卡| 亚欧色一区w666天堂| 精品国产凹凸成av人导航| 国产suv精品一区二区三区| 中文字幕在线不卡一区| 欧美日韩精品福利| 激情图区综合网| 日韩毛片视频在线看| 91精品免费在线| 丰满放荡岳乱妇91ww| 亚洲精品久久嫩草网站秘色| 欧美白人最猛性xxxxx69交| 国产suv精品一区二区6| 午夜精品久久久久| 国产欧美精品区一区二区三区| 91官网在线观看| 国产精品18久久久久久vr| 一区二区三区在线观看网站| 日韩精品在线一区二区| 97精品久久久久中文字幕| 久久电影网站中文字幕| 亚洲欧美日韩国产一区二区三区| 精品少妇一区二区三区| 欧美午夜精品一区二区三区| 成人免费视频播放| 麻豆91在线播放| 一区二区三区日本| 国产精品乱码人人做人人爱| 日韩一级高清毛片| 色中色一区二区| 国产成人综合亚洲网站| 日韩精品五月天| 亚洲久本草在线中文字幕| 久久九九99视频| 欧美一个色资源| 精品视频在线视频| 91蜜桃视频在线| 国产成人亚洲精品狼色在线| 麻豆成人91精品二区三区| 五月婷婷色综合| 日韩理论片一区二区| 久久美女高清视频| 欧美成人艳星乳罩| 欧美一区二区三区四区高清| 欧美日韩一区二区三区四区五区 | 国产剧情一区二区| 另类成人小视频在线| 天天色图综合网| 亚洲午夜免费福利视频| 亚洲尤物在线视频观看| 亚洲精品一二三| 亚洲女同ⅹxx女同tv| 成人免费在线视频| 亚洲天堂久久久久久久| 综合亚洲深深色噜噜狠狠网站| 国产欧美精品区一区二区三区 | 秋霞电影一区二区| 视频在线观看91| 亚洲地区一二三色| 日韩精品一级二级 | 亚洲欧美日韩国产综合| 自拍av一区二区三区| 亚洲日韩欧美一区二区在线| 国产精品另类一区| 亚洲欧洲国产日韩| 一区二区在线看| 亚洲美女少妇撒尿| 一区二区三区国产豹纹内裤在线| 亚洲情趣在线观看| 亚洲一区在线观看网站| 亚洲成人1区2区| 日韩电影一二三区| 精品一区二区三区日韩| 国产一区三区三区| 成人午夜激情片| 91搞黄在线观看| 欧美一级高清大全免费观看| 欧美一区二区免费视频| 久久亚洲春色中文字幕久久久| 久久久久久一二三区| 国产精品伦一区| 午夜欧美在线一二页| 免费一区二区视频| 国产福利一区二区| 欧美综合视频在线观看| 欧美成人在线直播| 国产精品电影院| 日韩电影在线看| 成人激情文学综合网| 欧美亚洲综合色| 久久综合久久综合久久综合| 亚洲天堂福利av| 久久机这里只有精品| 99视频在线精品| 日韩一区二区在线看片| 欧美国产精品中文字幕| 亚洲第一会所有码转帖| 国产乱码字幕精品高清av| 色婷婷av一区二区三区软件| 欧美精品精品一区| 欧美羞羞免费网站| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 爽好久久久欧美精品| 青青草一区二区三区| 毛片av中文字幕一区二区| 成人福利电影精品一区二区在线观看| 色综合久久天天综合网| 欧美一区日韩一区| 日本一区二区电影| 中文字幕一区二区三区视频| 六月丁香婷婷色狠狠久久| 国产成人免费av在线| 欧美日韩一区二区三区不卡 | 国内精品在线播放| 91香蕉视频黄| 日韩欧美国产不卡| 国产精品久久久久久户外露出| 亚洲福利视频导航| 国模大尺度一区二区三区| 91亚洲国产成人精品一区二三| 国产成人综合精品三级| 国内精品伊人久久久久av影院| 国产a精品视频| 成人av电影在线| 91精品久久久久久蜜臀| 亚洲欧美在线视频| 日本免费在线视频不卡一不卡二| 东方aⅴ免费观看久久av| 欧美人xxxx| 亚洲不卡av一区二区三区| 国产老肥熟一区二区三区| 欧美年轻男男videosbes| 国产精品国产成人国产三级 | 亚洲午夜一区二区| 毛片一区二区三区| 欧美一区永久视频免费观看| 最新欧美精品一区二区三区| 狠狠色丁香婷婷综合| 欧美日韩精品是欧美日韩精品| 国产午夜精品久久久久久免费视 | 欧美午夜电影网| 欧美激情一区二区三区不卡| 免费视频最近日韩| 欧美日韩国产天堂| 亚洲成人一区二区| 99这里只有久久精品视频| 久久久99久久| 免费久久精品视频| 色综合天天天天做夜夜夜夜做| 国产精品久久久久永久免费观看 | 亚洲激情在线激情| 成人黄色大片在线观看| 久久欧美中文字幕| 玖玖九九国产精品| 欧美一区二区三区视频免费| 亚洲mv在线观看| 99久久精品国产一区| 国产精品美女久久久久久久久| 国产传媒日韩欧美成人| 久久色中文字幕| 日韩高清一区二区| 久久久一区二区三区捆绑**| 裸体一区二区三区| 日韩免费电影网站| 久久国产夜色精品鲁鲁99| 3atv一区二区三区| 午夜一区二区三区视频| 欧美日韩久久一区二区| 亚洲成av人影院| 欧美精品v国产精品v日韩精品| 日本不卡一二三区黄网| 91精品国产91久久综合桃花| 日本va欧美va瓶| 日韩一区二区影院| 国产在线观看免费一区| 欧美激情资源网| 国产一区二区精品久久91| 亚洲国产高清不卡| 成人免费高清视频| 一区二区三区蜜桃| 欧美日韩在线精品一区二区三区激情| 亚洲成人精品在线观看| 精品欧美一区二区三区精品久久|