www.pudn.com > driver488.rar > driver488.c
#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define driver488_name "driver488" #define DRIVER488_MAJOR 89 static int write_488(struct file *filp, char *buf, size_t count); static int read_488(struct file *filp, char *buf, size_t count); static int open_488(struct inode *inode,struct file *file); static int close_488(struct inode *inode,struct file *file); static void delay(unsigned int x); static struct file_operations fops_488 = { owner: THIS_MODULE, open: open_488, read: read_488, write: write_488, release: close_488, }; static struct driver488 { unsigned char data[300]; unsigned long addr[300]; unsigned int len; }; static int write_488(struct file *filp, char *buf, size_t count) { unsigned int i=0; unsigned long temp1=0; unsigned long temp2=0; unsigned long *addr[count]; struct driver488 *tmp; tmp = kmalloc(sizeof(struct driver488),GFP_KERNEL); copy_from_user(tmp,buf,count); // for(i=0;i len;i++) // { // printk("<1>**********************%x\n",tmp->addr[i]); // printk("<1>**********************%x\n",tmp->data[i]); // } for(i=0;i len;i++) { addr[i]=(unsigned long)ioremap(tmp->addr[i],4); } for(i=0;i len;i++) { outb(tmp->data[i],addr[i]); delay(5); } for(i=0;i len;i++) { iounmap((void *)addr[i]); } kfree(tmp); return 0; } static int open_488(struct inode *inode,struct file *file) { printk("driver(open_488) *********open_488********\n"); return 0; } static int read_488(struct file *filp, char *buf, size_t count) { unsigned int i=0; unsigned long temp1=0; unsigned long temp2=0; unsigned long *addr[count]; struct driver488 *tmp; tmp = kmalloc(sizeof(struct driver488),GFP_KERNEL); copy_from_user(tmp,buf,count); for(i=0;i len;i++) { addr[i]=(unsigned long)ioremap(tmp->addr[i],4); } for(i=0;i len;i++) { tmp->data[i]=inb(addr[i]); delay(5); } copy_to_user(buf,tmp,count); for(i=0;i len;i++) { iounmap((void *)addr[i]); } kfree(tmp); return 0; } ////////////////////delay 100ns//////////////// void delay(unsigned int x) { unsigned int y; unsigned int z; for(y=0;y AC488 register fail!\n"); return retv; } printk("driver(init_488) init_488 success!\n"); return 0; } static int close_488(struct inode *inode,struct file *file) { printk("<0>driver(close_488) close_488 success!\n"); return 0; } static int cleanup_488(void) { int retv; retv = unregister_chrdev(89,driver488); if(retv < 0) { printk("<1>Unregister AC488 Fail\n"); } else printk("<1>AC488 drive removed!\n"); printk("<1>driver(cleanup_488) cleanup_488 success!\n"); return 0; } __initcall(init_488); #ifdef MODULE module_init(init_488); module_exit(cleanup_488); MODULE_LICENSE("Dual MPL/GPL"); #endif