📄 zjdev.c
字号:
#ifndef __KERNEL__#define __KERNEL__ #endif#ifndef MODULE#define MODULE #endif#include </home/zhangjian/ostask/linux-2.6.18/include/asm/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/kernel.h>#include <linux/sched.h>#include <asm/uaccess.h>#include <asm/io.h>#define CHAR_MAJOR_NUM 300 #define OPENSPK 1#define CLOSESPK 2#define DEVICE_NAME "zjdev"//static int test_major=0;static int device_open=0;//static char message[]="This is from device driver!";static int dev_open(struct inode *, struct file *);static int dev_release(struct inode *, struct file *);static ssize_t dev_read(struct inode *, struct file *, char *,unsigned long );static ssize_t dev_write(struct file *, const char *, size_t, loff_t *);//static int dev_ioctl(struct inode *,struct file *,unsigned int ,unsigned int ); char *message_ptr;struct file_operations dev_fops ={ open: dev_open, release: dev_release, read: dev_read, write: dev_write,}; int dev_init(void){ int result; result=register_chrdev(CHAR_MAJOR_NUM, "zjdev", &dev_fops); if (result) printk("mydev register failure!"); else printk("mydev register success!"); return result;} void dev_exit(void){ unregister_chrdev(CHAR_MAJOR_NUM, "zjdev");}/*static int dev_open(struct inode *inode, struct file *file){ // MOD_INC_USE_COUNT; printk("This module is in open!\n"); return 0;}static int dev_release(struct inode *node, struct file *filp){ // MOD_DEC_USE_COUNT; printk("This module is in released!\n"); return 0;}*/static int dev_open(struct inode *inode, struct file *file){ printk("\ndevice_open(%p,%p)\n",inode,file); if(device_open) return -EBUSY; device_open++; try_module_get(THIS_MODULE); return 0;}static ssize_t dev_release(struct inode *node, struct file *filp){ printk("\ndevice_release(%p,%p)\n",node,filp); device_open--; module_put(THIS_MODULE); return 0; }/*static ssize_t dev_read(struct file *f, char *buf, size_t len, loff_t *off){ int i; for(i=len;i>0;i--) { __put_user(5,buf); buf++; } return len;}static ssize_t dev_write(struct file *f, const char *buf, size_t len, loff_t *off){ if (copy_from_user(&test_major, buf, sizeof(int))) return 0; return sizeof(int);}*//*static ssize_t dev_read(struct file *f, char *buf, size_t len, loff_t *off){ int bytes_read=0; #ifdef DEBUG printk("\nmy_read is called.User buffer is %p,size is %d\n",buf,len); #endif if(verify_area(VERIFY_WRITE,buf,len)==-EFAULT) return -EFAULT; message_ptr=message; while(len&&*message_ptr) { if(put_user(*(message_ptr++),buf++)) return -EINVAL; len--; bytes_read++; } return bytes_read;}*/static static ssize_t dev_read(struct file *f, char *buf, size_t count, loff_t *off)) { /* identify your data (device-specific code) */ int i; for(i=count;i>0;i--) __put_user(5,buf++); return count;}static ssize_t dev_write(struct file *f, const char *buf,size_t len, loff_t *off){ int i; unsigned char uc; #ifdef DEBUG printk("\ndev_write is called.User buffer is %p,size is %d\n",buf,len); #endif // if(verify_area(VERIFY_WRITE,buf,len)==-EFAULT) // return -EFAULT; printk("\nData below is from user programme:\n"); for(i=0;i<len;i++) if(!get_user(uc,buf)) printk("%02x",uc); return len;}/*static int dev_ioctl(struct inode *inode,struct file *f,unsigned int arg1,unsigned int arg2){ #ifdef DEBUG printk("\nmy_ioctl is called.Paraeter is %p,size is %d\n",arg1); #endif switch(arg1) { case OPENSPK: printk("\nNow,open PC's speaker.\n"); outb(inb(0x61)|3,0x61); break; case CLOSESPK: printk("\nNow ,close PC's speaker."); outb(inb(0x61)&0xfc,0x61); break; }}*/ module_init(dev_init);module_exit(dev_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -