zoukankan      html  css  js  c++  java
  • 【原创】--【字符设备】--全流程

    一、概述

    1、字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。
    2、块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。

      每一个字符设备或块设备都在/dev目录下对应一个设备文件。linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备。

    二、设备使用流程:
    1、生成设备号,dev_t
      一个字符设备或块设备都有一个主设备号和一个次设备号,二者一起为设备号。

      主设备号用来标识与设备文件相连的驱动程序,用来反映设备类型。次设备号被驱动程序用来辨别操作的是哪个设备,用来区分同类型的设备。


      linux内核中,设备号用dev_t来描述,2.6.28中定义如下:
      typedef u_long dev_t;
      在32位机中是4个字节,高12位表示主设备号,低12位表示次设备号。

      可以使用下列宏从dev_t中获得主次设备号:                   
      MAJOR(dev_t dev);                              
      MINOR(dev_t dev);

      也可以使用下列宏通过主次设备号生成dev_t:

      dev_t = MKDEV(int major,int minor);

    2、向内核申请设备号(两种方法):

    (1)静态申请:
    int register_chrdev_region(dev_t from, unsigned count, const char *name);

    (2)动态分配:

    int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);

    (3)注销设备号:

    void unregister_chrdev_region(dev_t from, unsigned count);

      

     3、注册

    cdev_init()/cdev_alloc(),cdev_add(),cdev_del()

    参见http://www.cnblogs.com/apolloenterprise/p/4663115.html

    以上驱动部分基本分析完成,代码如下:

    三、app

    六、开发板终端命令

      tftp  50008000 zImage

      bootm 50008000

      mknod /dev/hand_one c 248 0      // 参数为 设备名 设备类型 主设备号 次设备号

      insmod  ./drv_hand_one.ko

      ./app_hand_one

      注意:mknod  创建设备文件:
        利用cat /proc/devices查看申请到的设备名,设备号。  (对应 inode 数据结构)
      (1)使用mknod手工创建:mknod filename type major minor   在开发板的命令行中输入
      (2)自动创建:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。在驱动初始化代码里调用class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。

    七、重要的数据结构
    (1)struct file:代表一个打开的文件描述符,系统中每一个打开的文件在内核中都有一个关联的struct file。它由内核在open时创建,并传递给在文件上操作的任何函数,直到最后关闭。当文件的所有实例都关闭之后,内核释放这个数据结构。

    (2)struct inode:用来记录文件的物理信息。它和代表打开的file结构是不同的。一个文件可以对应多个file结构,但只有一个inode结构。inode一般作为file_operations结构中函数的参数传递过来。
       inode译成中文就是索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数 据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令, 能通过inode值最快的找到相对应的文件。

    (3)struct file_operations

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/apolloenterprise/p/4665826.html
Copyright © 2011-2022 走看看