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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? cpci50401a.c

?? 一個(gè)基于PCI卡數(shù)據(jù)采集卡的驅(qū)動(dòng)程序,分別有內(nèi)存影射和IO 影射的方式
?? C
字號(hào):
#ifndef __KERNEL__#define __KERNEL__#endif#ifndef __SIM_INT_MODE#define __SIM_INT_MODE#endif#ifndef MODULE#define MODULE#endif#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/proc_fs.h>#include <linux/fcntl.h>#include <linux/pci.h>#include <linux/timer.h>#include <linux/poll.h>#include <asm/io.h>#include <linux/delay.h>#include <linux/time.h>#include "cpci50401.h"MODULE_LICENSE("GPL v2");MODULE_AUTHOR("USTB.");MODULE_DESCRIPTION("cpci50401b Dev Driver");#ifndef CONFIG_PCI# error "This driver needs PCI support to be available"#endifEXPORT_NO_SYMBOLS;int cpci50401b_major = 247;static int drv_file_opened = 0;static unsigned long cfg_base_address, mem_base0_address,mem_base1_address;int cpci50401b_irq;struct CPCI50401_IO_MEM cpci50401b_io;static struct pci_dev *cpci50401b_dev;struct fasync_struct *async_queue = NULL;static int intr_enb = 0;#define TIME_FILTER	0static unsigned long newtime = 0;static unsigned long oldtime = 0;static unsigned long delta = 0; static void enable_pci_int(void){	int val;	val = readw((unsigned)cpci50401b_io.int_enb);	rmb();	val = (val | Lint1_ENB | Lint1_HIGH | Lint1_EDGE | Lint2_ENB | Lint2_HIGH | Lint2_EDGE | Lint1_CLRINT | Lint2_CLRINT | PCI_ENB);	writew(val, (unsigned)cpci50401b_io.int_enb);	wmb();}static void disable_pci_int(void){	int val;	val = readw((unsigned)cpci50401b_io.int_enb);	rmb();	val = val & ~PCI_ENB;	writew(val, (unsigned)cpci50401b_io.int_enb);	wmb();}#ifdef __SIM_INT_MODE#define VECQLEN		1024static struct vectorqueue {	int vec[VECQLEN];	int front;	int rear;} vecq;static int add_vecq(int vec){	int tmprear = (vecq.rear + 1) % VECQLEN;	if(tmprear == vecq.front)		return -1;	vecq.vec[vecq.rear] = vec;	vecq.rear = (vecq.rear + 1) % VECQLEN;	/*if(vecq.rear - vecq.front > 10)		printk("<1>cpci50401b: geu interrupt overspeed!\r\n");*/	return 0;}static int del_vecq(unsigned long *vec){	*vec = vecq.vec[vecq.front];	vecq.front = (vecq.front + 1) % VECQLEN;	return 0;}static int is_consuming = 1;static int co = 0;void cpci50401b_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs){	int get;	int ret=0;	get = readw((unsigned)cpci50401b_io.int_enb);	rmb();	if(get & Lint1_ACT) 	// local 1	{	//	printk("<1>Get Local1 Int : 0x%x\n",get);		int i,j;		for(i = 0;i<500;i++)			for(j=0;j<100;j++);		/* clear local1 intr */		ret = add_vecq(0130);//		printk("<1>cpci50401b: vector = 130\n");				if(ret < 0){	/* intr queue full */			is_consuming = 0;			vecq.front = vecq.rear = 0;			/* interrupt disable *///			disable_pci_int();//			printk("<1>cpci50401b: vector queue length is too short!\n");		}		get |= 0x400;		writew(get, (unsigned)cpci50401b_io.int_enb);		wmb();	}	if(get & Lint2_ACT)	// local 2	{//		printk("<1>Get Local2 Int : 0x%x\n",get);#if TIME_FILTER	struct timeval tv;	static int sum = 0;		do_gettimeofday(&tv);	newtime = tv.tv_sec * 1000 * 1000 + tv.tv_usec;	if(oldtime != 0){		delta = newtime - oldtime;		if((delta > 15000) && (delta < 18000)){			if (async_queue)				kill_fasync(&async_queue, SIGIO, POLL_IN);		}else{			sum += delta;			if((sum > 15000) && (sum < 18000)){				if (async_queue)					kill_fasync(&async_queue, SIGIO, POLL_IN);				sum = 0;			}		}	}	oldtime = newtime;#else	if (async_queue)		kill_fasync(&async_queue, SIGIO, POLL_IN);#endif		/* clear local2 intr */		get |= 0x800;		writew(get, (unsigned)cpci50401b_io.int_enb);		wmb();	}}#endifstruct pci_dev *cpci50401_find_first_dev(unsigned int vendor,unsigned int device,unsigned int devfn){	struct pci_dev *dev;	pci_for_each_dev(dev) {		if((dev->vendor == vendor)		   &&(dev->device == device)		   &&(dev->devfn == DRIVER_NO_A))			return dev;	}	return NULL;}int find_cpci50401b_device(unsigned int vendor, unsigned int device){	cpci50401b_dev = NULL;	if (!pci_present())		return -ENODEV;	cpci50401b_dev = pci_find_device(vendor,device,cpci50401b_dev);	if (!cpci50401b_dev)		return -ENODEV;//	printk("devfn:0x%x\n",cpci50401b_dev->devfn);	pci_enable_device(cpci50401b_dev);	return 0;}int allocate_cpci50401b_resource(void){	int result;	unsigned char irq_no;	cfg_base_address = pci_resource_start(cpci50401b_dev, CONFIG_BASE); 	mem_base0_address = pci_resource_start(cpci50401b_dev, MEM_BASE0); 	mem_base1_address = pci_resource_start(cpci50401b_dev, MEM_BASE1); //	printk("<1> cpci50401b: config base address: %x\n", cfg_base_address);//	printk("<1> cpci50401b: io base0 address: %x\n", mem_base0_address);//	printk("<1> cpci50401b: io base1 address: %x\n", mem_base1_address);	/* find the IRQ number assigned by the kernel */	result = pci_read_config_byte(cpci50401b_dev, PCI_INTERRUPT_LINE, &irq_no);//	printk("<1> cpci50401b: IRQ no: %d\n", irq_no);	if (result)	{		printk("<1>cpci50401b: read pci interrupt number error!\n");		return -EBUSY;	}	cpci50401b_irq = irq_no;	// Map I/O Address Space	if (check_mem_region(mem_base0_address, MEM_LEN))	{		printk("<1>cpci50401b: io0 space already in use!\n");		return -EBUSY;	}	request_mem_region(mem_base0_address, MEM_LEN, CPCI50401_B);		cpci50401b_io.baseaddr0 = (void *)ioremap(mem_base0_address,MEM_LEN);	if (check_mem_region(mem_base1_address, MEM_LEN))	{		printk("<1>cpci50401b: io1 space already in use!\n");		release_mem_region(mem_base0_address, MEM_LEN);		return -EBUSY;	}	request_mem_region(mem_base1_address, MEM_LEN, CPCI50401_B);		cpci50401b_io.baseaddr1 = (void *)ioremap(mem_base1_address,MEM_LEN);	// Map Configuration Address Space	if (check_mem_region(cfg_base_address, CONFIG_LEN))	{		printk("<1>cpci50401b: configuration space already in use!\n");		release_mem_region(mem_base0_address, MEM_LEN);		release_mem_region(mem_base1_address, MEM_LEN);		return -EBUSY;	}	request_mem_region(cfg_base_address, CONFIG_LEN, CPCI50401_B);	cpci50401b_io.int_enb = (void *)(ioremap(cfg_base_address,CONFIG_LEN) + 0x4c);#ifdef __SIM_INT_MODE	/* interrupt enable: enable PCI intr & local intr1 & local intr2 */	int val;	enable_pci_int();	vecq.front = vecq.rear = 0;	result = request_irq(cpci50401b_irq, cpci50401b_interrupt_handler, \			     SA_SHIRQ, CPCI50401_B, cpci50401b_dev);	if(result)	{		printk("<1> cpci50401b: cannot install interrupt handler!\n");		release_mem_region(mem_base0_address, MEM_LEN);		release_mem_region(mem_base1_address, MEM_LEN);		release_mem_region(cfg_base_address, CONFIG_LEN);		return -EBUSY;	}	#else	/* interrupt enable: enable local intr1 & local intr2 *///	writel(0xf1b, cpci50401b_io.int_enb);//	wmb();#endif	return 0;}int release_cpci50401b_resource(void){	release_mem_region(mem_base0_address, MEM_LEN);	release_mem_region(mem_base1_address, MEM_LEN);	/* interrupt disable */	 disable_pci_int();	release_mem_region(cfg_base_address, CONFIG_LEN);#ifdef __SIM_INT_MODE	free_irq(cpci50401b_irq, NULL);#endif	return 0;}int cpci50401b_open(struct inode *inode, struct file *fp){	int ret;	if (drv_file_opened != 0)	{		printk("<1>cpci50401b: Driver file can only be opened for 1 program!\n");		return -ENODEV;	}	drv_file_opened = 1;//	printk("<1>cpci50401b: Driver file opened!\n");	ret = find_cpci50401b_device(VENDOR_ID, DEVICE_ID);	if (ret < 0)	{		printk("<1>cpci50401b: find device failure!\n");		return -ENODEV;	}	ret = allocate_cpci50401b_resource();	if (ret < 0)	{		printk("<1>cpci50401b: allocate resource failure!\n");		return -ENODEV;	}	return 0;}int cpci50401b_release(struct inode *inode, struct file *fp){//	printk("<1>cpci50401b: release called!\n");	drv_file_opened = 0;	release_cpci50401b_resource();	return 0;}int cpci50401b_ioctl(struct inode *inode, struct file *fp, unsigned int cmd, unsigned long arg){	 	long *ptr;	int ret;	long data;	unsigned long vector;	ret = 0;	data = 0;	switch (cmd)	{	case CPCI50401_IOC_READ_BASE0:		data = readw((unsigned)cpci50401b_io.baseaddr0) & 0xffff;		rmb();		printk("Debug : Read from A/D base0 = %d\n",data);			put_user(data,(long *)arg);		break;	case CPCI50401_IOC_READ_BASE1:		data = readw((unsigned)cpci50401b_io.baseaddr1) & 0xffff;		rmb();		printk("Debug : Read from A/D base1 = %d\n",data);			put_user(data,(long *)arg);		break;	case CPCI50401_IOC_WRITE_BASE0:		ptr = (long *)arg;		ret = get_user(data,ptr);		if(!ret)		{			writew(data&0x1f,(unsigned)cpci50401b_io.baseaddr0);			wmb();			printk("Debug : Write to A/D int = %d\n",data);			}		else			printk("Debug : arg err\n");		break;	case CPCI50401_IOC_WRITE_BASE1:		ptr = (long *)arg;		ret = get_user(data,ptr);		if(!ret)		{			writew(data&0xfffc,(unsigned)cpci50401b_io.baseaddr1);			wmb();		printk("Debug : Write to A/D Channel No = %d\n",data);			}		else			printk("Debug : arg err\n");		break;	case CPCI50401_IOC_RESET:	//	printk("AD2 RESET\n");	//	readw((unsigned)cpci50401b_io.baseaddr0);	//	rmb();		writew(0,(unsigned)cpci50401b_io.baseaddr0);		wmb();		writew(0, (unsigned)cpci50401b_io.baseaddr1);		wmb();		// Clear Int Queue		vecq.front = vecq.rear = 0;		break;	case CPCI50401_IOC_SYS_GET_INT:#ifdef __SIM_INT_MODE		if(0 == is_consuming){			is_consuming = 1;			vecq.front = vecq.rear = 0;		}		if(vecq.front != vecq.rear){			if((vecq.vec[vecq.front] == 0130)) // A/D				put_user(6, (long *)arg);         // BR6		}		else if(vecq.front == vecq.rear)			put_user(0, (long *)arg);#else		put_user(0, (long *)arg);	//intr not actived#endif		break;	case CPCI50401_IOC_SYS_GET_VEC:#ifdef __SIM_INT_MODE		del_vecq(&vector);		put_user(vector, (long *)arg);#endif		break;        case CPCI50401_IOC_READ_STATUS:                data = readw((unsigned)(cpci50401b_io.baseaddr1+4)) & 0xffff;                rmb();                printk("Debug : Read from A/D base1+4= %d\n",data);                put_user(data,(long *)arg);                break;        case CPCI50401_IOC_WRITE_STATUS:                ptr = (long *)arg;                ret = get_user(data,ptr);                if(!ret)                {                       writew(data,(unsigned)(cpci50401b_io.baseaddr1+4));                       wmb();                        printk("Debug : Write to A/D int base1+4= %d\n",data);                }                else                        printk("Debug : arg err\n");                break;/*	case CPCI50401_IOC_DISINTR:#ifdef __SIM_INT_MODE		is_consuming = 0;		vecq.front = vecq.rear = 0;		// interrupt disable 		writel(0, cpci50401b_io.int_enb);		wmb();#else		intr_enb = 0;#endif		break;	case CPCI50401_IOC_ENBINTR:#ifdef __SIM_INT_MODE	// interrupt enable: enable PCI intr & local intr1 & local intr2 		writel(0xf5b, cpci50401b_io.int_enb);		vecq.front = vecq.rear = 0;		wmb();#else		intr_enb = 1;#endif		break;	case CPCI50401_IOC_SYS1_INTRACT:		data = readl(cpci50401b_io.int_enb);		if( (data & 0x4) && intr_enb )			put_user(1, (long *)arg);	//intr actived		else 				put_user(0, (long *)arg);	//intr not actived		break;	case CPCI50401_IOC_SYS2_INTRACT:		data = readl(cpci50401b_io.int_enb);		if( (data & 0x20) && intr_enb )			put_user(1,(long *)arg);	//intr actived		else				put_user(0, (long *)arg);	//intr not actived			break;	case CPCI50401_IO_SYS1_SETGNT:		data = readl(cpci50401b_io.int_enb);		writel(data | 0x400, cpci50401b_io.int_enb);		break;	case CPCI50401_IO_SYS2_SETGNT:		data = readl(cpci50401b_io.int_enb);		writel(data | 0x800, cpci50401b_io.int_enb);		break;	case CPCI50401_IOC_STATUS:		data = readb(cpci50401b_io.status);		rmb();		put_user(data, (long *)arg);		break;	case CPCI50401_IOC_INTSTA:		data = readb(cpci50401b_io.intsta);		rmb();		put_user(data, (long *)arg);		break;	case CPCI50401_IOC_COMMAND:		writel(arg, cpci50401b_io.command);		wmb();		writel(0, cpci50401b_io.cmd_apply);		wmb();		break;*/	default:		ret = -ENOTTY;		break;	}	return ret;}int cpci50401b_fasync(int fd, struct file *filp, int mode){	return fasync_helper(fd, filp, mode, &async_queue);	return 0;}struct file_operations cpci50401b_fops = {	open:		cpci50401b_open,	release:	cpci50401b_release,	ioctl:		cpci50401b_ioctl,	fasync:		cpci50401b_fasync,};int init_module(void){	int result;	SET_MODULE_OWNER(&cpci50401b_fops);	result = register_chrdev(cpci50401b_major, CPCI50401_B, &cpci50401b_fops);	if (result < 0)	{		printk(KERN_WARNING "cpci50401b_drv: can't get major no %d\n", cpci50401b_major);		return result;	}	if (cpci50401b_major == 0)		cpci50401b_major = result;	printk("<1>major number = %d\n", cpci50401b_major);	return 0; /* success */}void cleanup_module(void){	unregister_chrdev(cpci50401b_major, CPCI50401_B);}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久人人做人人爽| 亚洲一二三四区| www国产成人| 日韩视频一区二区三区 | 欧美一级高清片| 欧美日韩国产一级二级| 欧美日韩一区二区三区视频| 欧美亚日韩国产aⅴ精品中极品| 91蜜桃网址入口| 欧美主播一区二区三区| 欧美影院一区二区| 欧美日韩在线精品一区二区三区激情| 91网站在线播放| 色欲综合视频天天天| 91国内精品野花午夜精品 | 欧美三级中文字幕| 欧美美女直播网站| 日韩你懂的在线观看| 日韩免费性生活视频播放| 日韩欧美国产一二三区| 精品播放一区二区| 国产欧美日韩在线| 亚洲欧美色综合| 香蕉久久一区二区不卡无毒影院| 午夜精品影院在线观看| 蜜桃精品视频在线| 国产成人在线电影| 一本色道亚洲精品aⅴ| 欧美日韩国产美| 精品久久久久久久一区二区蜜臀| 国产丝袜在线精品| 亚洲精品国产高清久久伦理二区| 五月激情综合婷婷| 国产乱理伦片在线观看夜一区 | 日韩一区二区中文字幕| 亚洲精品在线观看视频| 久久久久97国产精华液好用吗| 国产精品大尺度| 婷婷综合五月天| 国产精品中文字幕欧美| 在线精品国精品国产尤物884a| 欧美一级日韩免费不卡| 午夜精品久久一牛影视| 国产精品一卡二卡在线观看| 色呦呦网站一区| 精品免费国产一区二区三区四区| 国产精品久久久久婷婷| 丝袜美腿亚洲综合| 丁香婷婷综合色啪| 欧美精品久久久久久久多人混战 | 天天综合网天天综合色| 国产一区二区美女诱惑| 日本道精品一区二区三区| 欧美一区二区三区在线观看视频 | 日韩黄色免费电影| 粉嫩13p一区二区三区| 欧美乱妇15p| 中文字幕av在线一区二区三区| 亚洲18影院在线观看| 成人免费看视频| 91精品国模一区二区三区| 中文字幕亚洲精品在线观看| 美国欧美日韩国产在线播放| 在线免费观看一区| 久久久久久久久久久99999| 亚洲3atv精品一区二区三区| 成人动漫在线一区| 欧美videofree性高清杂交| 国产河南妇女毛片精品久久久 | 亚洲在线视频免费观看| 国产白丝网站精品污在线入口| 777久久久精品| 亚洲欧美欧美一区二区三区| 国产精品99久久久久久有的能看| 欧美日本国产一区| 亚洲精品一二三四区| 国产精品1024| 日韩一区二区在线免费观看| 性做久久久久久免费观看欧美| av在线一区二区三区| 久久久精品中文字幕麻豆发布| 五月激情丁香一区二区三区| 91黄色免费版| 综合网在线视频| 国产凹凸在线观看一区二区| 2017欧美狠狠色| 久久精品99国产精品日本| 欧美日韩视频不卡| 亚洲一区二区在线观看视频 | 久久久久久亚洲综合| 日本欧美加勒比视频| 欧美日韩国产成人在线免费| 曰韩精品一区二区| 色域天天综合网| 亚洲日本韩国一区| av在线不卡电影| 国产精品美女久久久久久久久久久| 激情综合一区二区三区| 日韩美女主播在线视频一区二区三区| 午夜一区二区三区视频| 欧美日韩高清一区二区三区| 亚洲成人av福利| 在线成人av网站| 日韩福利电影在线观看| 69堂成人精品免费视频| 视频在线在亚洲| 一区二区三区电影在线播| av中文字幕一区| 亚洲精品乱码久久久久久日本蜜臀| 不卡在线视频中文字幕| 亚洲色图欧洲色图婷婷| 色呦呦国产精品| 亚洲国产日产av| 67194成人在线观看| 蜜桃av一区二区三区电影| 精品福利一二区| 成人激情校园春色| 亚洲色图20p| 欧美日韩一区三区四区| 蜜桃精品视频在线| 久久夜色精品国产欧美乱极品| 国产精品77777| 中文字幕中文乱码欧美一区二区 | 欧美精品久久99久久在免费线| 日韩不卡一二三区| 2021中文字幕一区亚洲| 成人午夜av影视| 亚洲曰韩产成在线| 日韩三级电影网址| 国产精品18久久久久久vr| 专区另类欧美日韩| 欧美三日本三级三级在线播放| 免费高清成人在线| 国产亚洲欧洲997久久综合 | 成人av综合在线| 一区二区三区精品| 日韩一区二区在线观看视频| 激情伊人五月天久久综合| 国产精品免费视频观看| 日本丶国产丶欧美色综合| 日本欧美一区二区在线观看| 久久精品日产第一区二区三区高清版 | 成人黄色免费短视频| 亚洲综合精品久久| 精品国产一区二区精华| 成人av在线电影| 日日欢夜夜爽一区| 国产欧美日韩卡一| 欧美日韩午夜精品| 国产一区二区三区免费播放| 亚洲免费三区一区二区| 日韩一区二区精品| 成人午夜电影久久影院| 亚洲成人免费av| 国产欧美综合在线观看第十页| 91成人免费电影| 国产河南妇女毛片精品久久久 | 激情深爱一区二区| 一区二区三区日韩精品视频| 亚洲精品在线电影| 一本大道久久a久久综合婷婷| 久久99精品一区二区三区| 亚洲三级在线免费观看| 久久综合色之久久综合| 欧美性一二三区| 成人精品免费看| 麻豆精品一二三| 亚洲一区成人在线| 国产精品久久久久影院亚瑟 | 国产精品美女久久久久av爽李琼| 欧美精品tushy高清| 97久久精品人人做人人爽| 麻豆成人av在线| 亚洲6080在线| 亚洲精品老司机| 亚洲国产精品成人综合| 欧美成人一区二区三区在线观看| 色狠狠色狠狠综合| 成a人片国产精品| 国产精品911| 久久99精品久久只有精品| 午夜精品久久久久久久| 亚洲免费大片在线观看| 欧美高清在线精品一区| 精品国产污网站| 欧美一区二区在线免费观看| 欧美在线免费视屏| 一本一道久久a久久精品| 国产·精品毛片| 国产美女av一区二区三区| 琪琪一区二区三区| 亚洲成av人影院| 亚洲国产精品久久久久婷婷884| 亚洲欧洲一区二区在线播放| 久久精品免费在线观看| 精品国产91久久久久久久妲己 | 777亚洲妇女| 欧美日韩一区二区三区视频| 欧美性生交片4| 欧日韩精品视频|