linux设备驱动初学(二)

来源:互联网 发布:亚投行工作 知乎 编辑:程序博客网 时间:2024/06/08 09:49

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>#include <linux/types.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/errno.h>#include <asm/segment.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/cdev.h>MODULE_LICENSE("Dual BSD/GPL");unsigned int test_major=0;static char *book_name = "dissecting Linux Device Drviver";static int num = 4000;static int global_major = 0;struct cc_dev_t{ struct cdev cdev;} cc_dev;static int cc_read(struct inode *inode,struct file *file,char *buf,int count){ printk(KERN_INFO "*******cc_read********\n"); return 0;}static int cc_write(struct inode *inode,struct file *file,const char *buf,int count){ printk(KERN_INFO "*******cc_write*******\n"); return 0;}static int cc_open(struct inode *inode,struct file *file){ printk(KERN_INFO "********cc_open*******\n"); return 0;}static void cc_release(struct inode *inode,struct file *file){ printk(KERN_INFO "*******cc_release*****\n");}struct file_operations cc_fops={ .owner = THIS_MODULE, .read = cc_read, .write = cc_write, .open = cc_open, .release = cc_release,};static int __init cc_init(void){ int result,err; dev_t devno = MKDEV(0,0); result = alloc_chrdev_region(&devno,0,1,"cc"); global_major = MAJOR(devno); if(result < 0) { return result; } cdev_init(&cc_dev.cdev,&cc_fops); err = cdev_add(&cc_dev.cdev,devno,1); if(err) printk(KERN_NOTICE "Error"); return 0;}void cc_exit(void){ cdev_del(&cc_dev.cdev); unregister_chrdev_region(MKDEV(global_major,0),1);}module_init(cc_init);module_exit(cc_exit);module_param(num,int,S_IRUGO);module_param(book_name,charp,S_IRUGO);MODULE_AUTHOR("xyl");MODULE_DESCRIPTION("A simple Hello world Moudle");MODULE_ALIAS("a simplest moudle");写完驱动部分 make一下 在/proc/devices下面就会有对应的主设备号了makefile文件 PWD = $(shell pwd) CC=gcc KERNEL_SRC = /usr/src/linux-source-2.6.38/ obj-m := cc.o module-objs := cc.oall: $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modulesclean: rm *.ko rm *.o之后在/dev下面创建设备节点 cat /proc/devices获得主设备号 mknod /dev/cc c major minor在/dev下面就会有对应的设备节点了 如果想要删除的话直接rm掉下面是test.c#include<stdio.h>#include<fcntl.h>int main(){ int myfile; char buffer[100]; int retval; myfile = open("/dev/cc",O_RDWR); if(myfile < 0) printf("Open filed /n"); write(myfile,"hello_world",sizeof("hello_world")); retval = read(myfile,buffer,100); buffer[retval] = 1; printf("redponse:%s/n",buffer); close(myfile);}其中close对应驱动中的release.上面的 write read 内容就随便写啦,因为我驱动中并没有实现。编译一下执行,看内核输出信息dmesg 如下[ 5096.422497] ********cc_open*******[ 5096.422512] *******cc_write*******[ 5096.422519] *******cc_read********[ 5096.422572] *******cc_release*****这样就说明调用成功了

原创粉丝点击