Linux驱动入门(二)操作硬件

Linux驱动入门系列

Linux驱动入门(一)字符设备驱动基础

Linux驱动入门(二)操作硬件

Linux驱动入门(三)Led驱动

Linux驱动入门(四)非阻塞方式实现按键驱动

Linux驱动入门(五)阻塞方式实现按键驱动

Linux驱动入门(六)poll机制实现按键驱动

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值