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

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

?? dmabuf.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * sound/dmabuf.c * * The DMA buffer manager for digitized voice applications *//* * Copyright (C) by Hannu Savolainen 1993-1997 * * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL) * Version 2 (June 1991). See the "COPYING" file distributed with this software * for more info. * * Thomas Sailer   : moved several static variables into struct audio_operations *                   (which is grossly misnamed btw.) because they have the same *                   lifetime as the rest in there and dynamic allocation saves *                   12k or so * Thomas Sailer   : remove {in,out}_sleep_flag. It was used for the sleeper to *                   determine if it was woken up by the expiring timeout or by *                   an explicit wake_up. The return value from schedule_timeout *		     can be used instead; if 0, the wakeup was due to the timeout. * * Rob Riggs		Added persistent DMA buffers (1998/10/17) */#define BE_CONSERVATIVE#define SAMPLE_ROUNDUP 0#include "sound_config.h"#include <linux/wrapper.h>#define DMAP_FREE_ON_CLOSE      0#define DMAP_KEEP_ON_CLOSE      1extern int sound_dmap_flag;static void dma_reset_output(int dev);static void dma_reset_input(int dev);static int local_start_dma(struct audio_operations *adev, unsigned long physaddr, int count, int dma_mode);static int debugmem = 0;	/* switched off by default */static int dma_buffsize = DSP_BUFFSIZE;static long dmabuf_timeout(struct dma_buffparms *dmap){	long tmout;	tmout = (dmap->fragment_size * HZ) / dmap->data_rate;	tmout += HZ / 5;	/* Some safety distance */	if (tmout < (HZ / 2))		tmout = HZ / 2;	if (tmout > 20 * HZ)		tmout = 20 * HZ;	return tmout;}static int sound_alloc_dmap(struct dma_buffparms *dmap){	char *start_addr, *end_addr;	int dma_pagesize;	int sz, size;	struct page *page;	dmap->mapping_flags &= ~DMA_MAP_MAPPED;	if (dmap->raw_buf != NULL)		return 0;	/* Already done */	if (dma_buffsize < 4096)		dma_buffsize = 4096;	dma_pagesize = (dmap->dma < 4) ? (64 * 1024) : (128 * 1024);		/*	 *	Now check for the Cyrix problem.	 */	 	if(isa_dma_bridge_buggy==2)		dma_pagesize=32768;	 	dmap->raw_buf = NULL;	dmap->buffsize = dma_buffsize;	if (dmap->buffsize > dma_pagesize)		dmap->buffsize = dma_pagesize;	start_addr = NULL;	/*	 * Now loop until we get a free buffer. Try to get smaller buffer if	 * it fails. Don't accept smaller than 8k buffer for performance	 * reasons.	 */	while (start_addr == NULL && dmap->buffsize > PAGE_SIZE) {		for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1);		dmap->buffsize = PAGE_SIZE * (1 << sz);		start_addr = (char *) __get_free_pages(GFP_ATOMIC|GFP_DMA, sz);		if (start_addr == NULL)			dmap->buffsize /= 2;	}	if (start_addr == NULL) {		printk(KERN_WARNING "Sound error: Couldn't allocate DMA buffer\n");		return -ENOMEM;	} else {		/* make some checks */		end_addr = start_addr + dmap->buffsize - 1;		if (debugmem)			printk(KERN_DEBUG "sound: start 0x%lx, end 0x%lx\n", (long) start_addr, (long) end_addr);				/* now check if it fits into the same dma-pagesize */		if (((long) start_addr & ~(dma_pagesize - 1)) != ((long) end_addr & ~(dma_pagesize - 1))		    || end_addr >= (char *) (MAX_DMA_ADDRESS)) {			printk(KERN_ERR "sound: Got invalid address 0x%lx for %db DMA-buffer\n", (long) start_addr, dmap->buffsize);			return -EFAULT;		}	}	dmap->raw_buf = start_addr;	dmap->raw_buf_phys = virt_to_bus(start_addr);	for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)		mem_map_reserve(page);	return 0;}static void sound_free_dmap(struct dma_buffparms *dmap){	int sz, size;	struct page *page;	unsigned long start_addr, end_addr;	if (dmap->raw_buf == NULL)		return;	if (dmap->mapping_flags & DMA_MAP_MAPPED)		return;		/* Don't free mmapped buffer. Will use it next time */	for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1);	start_addr = (unsigned long) dmap->raw_buf;	end_addr = start_addr + dmap->buffsize;	for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)		mem_map_unreserve(page);	free_pages((unsigned long) dmap->raw_buf, sz);	dmap->raw_buf = NULL;}/* Intel version !!!!!!!!! */static int sound_start_dma(struct dma_buffparms *dmap, unsigned long physaddr, int count, int dma_mode){	unsigned long flags;	int chan = dmap->dma;	/* printk( "Start DMA%d %d, %d\n",  chan,  (int)(physaddr-dmap->raw_buf_phys),  count); */	flags = claim_dma_lock();	disable_dma(chan);	clear_dma_ff(chan);	set_dma_mode(chan, dma_mode);	set_dma_addr(chan, physaddr);	set_dma_count(chan, count);	enable_dma(chan);	release_dma_lock(flags);	return 0;}static void dma_init_buffers(struct dma_buffparms *dmap){	dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;	dmap->byte_counter = 0;	dmap->max_byte_counter = 8000 * 60 * 60;	dmap->bytes_in_use = dmap->buffsize;	dmap->dma_mode = DMODE_NONE;	dmap->mapping_flags = 0;	dmap->neutral_byte = 0x80;	dmap->data_rate = 8000;	dmap->cfrag = -1;	dmap->closing = 0;	dmap->nbufs = 1;	dmap->flags = DMA_BUSY;	/* Other flags off */}static int open_dmap(struct audio_operations *adev, int mode, struct dma_buffparms *dmap){	int err;		if (dmap->flags & DMA_BUSY)		return -EBUSY;	if ((err = sound_alloc_dmap(dmap)) < 0)		return err;	if (dmap->raw_buf == NULL) {		printk(KERN_WARNING "Sound: DMA buffers not available\n");		return -ENOSPC;	/* Memory allocation failed during boot */	}	if (dmap->dma >= 0 && sound_open_dma(dmap->dma, adev->name)) {		printk(KERN_WARNING "Unable to grab(2) DMA%d for the audio driver\n", dmap->dma);		return -EBUSY;	}	dma_init_buffers(dmap);	dmap->open_mode = mode;	dmap->subdivision = dmap->underrun_count = 0;	dmap->fragment_size = 0;	dmap->max_fragments = 65536;	/* Just a large value */	dmap->byte_counter = 0;	dmap->max_byte_counter = 8000 * 60 * 60;	dmap->applic_profile = APF_NORMAL;	dmap->needs_reorg = 1;	dmap->audio_callback = NULL;	dmap->callback_parm = 0;	return 0;}static void close_dmap(struct audio_operations *adev, struct dma_buffparms *dmap){	unsigned long flags;		if (dmap->dma >= 0) {		sound_close_dma(dmap->dma);		flags=claim_dma_lock();		disable_dma(dmap->dma);		release_dma_lock(flags);	}	if (dmap->flags & DMA_BUSY)		dmap->dma_mode = DMODE_NONE;	dmap->flags &= ~DMA_BUSY;		if (sound_dmap_flag == DMAP_FREE_ON_CLOSE)		sound_free_dmap(dmap);}static unsigned int default_set_bits(int dev, unsigned int bits){	mm_segment_t fs = get_fs();	set_fs(get_ds());	audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SETFMT, (caddr_t)&bits);	set_fs(fs);	return bits;}static int default_set_speed(int dev, int speed){	mm_segment_t fs = get_fs();	set_fs(get_ds());	audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SPEED, (caddr_t)&speed);	set_fs(fs);	return speed;}static short default_set_channels(int dev, short channels){	int c = channels;	mm_segment_t fs = get_fs();	set_fs(get_ds());	audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_CHANNELS, (caddr_t)&c);	set_fs(fs);	return c;}static void check_driver(struct audio_driver *d){	if (d->set_speed == NULL)		d->set_speed = default_set_speed;	if (d->set_bits == NULL)		d->set_bits = default_set_bits;	if (d->set_channels == NULL)		d->set_channels = default_set_channels;}int DMAbuf_open(int dev, int mode){	struct audio_operations *adev = audio_devs[dev];	int retval;	struct dma_buffparms *dmap_in = NULL;	struct dma_buffparms *dmap_out = NULL;	if (!adev)		  return -ENXIO;	if (!(adev->flags & DMA_DUPLEX))		adev->dmap_in = adev->dmap_out;	check_driver(adev->d);	if ((retval = adev->d->open(dev, mode)) < 0)		return retval;	dmap_out = adev->dmap_out;	dmap_in = adev->dmap_in;	if (dmap_in == dmap_out)		adev->flags &= ~DMA_DUPLEX;	if (mode & OPEN_WRITE) {		if ((retval = open_dmap(adev, mode, dmap_out)) < 0) {			adev->d->close(dev);			return retval;		}	}	adev->enable_bits = mode;	if (mode == OPEN_READ || (mode != OPEN_WRITE && (adev->flags & DMA_DUPLEX))) {		if ((retval = open_dmap(adev, mode, dmap_in)) < 0) {			adev->d->close(dev);			if (mode & OPEN_WRITE)				close_dmap(adev, dmap_out);			return retval;		}	}	adev->open_mode = mode;	adev->go = 1;	adev->d->set_bits(dev, 8);	adev->d->set_channels(dev, 1);	adev->d->set_speed(dev, DSP_DEFAULT_SPEED);	if (adev->dmap_out->dma_mode == DMODE_OUTPUT) 		memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte,		       adev->dmap_out->bytes_in_use);	return 0;}void DMAbuf_reset(int dev){	if (audio_devs[dev]->open_mode & OPEN_WRITE)		dma_reset_output(dev);	if (audio_devs[dev]->open_mode & OPEN_READ)		dma_reset_input(dev);}static void dma_reset_output(int dev){	struct audio_operations *adev = audio_devs[dev];	unsigned long flags,f ;	struct dma_buffparms *dmap = adev->dmap_out;	if (!(dmap->flags & DMA_STARTED))	/* DMA is not active */		return;	/*	 *	First wait until the current fragment has been played completely	 */	save_flags(flags);	cli();	adev->dmap_out->flags |= DMA_SYNCING;	adev->dmap_out->underrun_count = 0;	if (!signal_pending(current) && adev->dmap_out->qlen && 	    adev->dmap_out->underrun_count == 0)		interruptible_sleep_on_timeout(&adev->out_sleeper,					       dmabuf_timeout(dmap));	adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);	/*	 *	Finally shut the device off	 */	if (!(adev->flags & DMA_DUPLEX) || !adev->d->halt_output)		adev->d->halt_io(dev);	else		adev->d->halt_output(dev);	adev->dmap_out->flags &= ~DMA_STARTED;		f=claim_dma_lock();	clear_dma_ff(dmap->dma);	disable_dma(dmap->dma);	release_dma_lock(f);		restore_flags(flags);	dmap->byte_counter = 0;	reorganize_buffers(dev, adev->dmap_out, 0);	dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;}static void dma_reset_input(int dev){        struct audio_operations *adev = audio_devs[dev];	unsigned long flags;	struct dma_buffparms *dmap = adev->dmap_in;	save_flags(flags);	cli();	if (!(adev->flags & DMA_DUPLEX) || !adev->d->halt_input)		adev->d->halt_io(dev);	else		adev->d->halt_input(dev);	adev->dmap_in->flags &= ~DMA_STARTED;	restore_flags(flags);	dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;	dmap->byte_counter = 0;	reorganize_buffers(dev, adev->dmap_in, 1);}void DMAbuf_launch_output(int dev, struct dma_buffparms *dmap){	struct audio_operations *adev = audio_devs[dev];	if (!((adev->enable_bits * adev->go) & PCM_ENABLE_OUTPUT))		return;		/* Don't start DMA yet */	dmap->dma_mode = DMODE_OUTPUT;	if (!(dmap->flags & DMA_ACTIVE) || !(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) {		if (!(dmap->flags & DMA_STARTED)) {			reorganize_buffers(dev, dmap, 0);			if (adev->d->prepare_for_output(dev, dmap->fragment_size, dmap->nbufs))				return;			if (!(dmap->flags & DMA_NODMA))				local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_WRITE);			dmap->flags |= DMA_STARTED;		}		if (dmap->counts[dmap->qhead] == 0)			dmap->counts[dmap->qhead] = dmap->fragment_size;		dmap->dma_mode = DMODE_OUTPUT;		adev->d->output_block(dev, dmap->raw_buf_phys + dmap->qhead * dmap->fragment_size,				      dmap->counts[dmap->qhead], 1);		if (adev->d->trigger)			adev->d->trigger(dev,adev->enable_bits * adev->go);	}	dmap->flags |= DMA_ACTIVE;}int DMAbuf_sync(int dev){	struct audio_operations *adev = audio_devs[dev];	unsigned long flags;	int n = 0;	struct dma_buffparms *dmap;	if (!adev->go && !(adev->enable_bits & PCM_ENABLE_OUTPUT))		return 0;	if (adev->dmap_out->dma_mode == DMODE_OUTPUT) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情在线看| 亚洲成人自拍网| 亚洲成人手机在线| 国产伦精品一区二区三区免费| 色悠久久久久综合欧美99| 日韩一级在线观看| 夜夜嗨av一区二区三区网页 | 成人做爰69片免费看网站| 欧美日韩免费电影| 亚洲女同一区二区| 成人国产视频在线观看| 精品久久国产老人久久综合| 亚洲国产一区二区视频| 97久久久精品综合88久久| 久久精品一区二区三区不卡牛牛| 日日噜噜夜夜狠狠视频欧美人| 97久久人人超碰| 一区在线观看视频| 成人一二三区视频| 久久久久久电影| 精品无码三级在线观看视频| 欧美美女bb生活片| 五月激情综合网| 欧美性猛交xxxx乱大交退制版 | 日韩午夜小视频| 午夜欧美一区二区三区在线播放| 色综合久久天天| 亚洲日本韩国一区| 日本韩国欧美一区二区三区| 久久久精品影视| 极品少妇xxxx偷拍精品少妇| 精品国产乱码久久久久久夜甘婷婷| 亚洲国产精品久久久久秋霞影院 | 亚洲精品乱码久久久久久黑人| 粉嫩aⅴ一区二区三区四区| 国产视频视频一区| 成人免费不卡视频| 亚洲图片激情小说| 91久久精品一区二区二区| 亚洲精品福利视频网站| 欧洲日韩一区二区三区| 亚洲成人av一区二区| 91精品一区二区三区久久久久久 | 国产成人夜色高潮福利影视| 国产亚洲一二三区| 99精品在线免费| 亚洲电影一级黄| 欧美一区二区三区视频| 激情六月婷婷久久| 欧美国产精品久久| 99re在线视频这里只有精品| 亚洲一区二区三区国产| 3d动漫精品啪啪1区2区免费| 91麻豆精品国产91久久久使用方法| 亚洲特黄一级片| 亚洲自拍欧美精品| 日韩你懂的在线播放| 七七婷婷婷婷精品国产| 国产一区二区三区免费看 | 成人av影视在线观看| 亚洲精品国产a久久久久久 | 国产91富婆露脸刺激对白| 亚洲欧洲精品一区二区精品久久久| 欧美综合视频在线观看| 麻豆精品久久久| 国产精品第13页| 3atv一区二区三区| 成人免费毛片a| 日韩中文欧美在线| 欧美高清在线视频| 欧美日韩国产综合视频在线观看| www国产成人免费观看视频 深夜成人网| 经典三级一区二区| 亚洲欧洲日韩av| 91精品国产高清一区二区三区 | 91精品国产综合久久久久久| 国产一区二区女| 亚洲成在线观看| 国产精品久久久久9999吃药| 日韩一区二区在线观看视频播放| 成人动漫一区二区在线| 奇米888四色在线精品| 亚洲女人小视频在线观看| 精品三级在线观看| 在线观看免费亚洲| eeuss国产一区二区三区| 免费在线视频一区| 亚洲午夜久久久久久久久久久| 国产性天天综合网| 日韩欧美国产系列| 欧美精品久久99久久在免费线| thepron国产精品| 国产一区二区三区免费播放| 水野朝阳av一区二区三区| 亚洲少妇最新在线视频| 国产亚洲欧洲997久久综合| 欧美一区二区三区免费观看视频| 欧美这里有精品| 国产精品538一区二区在线| 亚洲色图丝袜美腿| 欧美性猛交xxxx黑人交| 日韩精品一卡二卡三卡四卡无卡| 欧美一区二区三区日韩视频| 一区二区三区 在线观看视频 | 一区二区三区不卡在线观看| 国产精品素人视频| 2023国产一二三区日本精品2022| 日韩视频在线你懂得| 欧美性大战久久久久久久蜜臀| 91在线视频观看| www.日韩av| 97se亚洲国产综合自在线 | 免费看日韩a级影片| 亚洲成人激情社区| 亚洲大片免费看| 图片区日韩欧美亚洲| 午夜不卡av在线| 日韩av一二三| 蜜臀av性久久久久av蜜臀妖精| 亚洲另类中文字| 亚洲欧洲制服丝袜| 一本久久a久久免费精品不卡| 国产91高潮流白浆在线麻豆| 久久91精品国产91久久小草| 久久精品二区亚洲w码| 蜜臀精品久久久久久蜜臀| 久久精品999| 国产乱码精品一区二区三 | 成人av午夜影院| 波多野结衣的一区二区三区| 色综合久久中文字幕综合网| 欧美日韩国产综合草草| 欧美一级欧美三级| 久久久久久一二三区| 国产精品久久久久四虎| 亚洲自拍另类综合| 秋霞电影网一区二区| 国产精品影视网| 91丨九色丨国产丨porny| 欧美日韩国产高清一区二区三区| 欧美一级二级在线观看| 国产色产综合色产在线视频| 国产拍欧美日韩视频二区| 五月综合激情日本mⅴ| 亚洲永久免费av| 亚洲日本丝袜连裤袜办公室| 亚洲国产综合在线| 激情文学综合丁香| av在线一区二区| 欧美日韩中文字幕一区二区| 日韩免费观看高清完整版在线观看| 欧美mv日韩mv| 亚洲免费视频中文字幕| 日本亚洲天堂网| 成人av电影免费在线播放| 欧美区视频在线观看| 国产欧美日韩三区| 日本欧美一区二区在线观看| 大白屁股一区二区视频| 欧美精品tushy高清| 日本一区二区在线不卡| 三级不卡在线观看| 99精品视频在线免费观看| 日韩视频在线观看一区二区| 亚洲精选免费视频| 国产精品影视天天线| 91精品国产一区二区人妖| 亚洲天天做日日做天天谢日日欢| 久久精品久久综合| 欧美视频你懂的| 国产欧美日韩综合| 一本一道综合狠狠老| 免费人成黄页网站在线一区二区| 成人av网址在线| 亚洲精品一区二区三区蜜桃下载 | 91精品国产免费久久综合| 国产精品久久久久久久久久免费看| 日韩成人av影视| 欧美在线观看视频在线| 国产精品乱人伦| 国产精品一二三四区| 亚洲精品一区二区三区四区高清 | 自拍偷拍亚洲欧美日韩| 国产一区二区导航在线播放| 在线成人av影院| 亚洲大片精品永久免费| 在线视频国内自拍亚洲视频| 国产精品久久久久久户外露出 | 国产日韩影视精品| 天天综合天天综合色| 亚洲第一av色| 日本一区二区在线不卡| 91老司机福利 在线| 久久精品999| 亚洲va在线va天堂| 色综合色综合色综合| 日韩午夜三级在线| 美女久久久精品| 日韩欧美你懂的| 美女精品一区二区|