树莓派高阶课程7:树莓派博通BCM2835芯片手册导读

树莓派博通BCM2835芯片手册导读

驱动的两大利器

电路图:通过电路图找到寄存器
芯片手册:进行编写

1.树莓派寄存器的介绍

在这里插入图片描述

GPFSEL0 GPIO Function Select 0//功能选择 输入/输出
GPSET0 GPIO Pin Output Set 0//输出0
 GPSET1 GPIO Pin Output Set 1//输出1
 0 = No effect
 1 = Set GPIO pin n
 
GPCLR0 GPIO Pin Output Clear 0//清零
 0 = No effect
 1 = Clear GPIO pin n
 GPCLR1 GPIO Pin Output Clear 1//清1

每个寄存器都是32位的:

在这里插入图片描述
例如:我们把引脚4配置为输出引脚
FSEL4 14-12 001 我们把4引脚的14-12配置成001 GPIO Pin 4 is an output

注意:我们配置的底层引脚对应得是BCM
寄存器第0组位FESL0–9
寄存器第1组位FSEL10–19

在这里插入图片描述
具体的引脚也可通过官方手册查找:

树莓派引脚
在这里插入图片描述

2.寄存器的地址问题

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

在这里插入图片描述

该图的尾部偏移是对的根据GPIO的物理地址0x3f200000可以知道:
GPFSEL0 0x3f200000
GPSET0 0x3f20001c
GPCLR0 0x3f200028

这里我们得到的是物理地址是不可操作的,我们需要转化成虚拟地址,通过函数:

void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags);

ioremap宏定义在asm/io.h内:

#define ioremap(cookie,size)           __ioremap(cookie,size,0)

参数:
phys_addr:要映射的起始的IO地址
size:要映射的空间的大小
flags:要映射的IO空间和权限有关的标志
该函数返回映射后的内核虚拟地址(3G-4G). 接着便可以通过读写该返回的内核虚拟地址去访问之这段I/O内存资源。

附带
BCM2835芯片手册:
BCM2835_PDF_Datasheet

猜你喜欢

转载自blog.csdn.net/weixin_40734514/article/details/108814683