zoukankan      html  css  js  c++  java
  • 《驱动设计的思想:面向对象—分层—分离》

    1.面向对象

      字符设备驱动程序抽象出一个 file_operations 结构体;
      我们写的程序针对硬件部分抽象出 led_operations 结构体。

      在linux内核中,所谓的面向对象可以理解为用结构体来表示某个对象。

    2.分层

       上下分层,比如我们前面写的 LED 驱动程序就分为 2 层:

      上层实现硬件无关的操作,比如注册字符设备驱动: leddrv.c
      下层实现硬件相关的操作,比如 board_A.c 实现单板 A 的 LED 操作

    3.分离

      以led驱动为例子,硬件驱动中,对某个led的开关就是针对固定的地址进行操作,如果要还成另外一个led就必须更换这些地址,就很麻烦。

      实际情况是,每一款芯片它的 GPIO 操作都是类似的。比如: GPIO1_3、 GPIO5_4 这 2个引脚接到LED。

      ① GPIO1_3 属于第 1 组,即 GPIO1。
        有方向寄存器 DIR、数据寄存器 DR 等,基础地址是 addr_base_addr_gpio1。
        设置为 output 引脚:修改 GPIO1 的 DIR 寄存器的 bit3。
        设置输出电平:修改 GPIO1 的 DR 寄存器的 bit3。

      ② GPIO5_4 属于第 5 组,即 GPIO5。
        有方向寄存器 DIR、数据寄存器 DR 等,基础地址是 addr_base_addr_gpio5。
        设置为 output 引脚:修改 GPIO5 的 DIR 寄存器的 bit4。
        设置输出电平:修改 GPIO5 的 DR 寄存器的 bit4。

      可以针对某款芯片写出一个chipY_gpio.c,此文件实现芯片上所有gpio的操作。然后在写一个board_led.c,来告诉chipY_gpio.c文件操作哪个gpio引脚。这就是分离的概念。(gpio.c一般厂家都有提供)

      有的内核屏蔽了printk打印,百度解决

  • 相关阅读:
    基于NFS实现多WEB服务器负载均衡
    CentOS 6编译安装lamp,并分别安装event模块方式和FPM方式的PHP
    CentOS 7 下的LAMP实现以及基于https的虚拟主机
    ssh 免密码设置失败原因总结
    任督二脉之进程管理(3)
    任督二脉之进程管理(4)
    任督二脉之进程管理(1)
    任督二脉之进程管理(2)
    VIRTIO概述和基本原理
    图解 TCMalloc
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/12158992.html
Copyright © 2011-2022 走看看