一、一些预备知识
1、已经能够编写led的裸板驱动程序
2、将物理地址转换成虚拟地址
在程序中我们只能使用转换后的虚拟基地址和寄存器偏移来访问相应寄存器,而不能像裸板程序那样直接访问物理寄存器,所以必须对物理地址进行转换,下面是个例子
#include <linux/ioport.h>
#define GPIO_BASE 0x7F008000
#define GPIO_SIZE 0x28C
void __iomem *vir_base;
vir_base = ioremap(GPIO_BASE, GPIO_SIZE);
if (!vir_base)
return -EIO;
注意,程序结尾一定要这样释放你所映射的虚拟地址
iounmap(vir_base);
3、内核中提供的一些寄存器的访问函数
虽然我们可以根据映射到的虚拟地址访问寄存器,但是为了谨慎,最好还是用内核中提供的专用函数进行寄存器访问
。内核根据寄存器的宽度,定义了一系列寄存器的访问函数,要求驱动开发人员使用:下面是个例子
char value;
/* 8位寄存器 */
value = readb(vir_base + offset);
writeb(value, (vir_base + offset));
__raw_readb()/__raw_writeb(); //这组函数不常用
/* 16位寄存器 */
short value;
value = readw(vir_base + offset);
writew(value, (vir_base + offset));
/* 32位寄存器 */
int value;
value = readl(vir_base + offset);
writel(value, (vir_base + offset));