12 orangepi Linux设备驱动前言

需要了解的知识:
1). 驱动是硬件与用户进程之间的通信桥梁
用户进程是不可以直接访问硬件的.
如:hexdump /dev/input/event4 //这样,程序hexdump从设备文件里接收数据并按十六进制打印出来
数据是驱动先接收到硬件反馈的数据处理后再移交给用户进程

驱动不属于任何一个用户进程, 可以给多个用户进程调用.
驱动是常驻于内存里,等待用户进程调用.
 
2). 用户进程如访问越界则会发生段错误,但对其它进程没有影响. 用户进程在cpu的usr模式下工作
驱动是在svc模式下工作(特权模式), 驱动发生错误,会影响整个系统(像windows系统蓝屏).
写应用程序有bug仅仅是影响该进程,但写驱动时,哈哈…

3). 驱动加载到内核后(即驱动工作), 除了初始化工作以外,一般情况下是不会自动去执行操作的,
驱动是被用户进程调用才会触发操作的. 所以也得注意驱动的接口函数的可重入性
也就是驱动是实现硬件的各种功能,但怎么去使用由用户进程调用来决定

4). 驱动要注意可移植性. 驱动里用的栈是定长(8K), 所以在使用大的缓冲区时需要动态申请(kmalloc/vmalloc)

5). C库函数不能在内核驱动里调用, 因C库需要通过系统调用来实现功能.
但在内核里有实现大部分C库的基本功能函数,如内核里的printk可代替C的printf函数
cat /proc/kallsyms | grep 函数名 //可查看当前内核里是否有提供此功能函数

6). 内核使用面向对象的做法来实现设备驱动方法的. 如用struct cdev的一个变量来描述一个字符设备驱动.
先了解所用的结构是描述是什么的,然后才看具体的做法


内核源码的目录:
arch
arm
mach-sunxi : 每个cpu型号都会有mach-xxxx的目录, 此目录里会有几个c文件,这些文件表示基于这个cpu所做的方案, 源码里大多是用于描述此方案的硬件资源(如: sun4i.c , sun6i.c, sun8i.c…)

block : 实现块设备的接口与管理,大容量的储存设备(SD, nand, emmc)

cypto: 加密算法

Documentation: 文档

drivers: 硬件的驱动

firmware: 固件, 提供给外接芯片启动时加载的程序,如wifi模块(zd1211)

fs: 文件系统格式

init: 内核启动时初始化的代码

ipc: 进程间通信的实现功能代码

kernel: 里面实现进程调度的功能

mm: 内存管理

net: 网络协议栈的实现

scripts: 配置内核make menuconfig时产生界面的脚本

sound: 声卡驱动相关

//
内核起用接口标准化的作用.即内核里制定了驱动的接口及应用程序的调用接口. 只要双方都遵循标准的接口,双方就可以实现通信,而不用管具体一方是什么样,怎样实现的。 达到分层编码实现的效果.

driver_inteface  <--->   (linux kernel)   <--->  API

如应用程序是按一个标准的接口去接收触摸屏的数据,
  而不同的触摸屏驱动也是按一个标准的驱动接口把数据提交给内核, 内核再按应用层的
  标准的接口把数据转交给应用程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值