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

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

?? dsp.c

?? mp2解壓程序
?? C
字號:
/* * MPEG Audio DSP Player Linux Module v0.1 * copyrights (c) 1996 by Michael Hipp *  * Read the README file before using the software!! *//* * gcc -O2 -Wall -m486 -fomit-frame-pointer -DMODULE -D__KERNEL__ -c dsp.c */#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/interrupt.h>#include <linux/ptrace.h>#include <linux/ioport.h>#include <linux/in.h>#include <linux/malloc.h>#include <linux/string.h>#include <asm/system.h>#include <asm/bitops.h>#include <asm/io.h>#include <asm/dma.h>#include <linux/errno.h>#include "dsp_ld.h"#define BUFFER_SIZE 16384#define DSP_MAJOR 62struct cd {    unsigned char bufs[2][BUFFER_SIZE];    int rbuf;    int wbuf;    int rpos;    int wpos;    int state;	int wsize,rsize;    struct wait_queue *waitq;	int base_addr;	int dma;	int irq;	int interrupt;};static int dsp_open_dev(struct inode * inode, struct file * file);static void dsp_release_dev(struct inode * inode, struct file * file);static int dsp_read_dev(struct inode * inode, struct file * file,char *,int);static int dsp_write_dev(struct inode * inode, struct file * file,const char *,int);static int dsp_reset(struct cd *p);static int dsp_write(struct cd *d,unsigned char *buf,int count,int source);static int dsp_probe(struct cd *p);static void dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs);static void dsp_init(struct cd *p, unsigned char *,int m);#define PSS_DATA      0x00#define PSS_STATUS    0x02#define PSS_CONTROL   0x02#define PSS_ID_VERS   0x04#define PSS_CONFIG 0x10#define WSS_CONFIG 0x12#define SB_CONFIG 0x14#define CD_CONFIG 0x16#define MIDI_CONFIG 0x18#define DSP_OPEN		0x1#define DSP_WRITE_READY	0x2#define DSP_RELEASE_WAIT 0x4static struct file_operations dsp_fops = {        NULL,        NULL,           /* read */        dsp_write_dev,	/* write */        NULL,           /* readdir */        NULL,           /* select */        NULL,        NULL,           /* lp_mmap */        dsp_open_dev,        dsp_release_dev};int debug = 0;#define NUM_DEV 1static struct cd devs[NUM_DEV];static int minor2dspnum[3] = { -1 , -1 , -1 };static int dsp_open_dev(struct inode * inode, struct file * file){	unsigned int minor = MINOR(inode->i_rdev);	int dspnum;	int i;	if(debug)		printk(KERN_DEBUG "dsp_open %d\n",minor);	if(minor < 0 || minor > 2) {		return -ENODEV;	}	for(i=0;i<3;i++)	/* currently, only one DSP supported */		if(minor2dspnum[i] >= 0)			return -EAGAIN;	minor2dspnum[minor] = 0;	dspnum = minor2dspnum[minor];	if(devs[dspnum].state)		return -EBUSY;    MOD_INC_USE_COUNT;	devs[dspnum].state = DSP_OPEN;	devs[dspnum].rsize = devs[dspnum].wsize = BUFFER_SIZE;	devs[dspnum].rpos = 0;	devs[dspnum].wpos = 0;	devs[dspnum].rbuf = 0;	devs[dspnum].wbuf = 0;	dsp_init(&devs[dspnum],dspcode,sizeof(dspcode));	return 0;}static void dsp_release_dev(struct inode * inode, struct file * file){	unsigned int minor = MINOR(inode->i_rdev);	int dspnum;	if(debug)		printk(KERN_DEBUG "dsp_release %d\n",minor);	if(minor < 0 || minor > 2) {		return;	}	dspnum = minor2dspnum[minor];	if(dspnum < 0 || !devs[dspnum].state)		return;	if(devs[dspnum].wpos > 0 && (devs[dspnum].wpos < devs[dspnum].wsize) )	/* buffer not empty */	{		char buf[1] = { 0 };		devs[dspnum].wsize = devs[dspnum].wpos + 1;		dsp_write(&devs[dspnum],buf,1,1);	}	devs[dspnum].state = DSP_RELEASE_WAIT;	while(devs[dspnum].wbuf != devs[dspnum].rbuf)		interruptible_sleep_on(&(devs[dspnum].waitq));	minor2dspnum[minor] = -1;	devs[dspnum].state = 0;#if 0	dsp_reset(devs[dspnum].dev);	wake_up_interruptible(&devs[dspnum].waitq);#endif	MOD_DEC_USE_COUNT;}static int dsp_write_dev(struct inode * inode, struct file * file,const char *buf , int count){	unsigned int minor = MINOR(inode->i_rdev);	struct cd *d;	int r,dspnum;	if(minor < 0 || minor > 2)		return -ENODEV;	dspnum = minor2dspnum[minor];    if(dspnum < 0 || !devs[dspnum].state)        return -ENXIO;    if ((r = verify_area(VERIFY_READ, (void *) buf, count)))       return r;	d = &devs[dspnum];	return dsp_write(d,(unsigned char *) buf,count,0);}static int dsp_write(struct cd *d,unsigned char *buf,int count,int source){	int cnt1 = count;	int pos = 0;	while(cnt1) {		if(d->wpos < d->wsize) {			int len = d->wsize - d->wpos;			if(len > cnt1)				len = cnt1;			if(debug)				printk("got %d bytes\n",len);			if(source)	        	memcpy(d->bufs[d->wbuf]+d->wpos,buf+pos,len);			else	        	memcpy_fromfs(d->bufs[d->wbuf]+d->wpos,buf+pos,len);			pos += len;			d->wpos += len;				cnt1 -= len;		}		if(d->wpos >= d->wsize) {			if(d->wbuf == d->rbuf) {				long flags;				d->wbuf++;				d->wbuf &= 0x1;				d->wpos = 0;				d->rpos = 0;				d->rsize = d->wsize;				d->wsize = BUFFER_SIZE;				save_flags(flags);				cli();				if( (inw(d->base_addr+PSS_STATUS) & 0x8000) ) {					unsigned short w;					w = d->bufs[d->rbuf][d->rpos]<<8;					w |= d->bufs[d->rbuf][d->rpos+1];					if(debug)						printk("initial write %02x\n",w);#if 0					outw(0x8000,d->base_addr+PSS_CONTROL);#endif					outw(w,d->base_addr+PSS_DATA);					d->rpos+=2;				}				restore_flags(flags);			}			else if(cnt1 > 0){		        interruptible_sleep_on(&(d->waitq));				if(debug)					printk("waked up %d %d\n",d->state,d->wpos);		        if(!d->state || d->wpos >= d->wsize)		            return 0;			}		}	}	return count;}static int dsp_read_dev(struct inode * inode, struct file * file, char *buf , int count){	unsigned int minor = MINOR(inode->i_rdev);	int dspnum;    if(minor < 0 || minor > 2) {        return -ENODEV;    }	dspnum = minor2dspnum[minor];    if(dspnum < 0 || !devs[dspnum].state)		return -ENXIO;	return 0;}int dsp_probe(struct cd *p){	static int irqtab[] = { -1,-1,-1,0x1,-1,0x2,-1,0x3,-1,0x4,0x5,0x6,0x7 ,-1,-1,-1 };	static int dmatab[] = { 0x1,0x2,-1,0x3,-1,0x5,0x6,0x7 };	unsigned short w;	int dspnum = 0;	p = &devs[dspnum];	outw(0,p->base_addr + PSS_CONFIG);	outw(0,p->base_addr + WSS_CONFIG);	outw(0,p->base_addr + SB_CONFIG);	outw(0,p->base_addr + CD_CONFIG);	outw(0,p->base_addr + MIDI_CONFIG);		/* Grab the region so that no one else tries to probe our ioports. */	if(p->dma <= 7 && dmatab[p->dma] < 0) {		printk("illegal DMA %d\n",p->dma);		return -EAGAIN;	}	if(p->irq < 0 || p->irq > 15 || irqtab[p->irq] < 0) {		printk("illegal IRQ %d\n",p->irq);		return -EAGAIN;	}	if(check_region(p->base_addr, 0x20 )) {		printk("dsp: region %#x-%#x in use.\n",p->base_addr,p->base_addr+0x20);#if 0		return -EAGAIN;#endif	}	request_region(p->base_addr, 0x20 ,"dsp");	if (request_irq(p->irq, &dsp_interrupt, 0, "dsp", NULL)) {		printk("Can't get IRQ %d\n",p->irq);		release_region(p->base_addr,0x20);		return -EAGAIN;	}		if(p->dma <= 7) {		if(request_dma(p->dma,"dsp")) {			printk("Can'T get DMA %d\n",p->dma);			free_irq(p->irq,NULL);			release_region(p->base_addr,0x20);			return -EAGAIN;		}		w = (irqtab[p->irq]<<3) | dmatab[p->dma];	}	else {		w = (irqtab[p->irq]<<3);	}	irq2dev_map[p->irq] = p;	outw(w,p->base_addr+PSS_CONFIG);	dsp_init(p,dspcode,sizeof(dspcode));	return 0;}static void dsp_interrupt(int irq, void *dev_id, struct pt_regs * regs){	struct cd *p = (struct cd *)(irq2dev_map[irq]);	int stat;	int fail = 32;	int mask = 0xf000;	if (p == NULL) {		printk(KERN_WARNING "%s: irq %d for unknown device.\n", "dsp" , irq);		return;	}	if(set_bit(0,&p->interrupt))		return;	stat=inw(p->base_addr+PSS_STATUS);    if(stat & 0x3000) {       outw(0x0,p->base_addr+0x4);    }    while( (stat & mask) && fail ) {		fail--;    	if(stat & 0x4000)	    {		  int k = inw(p->base_addr+PSS_DATA);          printk("dsp->%04x ",k);        }        if(stat & 0x8000)        {		  if(p->state && p->wbuf != p->rbuf) {              unsigned short w;              w = p->bufs[p->rbuf][p->rpos]<<8;              w |= p->bufs[p->rbuf][p->rpos+1];	          outw(w,p->base_addr+PSS_DATA);	          p->rpos+=2;			  if(p->rpos >= p->rsize) {				p->rbuf++;				p->rbuf &= 0x1;				p->rpos = 0;				if(p->wpos >= p->wsize) {					p->rsize = p->wsize;					p->wbuf++;					p->wbuf &= 0x1;					p->wpos = 0;					p->wsize = BUFFER_SIZE;				}				wake_up_interruptible(&(p->waitq));			  }		  }		  else {#if 0			mask = 0x7000;#endif		  }        }		stat=inw(p->base_addr+PSS_STATUS);	}	p->interrupt = 0;	return;}static int dsp_reset(struct cd *p){  int i;  outw (0x2000,p->base_addr + PSS_CONTROL);  for (i = 0; i < 32768 ; i++)    inw (p->base_addr + PSS_CONTROL);  outw (0x0000,p->base_addr + PSS_CONTROL);  return 1;}static void dsp_init(struct cd *p,unsigned char *block,int len ){   int i,j;	unsigned char *pnt1 = block;   dsp_reset(p);   outw(*block++,p->base_addr+PSS_DATA);   dsp_reset(p);   for(i=0;;i++)   {     for(j=0;j<100000;j++)       if(inw(p->base_addr+PSS_STATUS) & 0x800)         break;     if(j==100000)     {       printk("dsp TIMEOUT.\n");       break;     }     if(i == len-1)       break;     outw(*block++,p->base_addr+PSS_DATA);   }   printk("downloaded code: %d\n",block-pnt1);#if 0   outw(0x4000,p->base_addr+PSS_CONTROL);#endif   outw(0,p->base_addr+PSS_DATA);}#ifdef MODULEstatic int io = 0x220;static int irq = 10;static int dma = 255;int init_module(void){	int result,i;	/* Copy the parameters from insmod into the device structure. */	devs[0].base_addr = io;	devs[0].irq       = irq;	devs[0].dma       = dma;    for(i=0;i<NUM_DEV;i++)    {        devs[i].state = 0;        devs[i].waitq = NULL;    }	if (register_chrdev(DSP_MAJOR, "dsp", &dsp_fops)) {		printk(KERN_WARNING "dsp: Could not register control devices\n");		return -EIO;	}	result = dsp_probe(&devs[0]);	if(result) {		printk(KERN_ERR "dsp: Can't init board!\n");		unregister_chrdev(DSP_MAJOR,"dsp");		return result;	}	return result;}voidcleanup_module(void){	dsp_reset(&devs[0]);	free_irq(devs[0].irq, NULL);	if(devs[0].dma <= 7)		free_dma(devs[0].dma);	irq2dev_map[devs[0].irq] = 0;	unregister_chrdev(DSP_MAJOR,"dsp");	if(devs[0].base_addr)		release_region(devs[0].base_addr, 0x20);}#endif /* MODULE */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91福利在线免费观看| 国产成人丝袜美腿| 色噜噜狠狠色综合中国| 日本aⅴ免费视频一区二区三区| 国产亚洲制服色| 欧美日韩综合在线| 国产不卡在线视频| 91在线观看成人| 99v久久综合狠狠综合久久| 久久综合色一综合色88| 日本大香伊一区二区三区| 六月丁香婷婷久久| 亚洲欧美偷拍卡通变态| 精品欧美一区二区三区精品久久 | 久久99精品久久久久久久久久久久| 国产精品理论在线观看| 日韩精品专区在线影院重磅| 色噜噜狠狠色综合中国| 成人99免费视频| 精品在线视频一区| 日韩av一区二区三区四区| 亚洲免费毛片网站| 欧美激情综合网| 国产亚洲欧洲一区高清在线观看| 欧美一区二区三区婷婷月色| 欧美情侣在线播放| 欧美亚洲综合色| 在线区一区二视频| 色偷偷成人一区二区三区91| 成人精品免费看| 成人综合婷婷国产精品久久蜜臀| 寂寞少妇一区二区三区| 免费一区二区视频| 蜜桃av一区二区| 久久国产精品99精品国产| 日韩av中文字幕一区二区三区| 亚洲国产精品一区二区久久| 亚洲成人在线观看视频| 亚洲mv大片欧洲mv大片精品| 亚洲午夜一区二区三区| 亚洲成人中文在线| 日韩综合小视频| 日本成人中文字幕| 蜜桃av噜噜一区| 国产露脸91国语对白| 国产麻豆精品视频| 国产91高潮流白浆在线麻豆| 成人av资源网站| 91久久国产综合久久| 在线观看日韩电影| 欧美高清视频在线高清观看mv色露露十八 | 欧美日韩精品一区二区三区蜜桃 | 精品亚洲国产成人av制服丝袜| 青青草97国产精品免费观看无弹窗版| 日本午夜一区二区| 久久99国产精品麻豆| 国产成人亚洲综合a∨婷婷 | 欧美成人精精品一区二区频| 久久婷婷国产综合精品青草| 国产精品每日更新在线播放网址| 亚洲人成网站色在线观看| 一区二区三区日韩欧美| 亚洲成人手机在线| 老色鬼精品视频在线观看播放| 国产一二精品视频| gogogo免费视频观看亚洲一| 色8久久人人97超碰香蕉987| 91精品国产欧美一区二区成人| 欧美videos中文字幕| 国产精品久久久久久久裸模 | 国产大片一区二区| 91久久精品一区二区三| 欧美一级艳片视频免费观看| 久久久精品一品道一区| 亚洲欧美日韩在线| 蜜臀精品久久久久久蜜臀| 国产成人免费在线视频| 在线一区二区视频| 欧美大度的电影原声| 国产精品色哟哟网站| 亚洲国产人成综合网站| 精品制服美女久久| 色先锋资源久久综合| 欧美videos中文字幕| 亚洲欧美日韩系列| 精品一区免费av| 在线看日韩精品电影| 久久免费国产精品| 亚洲成人三级小说| 国产suv精品一区二区6| 91精品国产综合久久香蕉麻豆| 国产日韩一级二级三级| 五月综合激情日本mⅴ| 成人av免费在线观看| 欧美精品久久久久久久久老牛影院| 国产人伦精品一区二区| 亚洲国产精品一区二区www在线| 国产成人综合网站| 在线成人av影院| 亚洲另类在线制服丝袜| 国产乱人伦精品一区二区在线观看| 欧美三级中文字| 中文字幕一区二区三区不卡| 久久99精品国产麻豆婷婷 | 色婷婷久久综合| 国产日韩欧美电影| 免费观看一级特黄欧美大片| 91国产免费观看| 国产精品乱子久久久久| 韩国v欧美v日本v亚洲v| 欧美一区二区三区在线视频| 亚洲男同1069视频| 不卡的av电影| 国产亚洲精品超碰| 精品一区二区成人精品| 欧美一区二区三区的| 艳妇臀荡乳欲伦亚洲一区| 97se亚洲国产综合自在线观| 久久精品在这里| 久久91精品久久久久久秒播| 欧美日韩免费一区二区三区视频| 中文字幕一区二区三区av| 国产成人三级在线观看| 久久精品亚洲精品国产欧美| 精品在线观看免费| 日韩视频一区二区三区| 日韩国产在线一| 欧美精品亚洲二区| 亚洲a一区二区| 欧美日韩在线精品一区二区三区激情| 一区二区三区在线高清| 91久久精品一区二区| 亚洲婷婷综合色高清在线| 99久久777色| 亚洲欧美一区二区三区极速播放| jizz一区二区| 亚洲精选视频在线| 色8久久精品久久久久久蜜| 亚洲在线视频网站| 欧美日韩视频专区在线播放| 亚洲在线观看免费视频| 欧美日韩高清一区二区三区| 日韩综合小视频| 欧美一区二区三区喷汁尤物| 男女男精品视频网| 精品欧美久久久| 国产精品一区二区男女羞羞无遮挡| 国产日韩欧美精品一区| 在线亚洲免费视频| 亚洲最快最全在线视频| 欧美日韩国产免费一区二区| 日韩成人伦理电影在线观看| 欧美大白屁股肥臀xxxxxx| 国产一区999| 亚洲丝袜精品丝袜在线| 欧美伊人久久久久久久久影院| 午夜精品久久久久久不卡8050| 宅男在线国产精品| 国产精品 日产精品 欧美精品| ...av二区三区久久精品| 欧美系列亚洲系列| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品久久久久久久蜜臀| 在线国产电影不卡| 免费观看成人av| 欧美激情综合在线| 欧美日韩一级片在线观看| 久久国产福利国产秒拍| 成人免费在线观看入口| 777欧美精品| 成人毛片老司机大片| 婷婷成人综合网| 国产欧美一区二区精品久导航| 在线观看一区二区视频| 久久99精品网久久| 亚洲伦在线观看| 日韩欧美精品在线| 91麻豆国产在线观看| 美女久久久精品| 亚洲乱码中文字幕综合| 欧美一区二区观看视频| 99久久国产综合色|国产精品| 日韩精品免费专区| 国产精品免费视频网站| 日韩一级免费一区| 99久久综合精品| 激情国产一区二区| 亚洲不卡在线观看| 欧美国产乱子伦| 日韩一区二区三区在线| 99久久精品一区| 国产永久精品大片wwwapp| 一区二区激情小说| 国产日韩亚洲欧美综合| 69久久夜色精品国产69蝌蚪网| 国产一区二区不卡在线| 香蕉久久夜色精品国产使用方法| 国产午夜精品福利| 日韩欧美国产高清| 欧美视频在线播放|