操控树莓派IO口的驱动代码编写

本文详细介绍了如何编写驱动代码来操控树莓派的GPIO口,特别是针对pin4引脚设置为输出引脚的过程,包括物理地址到虚拟地址的转换、GPFSEL0寄存器的配置,并提供了驱动代码和上层测试代码的示例。通过dmesg和gpio readall命令进行验证。
摘要由CSDN通过智能技术生成

操控树莓派IO口的驱动代码编写

树莓派(bcm2835芯片手册)

要对I/O口操作,首先得把其对应的物理地址在代码中用变量表示出来,但内核和上层代码访问的都是虚拟地址,所以在驱动代码里不能直接写物理地址,需要把物理地址转化为虚拟地址。

先定义变量

volatile unsigned int* GPFSEL0 = NULL;
volatile unsigned int* GPSET0 = NULL;
volatile unsigned int* GPCLR0 = NULL;
volatile //特征修饰符 作为指令关键字
   作用:
   1.确保指令不会因编译器的优化而省略。(编译器自认为人为给的数据不行,可能会
   被编译器给优化掉)
   2.要求每次直接从寄存器读值。(寄存器随着硬件的执行可能会改变寄存器里面的数
   据,如果没有volatile修饰,读取的数据是原先数据的一个备份,是个老数据,数据
   时效性就很差。)

unsigned 
	作用:
	整数分为有符号与无符号,如果要把类型声明为无符号数就需要使用unsigned来修饰
	(除char以外的数据类型中,默认情况下声明的整型变量都是有符号的类型),两者
	区别在于,有符号的数最高位的数作为符号位,无符号最高位作为值。如两个字节的
	short,有符号表示范围是-32768~32767,无符号范围是0~65535.

查看树莓派型号

cat /proc/cupinfo

在这里插入图片描述
此处指令看到的型号不是树莓派cpu真的型号,其真正型号应该是BCM2837,也就是IO在物理地址上的基址应该是0x3F000000。

在这里插入图片描述
在这里插入图片描述

通过查看芯片手册发GPFSEL0寄存器VC  CPU总线地址是0x7E200000,
相对基址(0x7E000000)偏移0x00200000,那么ARM物理地址也是偏移这
么多,所以GPIO的物理地址应该是从0x3f200000 开始 。

物理地址转化为虚拟地址(由芯片手册总线地址GPFSEL0、GPSET0、GPCLR0这三个地址的偏移量推出其物理地址)

 GPFSEL0 = volatile(unsigned int *)ioremap(0x3F200000,4);//ioremap函数将物理地址转换成虚拟地址,io口寄存器映射成普通内存单元进行访问
 GPSET0 = volatile(unsigned int *)ioremap(0x3F20001C,4);
 GPCLR0 = volatile(unsigned int *)ioremap(0x3F200028,4);

把上面三条语句写入函数:int __init pin4_drv_init(void) //真实驱动入口
在这里插入图片描述
如此就实现了物理地址转化成虚拟地址。(注:退出驱动时,用iounmap(*GP)函数解除地址映射);

此处以pin4引脚为例,要把pin4引脚设置为输出引脚,根据芯片手册内容需要配置GPFSEL0的14-12位(位置由0开始)为001。
在这里插入图片描述
但要注意的是在改变14-12位置上的值时,其它位置上的内容不能变,不然将会影响其它的引脚。

设置pin4引脚为输出引脚

 //把pin4变为输出引脚,配置14-12位置(由位置0开始)的内容为001
        *GPFSEL0 &= ~(0x6<<12);//6的二进制是110左移12位后,110对应的位置是14-12,取反后110变为001其它位为1,和GPFSEL0进行与运算后就实现只有14、13位改变为0
        *GPFSEL0 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值