⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isa.c

📁 一个很简洁的linux下isa总线驱动
💻 C
字号:
#include <linux/config.h>#include <linux/module.h>#include <linux/version.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/ioport.h>#include <linux/fcntl.h>#include <asm/io.h>#include <asm/uaccess.h>#include <asm/system.h>#include <linux/init.h>#include <linux/fs.h>#include "isadev.h"static unsigned long isa_is_open;static int expect_close;static int rd_offset,wr_offset;static int memBase=0x00000;static int range = 0x10000;static ssize_t isa_write(struct file *file, const char *buf, size_t count, loff_t *ppos){	size_t written=0;	unsigned long p=memBase;	p+=wr_offset;#ifdef __DEBUG__	printk("base addr: 0x%x + 0x%x\n",memBase,wr_offset);#endif	if (copy_from_user(__va(p),buf,count))		return -EFAULT;	written+=count;	p+=count;#ifdef __DEBUG__	int i;	printk("Kernel write:\n");	for (i=0;i<count;i++)		printk("%c ",buf[i]);		printk("\n");#endif		return written;}static ssize_t isa_read(struct file *file, char *buf, size_t count, loff_t *ppos){#ifdef __DEBUG__	int i;#endif	size_t read=0;	unsigned long p=memBase;	p+=rd_offset;#ifdef __DEBUG__	printk("base addr: 0x%x + 0x%x\n",memBase,rd_offset);#endif	if (copy_to_user(buf,__va(p),count))		return -EFAULT;	read+=count;	p+=count;#ifdef __DEBUG__	printk("Kernel read:\n");	for (i=0;i<count;i++)		printk("%x ",buf[i]&0x0ff);		printk("\n");#endif	return read;}static int isa_ioctl(struct inode *inode, struct file *file, unsigned int cmd,	unsigned long arg){#ifdef __DEBUG__	printk(KERN_INFO"ioctl exec\n");#endif	switch (cmd)	{		default:			return -ENODEV;		case RD_OFFSET:			get_user(rd_offset, (int *)arg);		#ifdef __DEBUG__			printk("rd_offset = %d\n",rd_offset);		#endif			break;		case WR_OFFSET:			get_user(wr_offset, (int *)arg);		#ifdef __DEBUG__			printk("wr_offset = %d\n",wr_offset);		#endif			break;	}	return 0;}static int isa_open(struct inode *inode, struct file *file){	if (MAJOR(inode->i_rdev) != isa_major)	{		printk(KERN_ERR"Can not open device\n");		return -ENODEV;	}#ifdef __DEBUG__	printk("Device Major: %d\n",MAJOR(inode->i_rdev));#endif//	MOD_INC_USE_COUNT;	return 0;}static int isa_release(struct inode *inode, struct file *file){//	MOD_DEC_USE_COUNT;	return 0;}static struct file_operations isa_fops = {	.owner=		THIS_MODULE,	.llseek=	NULL,	.read=		isa_read,	.write=		isa_write,	.ioctl=		isa_ioctl,	.open=		isa_open,	.release=	isa_release,};static void __exit isa_exit(void){	unregister_chrdev(isa_major,NAME);	release_mem_region(memBase,range);}static int __init isa_init(void){	int ret=0;	if (ret=register_chrdev(isa_major,NAME,&isa_fops)<0)	{		printk(KERN_ERR"Register"NAME"Dev Error ");		return  ret;	}	if (check_mem_region(0xd0000,range))	{		printk(KERN_ERR"Check_Region ERROR\n");		unregister_chrdev(isa_major,NAME);		return -1;	}	if (!request_mem_region(0xd0000, range, "isa"))	{		printk(KERN_ERR"Request Region ERROR\n");		unregister_chrdev(isa_major,NAME);		ret = -1;	}	return ret;}module_init(isa_init);module_exit(isa_exit);MODULE_AUTHOR("Senbo");MODULE_LICENSE("GPL");EXPORT_NO_SYMBOLS;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -