linux设备驱动初学(二)
2012-05-04 10:43 至上 阅读(347) 评论(0) 编辑 收藏 举报- #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.o
- all:
- $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
- clean:
- 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*****
这样就说明调用成功了