本小节通过实例讲述create_proc_entry函数的用法。在/kernel/drivers/char/x4412目录下新建x4412-proc.c文件,编辑内容如下: - #include<linux/init.h>
- #include<linux/module.h>
- #include<linux/kernel.h>
- #include<linux/proc_fs.h>
- #include <asm/uaccess.h>
-
- static int val = 0x55aa;
- static struct proc_dir_entry *proc_entry;
- ssize_t x4412_proc_read(char *buf, char **start, off_t offset, int count, int *eof, void *data)
- {
- int len = 0;
- len = sprintf(buf, "0x%x\r\n",val);
- *eof = 1;
- return len;
- }
- ssize_t x4412_proc_write(struct file *filp, const char __user *buff,unsigned long len, void *data)
- {
- char k_buf[8];
- char *endp;
- unsigned long new;
- int count = min(8, len);
- int ret;
- if (copy_from_user(k_buf, buff, count))//用户空间->内核空间
- {
- ret = - EFAULT;
- goto err;
- }
- else
- {
- new = simple_strtoul(k_buf, &endp, 16); //字符串转化为整数
- if (endp == k_buf)//无效的输入参数
- {
- ret = - EINVAL;
- goto err;
- }
- val = new;
- return count;
- }
- err:
- return ret;
- }
- static int __init x4412_proc_init(void)
- {
- proc_entry = create_proc_entry("x4412_proc", 0666, NULL); //创建/proc
- if (proc_entry == NULL)
- {
- printk(KERN_INFO "Couldn't create proc entry\n");
- goto err;
- }
- else
- {
- proc_entry->read_proc = x4412_proc_read;
- proc_entry->write_proc = x4412_proc_write;
- }
- return 0;
- err:
- return - ENOMEM;
- }
- static void __exit x4412_proc_exit(void)
- {
- remove_proc_entry("x4412_proc", NULL);
- printk("x4412_proc Exit!\n");
- }
- module_init(x4412_proc_init);
- module_exit(x4412_proc_exit);
- MODULE_LICENSE("GPL");
复制代码 程序的开始定义了一个整形变量val,其值为0x55aa,在初始化函数x4412_proc_init中通过create_proc_entry函数创建设备节点x4412_proc,同时指定该节点的读写函数分别为x4412_proc_read和x4412_proc_write。在读函数中,通过sprintf函数将节点内容显示出来,在写函数中,首先通过copy_from_user函数从用户空间读取写入的数据,再通过函数simple_strtoul将读取的字符串转化为整数,最后保存到全局变量val中。这时,我们再调用读函数时,它的值已经更新过来了。 在kernel/drivers/char/x4412/Makefile下增加如下语句: - obj-$(CONFIG_X4412_PROC_DRIVER) += x4412-proc.o
复制代码 在kernel/drivers/char/x4412/Kconfig下增加如下语句: - config X4412_PROC_DRIVER
- tristate "x4412 proc driver"
- default m
- help
- compile for x4412 proc driver,y for kernel,m for module.
复制代码 编译内核,将会在kernel/drivers/char/x4412目录下生成x4412-proc.ko文件。加载该ko文件后,可以在/proc目录下看到新建的节点x4412_proc,通过cat指令可查看节点的内容,执行界面如下: - root@android:/proc # insmod /mnt/extsd/x4412-proc.ko
- root@android:/proc # ls x4412_proc -la
- -rw-rw-rw- root root 0 1970-01-02 00:25 x4412_proc
- root@android:/proc # cat x4412_proc
- 0x55aa
- root@android:/proc # echo 0x1234 > x4412_proc
- root@android:/proc # cat x4412_proc
- 0x1234
- root@android:/proc #
复制代码 通过insmod命令加载驱动后,通过ls命令可以查看到在/proc目录下生成了节点x4412_proc,而且具有可读可写权限。通过cat指令查看该节点的内容为0x55aa,即程序的开始定义的全局变量val的值。通过echo指令给该节点写入一个新的值后,再通过cat指令查看,发现值已经更新过来了,这和我们驱动的目的不谋而合。
|