树莓派博通BCM2835芯片手册导读以及IO口驱动代码调试和测试

本文介绍了树莓派博通BCM2835芯片的手册,详细讲解了GPIO功能选择寄存器、寄存器地址、驱动代码编写以及如何在Linux系统中进行内存映射。同时,提供了驱动加载、权限分配和测试代码的步骤,帮助读者理解并实现GPIO口的驱动测试。
摘要由CSDN通过智能技术生成

芯片手册下载:
百度网盘:https://pan.baidu.com/s/1hESG0ECH5xk-rv1V-1qM7g
提取码:a9iy

1.树莓派博通BCM2835芯片手册介绍在这里插入图片描述
在这里插入图片描述
说明:

  • GPFSEL0 GPIO Function Select 0: 功能选择:输入/输出

  • GPSET0 GPIO Pin Output Set 0 : 输出0
    GPSET1 GPIO Pin Output Set 1 : 输出

  • GPCLR0 GPIO Pin Output Clear 0: 清零(设置低电平)
    GPCLR1 GPIO Pin Output Clear 1 :清1 (设置高电平)

在这里插入图片描述
说明:

  • 每个寄存器都是32位的

  • FSEL4 代表的是引脚4

  • 我们把引脚4配置为输出引脚
    FSEL4 14-12 001 我们把4引脚的14-12配置成001 GPIO Pin 4 is an output

在这里插入图片描述
说明:

  • 0 = No effect(无效)
    1 = Set GPIO pin n(设置GPIO引脚)
    在这里插入图片描述
    2.寄存器的地址问题
    我们在编写驱动程序时,IO空间的起始地址是 0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址应该是从0x3f200000开始的,然后在这个基础上进行Linux系统的MMU内存虚拟化管理,映射到虚拟地址上。

    在这里插入图片描述
    该图的尾部偏移是对的根据GPIO的物理地址0x3f200000可以知道:
    GPFSEL0 0x3f200000
    GPSET0 0x3f20001c
    GPCLR0 0x3f200028

上面写的地址是物理地址,需要转化成虚拟地址,通过函数:ioremap();
void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags);

参数说明:

  • phys_addr:要映射的起始的IO地址
  • size:要映射的空间的大小
  • flags:要映射的IO空间和权限有关的标志

3.驱动代码的编写

#include <linux/fs.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include <linux/types.h>
#include <asm/io.h>

static struct class *pin4_class;
static struct device *pin4_class_dev;      

static dev_t devno;          //设备号
static int major = 231;       //主设备号
static int minor = 0;      //次设备号
static char *module_name = "pin4";    //模块名

volatile unsigned int* GPFSEL0 = NULL;      //volatile的作用:volatile是一个特征修饰符,作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值

volatile unsigned 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值