树莓派GPIO驱动编写

本文介绍了树莓派GPIO驱动的编写,包括理解物理地址、虚拟地址和总线地址的概念,内核移植与编译,以及GPIO配置的步骤。特别强调了BCM2708和BCM2709的不同,以及GPIO寄存器配置和volatile关键字的重要性。还讨论了内核驱动中内存映射、多线程同步和用户态与内核态数据交互的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总线地址:CPU能够访问的地址范围

物理地址:硬件中的实际地址或绝对地址:比如磁盘地址,比如51的寄存器,就是物理地址

虚拟地址 操作系统运行在保护模式下所使用的地址,也叫逻辑地址,它是基于算法的,处于软件层面。

编写驱动之前必须要树莓派内核移植,以及内核编译

(141条消息) 树莓派-内核开发-说明 下载代码 编译 替换内核_TX564的博客-优快云博客

(141条消息) Linux内核介绍、编译_TX564的博客-优快云博客

我们在编写驱动程序的时候,IO空间的起始地址是0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址应该是从0x3f200000开始的,然后在这个基础上进行Linux系统的MMU内存虚拟化管理,映射到虚拟地址上。

特别注意,BCM2708 和BCM2709 IO起始地址不同,BCM2708是0x20000000,BCM2709是0x3f000000,这是造成大部分人驱动出现“段错误”的原因。树莓派3B的CPU为BCM2709。

我们来配置一下pin4口:

1.查询数据手册或者查看官网引脚图

官网引脚图

MMU(页表)

MMU的作用就是将物理地址比如1GB的物理地址映射成4GB虚拟地址 ,同时也是防止程序对物理地址写数据造成一些不可必要的问题

怎么映射呢:4G空间时其实根本用不了所谓的4G空间,其中有大片内存被闲置,那么这个时候呢,其他程序被加载进来时发现内存不够了,就把其他程序里的4G空间里闲置部分拿出来给这个进程用,换之这个进程内存不够时就会把其他进程里闲置的空间拿过来给该进程使用。

 这里可以得知pin4被分在第0组,那么我们所有的配置都要选第0组的 ,根据上面给出的pin9的例子我们可知,如果要将pin4配置为output模式就要将bit12-bit14配置为001

注意:前面的地址并不是物理地址,而是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值