• 字符设备驱动初识


        在linux下的应用层,一切皆文件每个设备都对应着文件。然而,在内核中,为了标识设备的,会用特意的号码:叫字符号来表示。

        今天将会学到字符设备的驱动,来写一个程序,通过在应用层写程序来操作内核里的设备文件,在应用层,写了一个程序,来打开一个文件:

        

      1 #include <stdio.h>
      2 #include <fcntl.h>
      3 
      4 int main()
      5 {
      6     int fd = open("wangcai", O_RDWR);
      7     if(fd < 0){
      8         perror("open");
      9         return 1;
     10     }
     11 }
     12 
     13 
    ~     

    在内核层,注册了一个设备文件wangcai和方法ops,注册的时候,将会跳转到my_opreations函数去操作;

      

      1 #include <linux/init.h>
      2 #include <linux/thread_info.h>
      3 #include <linux/module.h>
      4 #include <linux/sched.h>
      5 #include <linux/errno.h>
      6 #include <linux/kernel.h>
      7 #include <linux/module.h>
      8 #include <linux/slab.h>
      9 #include <linux/input.h>
     10 #include <linux/init.h>
     11 #include <linux/serio.h>
     12 #include <linux/delay.h>
     13 #include <linux/clk.h>
     14 #include <linux/miscdevice.h>
     15 #include <linux/io.h>
     16 #include <linux/ioport.h>
     17 #include <asm/uaccess.h>
     18 #include <linux/irq.h>
     19 #include <linux/interrupt.h>
     20 #include <linux/cdev.h>
     21 
     22 #include <linux/gpio.h>
     23 #include <mach/gpio.h>
     24 #include <plat/gpio-cfg.h>
     25 
     26 MODULE_LICENSE("GPL");
     27 MODULE_AUTHOR("bunfly");
     28 
     29 int my_open(struct inode *no, struct file *fp);
     30             //设备号    文件
     31 struct file_operations  ops;
     32             //放法
     33 struct cdev wangcai;
     34             //设备
     35 
     36 int test_init()
     37 {
     38     ops.open = my_open;
     39 
     40     //wangcai.ops = &ops;
     41     cdev_init(&wangcai, &ops);
     42     //字符设备号注册
     43     //wangcai.dev = (9, 0);
     44     //wangcai.dev = MKDEV(9, 0);
     45     //insert_link(&wangcai);
     46     cdev_add(&wangcai, MKDEV(9, 0), 1);
     47             //将wancai添加到设备
     48     return 0;
     49 }
     50 
     51 void test_exit()
     52 {
     53     printk("exit
    ");
     54 }
     55 
     56 module_init(test_init);
     57 module_exit(test_exit);
     58 
     59 int my_open(struct inode *no, struct file *fp)
     60 {
     61     printk("zuizui  open
    ");
     62     return 0;
     63 }
     64 
     65 

          在 APP层,当打开文件的时候,将会发现,屏幕打印了一句:zuizui  open!表示;通过了app层的文件操作来读取了一个字符文件。

        课后习题:

          看懂,会写函数:

        

      1 #include <stdio.h>
      2 
      3 struct file_operations;
      4 
      5 struct person{
      6     int age;
      7     char *gf;
      8     struct file_operations *ops;
      9     //将对象的方法写成一个结构题
     10     //方便
     11 };
     12 struct file_operations{
     13     void (*fp)(struct person *);
     14 };
     15 void eat(struct person *this);
     16 int main()
     17 {
     18     struct file_operations fops;
     19     fops.fp = eat;
     20 
     21     struct person tom;
     22     tom.age = 20;
     23     tom.gf = "lucy";
     24     tom.ops = &fops;
     25     //实例化一个对象
     26     tom.ops->fp(&tom);
     27 }
     28 void eat(struct person *this)
     29 {
     30     printf("please %s
    ", this->gf);
     31 }
     32 

          2.写下字符文件的read,write,close文件;

        3.通过io_control()函数来控制灯亮灯灭。

      今天知识大概是这样。有写命令没记下来,等明天在补齐

        

  • 相关阅读:
    一 基础--进制转化
    七牛云上传视频并截取第一帧为图片(js实现)
    FNScanner二维码接口openView自定义扫码Demo
    UIPickerView 模块示例demo
    vPlayer 模块Demo
    doT的高级用法及loadData的使用
    acmPush模块示例demo
    UIChatBox模块示例demo
    分享一款基于aui框架的图文发布界面
    基于js的APP多语言处理
  • 原文地址:https://www.cnblogs.com/hongzhunzhun/p/4524756.html
Copyright © 2020-2023  润新知