| 
     本小节通过实例讲述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指令查看,发现值已经更新过来了,这和我们驱动的目的不谋而合。 
 |