Linux驱动入门系列
Linux驱动入门(二)操作硬件
一、通用做法
玩过单片机的朋友应该懂得如何操作寄存器
举个例子,例如现在想往寄存器地址0xFF223440写数据,在单片机编程中的做法如下
volatile unsigned int *reg = (unsigned int*)0xFF223440;
*reg = val;
在Linux中做法也是类似,只不过Linux不可以直接访问寄存器地址,而要经过映射后才能访问,下面开始介绍
ioremap
映射地址
/*
* cookie:表示要映射的地址
* size:表示要映射的地址范围
*/
ioremap(cookie,size)
例如上面要操作寄存器0xFF223440,在Linux的做法如下
volatile unsigned int *reg = ioremap(0xFF223440, 4);
*reg = val;
当然在映射前要先申请request_region(start,n,name)地址空间,不过这不是必须的
在映射完地址后,当驱动程序退出时,不再使用此地址,需要使用iounmap取消映射
iounmap
取消地址映射
/*
* cookie:映射后的地址
*/
iounmap(cookie)
例如上面的例子中,在驱动程序退出时,需要调用
iounmap(reg);
在取消映射后,如果先前有申请地址空间,那么就需要释放申请的地址空间release_region(start,n)
寄存器读写
在上面的例子中,读写寄存器通过直接访问指针,而内核中提供了一套宏定义来读写寄存器
readb(c) //读8位
readw(c) //读16位
readl

操作硬件&spm=1001.2101.3001.5002&articleId=99949396&d=1&t=3&u=3cc41a424d2b43c2abd82afe3215f64d)
3461

被折叠的 条评论
为什么被折叠?



