Linux ARM 驱动笔记之一 : 准备
转载请注明:http://blog.csdn.net/zkwsr/article/details/12510439
本文以Linux ARMSPI设备驱动为例记录Linux驱动的开发中的一些套路和准备.本文内容抛开具体代码,描述相关的准备知识,描述书本中很少提及的内容.
1 驱动编写的套路
Linux 驱动编写归根揭底,涉及到底部,就是设置寄存器, 从设置寄存器的角度来看,Linux驱动编写分为两种套路:
1) 直接操控寄存器: 这种方式写驱动代码结构简单,直接设置控制寄存器即可,但是对程序员的硬件知识要求比较高, 一个Arm的Datasheet看上3-5遍,才有可能写出个正确的驱动.(从单片机写过程序的程序员转到linux驱动,开始容易写这种代码.)
注意事项:
volatile 这个关键字, 有些时候必须加上.否则变量不会及时更新,导致程序出错.
管脚地址示例:
a) 使用内核设置
定义:S3C2410_GPB(0)//S3C2410 CPU GPIO_B第 0个管脚,linux内核提供了这个对应的宏.
设置/赋值 : s3c2410_gpio_setpin(S3C2410_GPB(0),0);
b) 直接使用寄存器地址
#define PMC_PCER 0xFFFFFC10 //sam9G15 PMC寄存器.
#definev_uint32_t volatile uint32_t
//根据寄存器的位数设置字节长度.uint32_t, uint16_t
v_uint32_t *pmc_pcer;
//ioremap地址映射
pmc_pcer =(uint32_t *)ioremap(PMC_PCER, 4);
* pmc_pcer = (1u<< 5); //设置寄存器值第的值
通过直接操控寄存器就可完成设备的驱动, 但是不建议使用这种方法.
2) 不直接操控寄存器: 通过Linux内核提供的驱动框架写程序,速度快,相对于直接控制寄存器,对硬件知识要求不那么高了.在编写个规范和可靠性方面,按linux驱动框架编写会更好.驱动架构分为:控制器驱动层/Linux驱动核心层/设备驱动层. 下面以SPI驱动为例介绍.(其他类型设备类似)
SPI驱动架构图: