4.1 字符设备驱动之 字符设备的注册(早期办法)

 

5.2.6.字符设备驱动工作原理1
5.2.6.1、系统整体工作原理
(1)应用层->API->设备驱动->硬件
(2)API:open、read、write、close等
(3)驱动源码中提供真正的open、read、write、close等函数实体
5.2.6.2、file_operations结构体
(1)元素主要是函数指针,用来挂接实体函数地址
(2)每个设备驱动都需要一个该结构体类型的变量
(3)设备驱动向内核注册时提供该结构体类型的变量
5.2.6.3、注册字符设备驱动
(1)为何要注册驱动
(2)谁去负责注册
(3)向谁注册
(4)注册函数从哪里来
(5)注册前怎样?注册后怎样?注册产生什么结果?

inline:内联,内核为了运行快速,执行相应函数需要跳转、跳回需要时间,编译阶段调的函数机器码被复制一份存放所调的位置,按顺序执行;缺点是消耗内存空间/空间换取时间

第一种方法:字符设备的注册(早期办法)

demo.c

 1 /* head file */
 2 #include <linux/init.h>
 3 #include <linux/module.h>
 4 #include <linux/fs.h>
 5 
 6 #define DEVNAME "chardev"
 7 
 8 static unsigned int major = 60;
 9 
10 static int mill_open (struct inode *inodp, struct file *filp)
11 {
12     printk("---- open : (%d, %d) ------\n", imajor(inodp), iminor(inodp));
13 
14     return 0;
15 }
16 
17 static ssize_t 
18 mill_read (struct file *filp, char __user *buf, size_t cnt, loff_t *fpos)
19 {
20     printk("[kernel]: read...\n");
21 
22     return 380;
23 }
24 
25 static ssize_t 
26 mill_write (struct file *filp, const char __user *buf, size_t cnt, loff_t *fpos)
27 {
28     printk("[kernel]: write...\n");
29 
30     return 380;
31 }
32 
33 static int mill_release (struct inode *inodp, struct file *filp)
34 {
35     printk("---- close : (%d, %d) ------\n", imajor(inodp), iminor(inodp));
36 
37     return 0;
38 }
39 
40 static struct file_operations fops = {
41     .owner         = THIS_MODULE,    
42     .open          = mill_open,
43     .read          = mill_read,
44     .write        = mill_write,
45     .release    = mill_release,
46 };
47 
48 
49 /* driver module entry */
50 static int __init demo_init(void)
51 {
52     printk("hello, world!\n");
53     
54     return register_chrdev(major, DEVNAME, &fops);
55 }
56 
57 module_init(demo_init);
58 
59 /* driver module exit */
60 static void __exit demo_exit(void)
61 {
62     printk("goodbye, world!\n");
63 
64     unregister_chrdev(major, DEVNAME);
65 }
66 module_exit(demo_exit);
67 
68 /* driver module description */
69 MODULE_LICENSE("GPL");
70 
71 MODULE_AUTHOR("millet9527");
72 MODULE_VERSION("millet plus 18");
73 MODULE_DESCRIPTION("example for driver module arch");

makefile

1 obj-m    := demo.o
2 
3 KERNEL    := /linux-3.5
4 
5 all:
6     make -C $(KERNEL) M=`pwd`
7 clean:
8     make -C $(KERNEL) M=`pwd` clean
9     

=====================================================================

查看当前内核已经注册的设备的设备号/设备名字:
cat /proc/device

 

利用命令创建设备文件:

mknod name c/b major minor

(注册好了字符设备,若没有字符设备文件,需要手动创建设备文件)

 

posted @ 2017-03-15 22:23  bkycrmn  阅读(330)  评论(0)    收藏  举报