Linux下使用mmap(/dev/mem)操作GPIO

前面介绍了使用sysfs操作GPIO,这儿介绍另一种方式:mmap。mmap可以将物理设备/dev/mem映射到内存,通过读写内存的方式操作GPIO寄存器,使用起来速度比sysfs更快。

测试环境: 飞凌OKMX8MM-C开发板

使用寄存器操作GPIO时,需要设置的寄存器有:

  • Pad Mux Register,PAD复用寄存器
  • Pad Control Register,PAD控制寄存器
  • GDIR,GPIO 方向寄存器
  • DR,数据寄存器

下面以GPIO5_IO00为例,先从手册中找到各寄存器的地址,并介绍基本配置。

Pad Mux Register

Pad Mux Register是端口复用寄存器,GPIO5_IO00复用的端口为SAI3_TXC,对应的寄存器为IOMUXC_SW_MUX_CTL_PAD_SAI3_TXC,可以看到地址为0x303301DC,占用四个字节。文档内容如下图所示:

Pad Mux Register
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,可以使用mmap函数将物理地址映射到用户空间,然后使用指针操作物理地址来访问寄存器。以下是一个例子: ``` #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #define PERIPHERAL_BASE 0x3F000000 // 树莓派3B+上的Peripheral Base Address #define GPIO_BASE (PERIPHERAL_BASE + 0x200000) // GPIO寄存器的基地址 #define GPIO_GPFSEL0 0x0000 // GPIO Function Select 0 #define GPIO_GPSET0 0x001C // GPIO Pin Output Set 0 #define GPIO_GPCLR0 0x0028 // GPIO Pin Output Clear 0 #define GPIO_PIN 17 // 使用GPIO17作为例子 int main() { // 打开/dev/mem文件 int fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { perror("open"); exit(EXIT_FAILURE); } // 映射GPIO寄存器到用户空间 volatile unsigned int *gpio = (volatile unsigned int *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE); if (gpio == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } // 设置GPIO17为输出 unsigned int reg = gpio[GPIO_GPFSEL0/4]; reg &= ~(7 << ((GPIO_PIN % 10) * 3)); reg |= 1 << ((GPIO_PIN % 10) * 3); gpio[GPIO_GPFSEL0/4] = reg; // 设置GPIO17为高电平 gpio[GPIO_GPSET0/4] = 1 << GPIO_PIN; // 等待1秒钟 sleep(1); // 设置GPIO17为低电平 gpio[GPIO_GPCLR0/4] = 1 << GPIO_PIN; // 取消映射 munmap((void *)gpio, 4096); // 关闭/dev/mem文件 close(fd); return 0; } ``` 该程序使用mmap函数将GPIO寄存器映射到用户空间,并使用指针访问寄存器。在这个例子中,我们将GPIO17设置为输出,并将其设置为高电平,等待1秒钟后将其设置为低电平。请注意,这需要在root权限下运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值