zoukankan      html  css  js  c++  java
  • 2.字符设备驱动开发

    1.Linux设备驱动特点

      在Linux系统中,一切硬件、软件设备都视为文件。

      设备驱动程序功能:

      - 初始化和释放设备

      - 把数据从内核传递到硬件和从硬件读取数据

      - 读取应用程序传送给设备文件的数据和回送应用程序请求的数据

      - 检测和处理设备出现的错误

    2.Linux系统3大类设备特点

      - 字符设备:按照字符流的方式呗有序访问

      - 块设备:系统中能够随机访问固定大小数据片的设备

      - 网络设备:面向数据包的接收和发送而设计

    3.字符设备驱动程序的编程模型:

      - 杂项设备驱动模型

      - 早期经典字符设备驱动模型

      - Linux2.6版本中新的Linux2.6标准字符设备驱动模型

    4.字符设备相关重要结构

      - struct file_operation

      - struct inode:索引节点,每个存储设备或存储设备的分区被格式化成文件系统后,应该有两部分,一部分是inode,另一部分是block。inode用来存储文件大小,属主,归属的用户组等

      - struct file:表示一个打开文件,设备对应于设备文件。在open时创建,close时被释放

    5.杂项设备驱动模板

      - Linux里面的misc杂项设备是主设备为10的驱动设备注册和使用都比较简单

      - 注册函数:int misc_register(struct miscdevice *misc)

      - 注销函数:int misc_deregister(struct miscdevice *misc)

    6.早期标准字符设备驱动模板

      - 注册函数:int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)

      - 注销函数:void unregister_chrdev(unsigned int major, const char *name)

    7.Linux2.6标准字符设备驱动模型

      - 设备驱动核心结构:struct cdev:用来描述一个字符设备

      - 设备号:用dev_t描述设备号,主设备号高12位,次设备号低20位

      - 相关API函数:

        * int register_chrdev_region(dev_t first, unsigned int count , char *name):静态注册指定设备编号

        * int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name):动态申请设备编号

        * void unregister_chrdev_region(dev_t first, unsigned int count):释放设备号

        * struct cdev *cdev_alloc(void):开辟struct cdev结构空间

        * void cdev_init(struct cdev *cdev, const struct file_operations *fops):清空cdev指向的struct cdev空间,并填充fops

        * int cdev_add(struct cdev *p, dev_t dev, unsigned count):注册字符设备结构到内核

        * void cdev_add(struct cdev *p):从内核中移除设备结构

      - 编写流程

        * 为struct cdev分配空间:struct cdev *my_cdev = cdev_alloc()

        * 初始化struct cdev:void cdev_init(struct cdev *cdev, const struct file_operations *fops)

        * 初始化cdev.owner:cdev.owner = THIS_MODULE

        * 注册到内核:int cdev_add(struct cdev *dev, dev_t num, unsigned count)

        * 在驱动卸载函数中调用cdev_del(),在从系统中移除一个字符设备:void unregister_chrdev_region()释放设备号   

    8.早期字符设备驱动自动生成设备节点文件

      - mdev基本介绍及使用方法

        * 主要的两个应用:初始化对象和动态更新

      - 相关数据结构及函数介绍:

        * struct class:设备类对象,注册一个类结构会在根文件系统的/sys/class目录下生成name的文件夹

        * struct class *class_create(struct module *owner, const char *name):创建一个class结构

        * struct device *device_create(struct class *class, struct device *parent, dev_t  devt, void *drvdata, const char *fmt,...):创建一个设备

        * void device_destroy(struct class *class, dev_t devt):删除一个设备

        * void class_destory(struct class *cls):销毁一个类

  • 相关阅读:
    ScheduledExecutorService 定时任务运行原理(三)
    ThreadPoolExecutor详解(二)
    Future模式详细讲解及实例分析
    @ApiParam @PathVariable @RequestParam三者区别
    协议及首次使用必读
    关于webmagic的依赖问题:ava.lang.NoClassDefFoundError: org/jsoup/helper/StringUtil
    空指针错误悼念与分析
    原创:idea启动项目的是否报错:java.lang.ClassNotFoundException: javax.servlet.ServletContext
    聚合工程中 context:component-scan 与数据源的思考,的使用说明
    关于component-scan中base-package包含通配符的问题探究
  • 原文地址:https://www.cnblogs.com/Mr-ox/p/6407058.html
Copyright © 2011-2022 走看看