Linux驱动-基础知识预备
总阅读次
Linux驱动包含3种:
字符设备驱动
字符设备是指能一个字节一个字节读取数据的设备,如:
GPIO、按键、LCD、蜂鸣器、串口、声卡等字符设备。字符设备一般需要在驱动层实现open()、close()、ioctl()等函数。这些函数最终会被文件系统的相关函数调用。
内核为字符设备对应的一个文件,如字符设备文件/dev/console。
块设备驱动
硬盘、存储设备、U盘网络设备驱动
以太网、wifi
块设备和网络驱动通常有板级BSP包支持,通常较少开发。
*GPIO
**通用输入输出口General Purpose Input Output Port*
对寄存器操作
MMU
内存管理单元
有了内存管理单元,便有了虚拟地址、物理地址
MCU微控制器单片机没有MMU这个概念
MPU微处理器相比单片机有了内存管理单元
Linux把所有设备看成了文件(opoen,read,write,loctrl,close)
Linux字符设备驱动的编程思想:做一组设备对应的驱动函数
上层应用程序如何对某个外设进行操作
底层驱动的编写方式以及如何注册到系统(register_chrdev())
MISC杂设备(混杂设备)
模块(module)
对外部设备的操作
用程序对外部设备的操作有3部曲
- 通过原理图找到设备的PIN脚
- 查看数据手册
处理器控制KP_COL0输出一个低电平,就没有电压差LED2就不会亮
KP_COL0连接着 板对板连接器【4组中其中第2组】
处理器的连接点
对GPL2控制就可以对LED进行亮和灭的控制
CPU手册
最终的物理地址=基地址+偏移地址
office偏移地址
*基地址**Base Address*:ox1140_000
GPL2CON:配置寄存器,配置这个口不同功能方式
GPL2DAT:数据寄存器。把它作为输出口,写1则高电平
GPL2PUD:上拉/下拉寄存器
GPL2DRV:设置驱动力
GPL2CONPDN/GPL2PUDPDN:低功耗模式
GPL2CON,32位寄存器
GPL2CON[0]:0-3位设置第0个GPL2CON寄存器
GPL2CON[1]:第1个GPL2CON寄存器
0则是输入口
1则是输出口
2GNSS_GPIO[1]则作为GPS功能来用
3作为矩阵键盘来使用KP_COL[1]
设置为全1则 0XF 则作为中断来使用 EXT-INT29[1]
- 根据物理地址编程
1 | /*对数据寄存器操作*/ |
虚拟地址
在ARM-LINUX编程把物理地址转化为虚拟地址,通过虚拟地址对设备进行操作。
架构知识补充
- CPU(中央处理器)
遵循冯 诺依曼结构存储程序,存储程序的思想,程序放在存储器当中,CPU不断的取指令去执行。
说到底CPU是一套数字电路。比如:门电路、与非门、触发器等等电路
处理器解析执行一套指令系统。
不断的顺序取指令执行
哈佛结构:对冯 诺依曼结构存的创新。对取指令与取数据同时来操作。
- 指令系统
可以看成软硬件的界面;是计算机系统体系结构的思想。指令系统可以分为RISC精简指令集 CISC复杂指令集
RISC:每一条指令,执行的时间、长度是一样的。ARM、MIPS、POWERPC都是采用精简指令集。优势:便于实现流水线,进一步提高性能。
指令流水线
可以使用一些需要计算机处理的多项操作在时间上重叠进行。
Linux内核子系统
Linux内核有许多子系统,包括进程管理、内存管理、文件管理、设备管理和网络管理。
进程管理
进程是程序运行的一个实例,是操作系统分配资源和调度的一个基本单位。分为3个状态
就绪状态
在这种状态中,进程具有处理器外的其他,进程不运行
执行状态
- 阻塞状态