tyron's page 不断探索是一件好事,学无止境!

Linux设备驱动开发 学习笔记(1)——基础

2020-02-03
David


基于宋宝华《Linux设备驱动开发详解-基于最新的Linux4.0内核》。


概述

驱动工程师必须按照相应的架构设计驱动。

操作系统 驱动特点
每一种设备驱动都会定义一个软件模块,包含.h文件和.c文件.
.h文件 - 定义该设备驱动的数据结构并声明外部函数。
.c文件 - 进行驱动的具体实现。
需要将驱动融入内核。
设计面向操作系统内核的接口,该接口有操作系统规定。

操作系统的作用: 多任务并发;提供内存管理机制(让每个进程都可以独立的访问4GB的内存空间)。

操作系统通过给驱动制造麻烦来达到给上层应用提供便利的目的。

Linux驱动针对的对象是存储器和外设,分为3个基础大类:

  • 字符设备 - 串行顺序访问(open/close/read/write);
  • 块设备 - 任意顺序访问(open/close/read/write);
  • 网络设备 - 数据包,套接字接口;

Linux设备驱动需要的基础:硬件基础、c语言基础、Linux内核基础、多任务并发控制和同步基础。

有效的帮助文档:Linux内核源代码中包含的Documention目录。

Linux源代码阅读交叉索引:

硬件基础

NOR Flash的特点是 可芯片内执行(eXecute In Place, XIP),程序可以直接在NOR内运行。

NAND Flash以块方式进行访问,不支持芯片内执行。

DRAM以电荷形式进行存储,数据存储在电容器中,由于电容器会因漏电而出现电荷丢失,所以DRAM器件需要定期刷新。

与SDRAM相比,DDR SDRAM同时利用了时钟脉冲的上升沿和下降沿传输数据,因此,在时钟频率不变的情况下,数据传输频率加倍。

USB传输速度:

  • 低速: 1.5M bit/s
  • 全速:12M bit/s
  • 高速:480M bit/s
  • 超高速:5.0G bit/s

USB 2.0的bulk模式只支持1个数据流。

USB 3.0增加的Bulk Streams模式,可以支持多个数据流,每个数据流被分配一个Stream ID(SID),每个SID与一个主机缓冲区对应。

以太网MAC和PHY之间采用MII(媒体独立接口)连接。

以太网隔离变压器是处于以太网PHY与连接器之间的磁性组件,作用:信号传输,阻抗匹配,波形修复,信号杂波抑制,高电压隔离。

SD/SDIO的传输模式:

  • SPI模式
  • 1位模式
  • 4位模式

CPLD由完全可编程的与或门阵列以及宏单元构成。“与或”阵列完成组合逻辑功能,触发器完成时序逻辑功能。

FPGA基于LUT(查找表)工艺。查找表本质上是一片RAM。

芯片手册阅读:

  • Overview/Features — 必读
  • MemoryMap — 必读
  • IPs/外设 — 详细阅读
  • Electrical Data(电气特性) — 必读

Linux内核及编程

Linux内核是一个演变而不是一个设计。一直朝着3个方向发展:

  • 支持更多的CPU,硬件体系架构和外部设备
  • 支持更广泛领域的应用
  • 提供更好的性能

Linux 2.6以后,总线、设备、驱动三者之间因为一定的联系性而实现对设备的控制。

Linux 2.6以后,内核模块从.o变为.ko。

Linux内核源代码:

  • arch: 各平台的板级支持在这里
  • documentation:内核各部分的通用解释和注释
  • drivers:设备驱动程序
  • init:内核初始化代码。start_kernel()位于init/main.c文件中
  • script:用于配置内核的脚本文件
  • security:一个SELinux模块

内核一般要做到drivers与arch的软件架构分离,驱动中不包含板级信息,让驱动跨平台。同时,内核的通用部分(如kernel,fs,ipc,net等)则与具体的硬件(arch和drivers)剥离。

Linux内核的组成:

  • 内存管理
  • 进程调度
  • 进程间通信
  • 虚拟文件系统
  • 网络接口

绝大多数进程(以及进程中的多个进程)是由用户空间的应用创建的。

内核空间和用户空间的具体界限是可以调整的,在内核配置选项Kernel Features—>Memory split,可以设置界限为2GB或者3GB。

Linux内核的内存管理底层的Buddy算法,用于管理每个页的占用情况,内核空间的slab以及用户空间的C库的二次管理。

Kswapd(交换进程)是Linux中用于页面回收的内核线程,采用最近最少使用(LRU)算法进行内存回收。

在Linux中网络接口可分为网络协议和网络驱动程序。

ARM处理器的7种工作模式:

  • 用户模式(usr)
  • 快速中断模式(fiq)
  • 外部中断模式(irq)
  • 管理模式(svc)
  • 数据访问中止模式(abt)
  • 系统模式(sys)
  • 未定义指令中止模式(und)

Comments

Content