请选择 进入手机版 | 继续访问电脑版

Linux底层驱动之树莓派IO口操作

[复制链接]
小甜心 发表于 2020-12-31 18:05:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
一、Linux中的地址

       Linux内核中,又三种地址:总线地址、物理地址和虚拟地址。
       总线地址: 一种盘算机总线,CPU大概有DMA能力的单元中的内存组件大概物理地址在总线上有相对应的地址。好比CPU的寄存器也会在总线上有单独的地址,但是总线地址不即是真实的寄存器。又好比雷同于IIC设备在IIC总线上的地址。总线的宽度决定了CPU可以大概访问内存的范围,32位的最大只能识别4G的内存;
       物理地址: 硬件中的实际地址或绝对地址:好比磁盘地址,好比51的寄存器,就是物理地址;
       虚拟地址: 利用系统运行在掩护模式下所使用的地址,也叫逻辑地址,它是基于算法的,处于软件层面。
       树莓派IO口的地址先容是物理地址,挂载到Linux内核虚拟地址,编程使用的是虚拟地址。
二、树莓派IO口的寄存器

       树莓派使用的是(博通)BCM 2835的芯片,芯片提供了54个IO口,对应了树莓派的 BCM ,先先容几个IO口的寄存器:

1.GPFSELx IO口模式设置寄存器


Address :寄存器的基地址,也是寄存器的物理地址;
Field Name:寄存器名;
Descriptin: 寄存器说明;
       GPFSEL0是pin0~pin9的设置寄存器,GPFSEL1是pin10~pin19的设置寄存器,以此类推,GPFSEL5就是pin50~pin53的设置寄存器。每个pin在寄存器上的位置及模式说明:

       是不是看出了一个规律:管教号 x 3=寄存器的位置。比方pin5,它的位置就是 5x3=15。
2.GPSET0,GPSET1 IO设置寄存器


GPSET0: pin0~pin31的设置寄存器,1位高电平,0为低电平,复位后为0:

GPSET1: pin32~pin53的设置寄存器,1位高电平,0为低电平,复位后为0:

3.GPCLR0,GPCLR1 IO口清除寄存器


GPCLR0:pin0~pin31的清除寄存器,1位高电平,0为低电平,复位后为0;

GPCLR1:pin31~pin54的清除寄存器,1位高电平,0为低电平,复位后为0;

       有这三种寄存器,就利用树莓派的IO口输入高低电平了,但是不要忘了,利用树莓派的IO是利用虚拟地址,而不是上面的 0x7E20…,因此在编程之前一定要查察物理地址的映射 使用:
  1. cat /proc/iomen
复制代码

       我的树莓派4B对 0x7E20 0000的映射在虚拟地址 0xFE20 0000上。所以编程时,以上几种寄存器的基地址应该是:0xFE20 000;
三、驱动编程实现

       我们来给树莓派的 GPIO.1(对应 BCM的 pin18 )写驱动,到达利用它输出高低电平,

驱动步伐代码:
[code]#include #include #include #include #include #include #include #define v_uint volatile unsigned int#define pin 18static volatile int pin_num=(pin%10)*3;#define _GPFSEL1 0xFE200004  #define _GPSET0  0xFE20001C#define _GPCLR0  0xFE200028v_uint *GPFSEL1 = NULL;v_uint *GPSET0  = NULL;v_uint *GPCLR0  = NULL;static struct class  *pin18_class;static struct device *pin18_dev;static dev_t devno;     //device numblestatic int major=232; //major device numble static int minor=2;     //minor device numblestatic char *module_name = "pin18";//device namestatic int pin18_open(struct inode *inode,struct file *file){        printk("%s_open\n",module_name);                *GPFSEL1 &= ~(0x6
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )