OpenWrt 应用中操作GPIO的方式多数都是:
- 修改设备树
- 通过shell脚本export出对应的GPIO
- 通过shell脚本或操作文件的方式控制GPIO/通过LEDE LED配置控制GPIO
不用这种方式的时候,通常按照Linux方式先写驱动,然后在应用/插件中调用驱动程序接口控制GPIO
以上方式的例程和资料网上很容易找,英文阅读没问题的话,直接看官方资料就可以轻松搞定;
最近项目需要在OpenWrt 插件中根据运行情况和指令直接操作GPIO,不想写驱动;参考了网上的资料,没折腾就成功了
这种方式的好处是不用改设备树和写驱动,减少了代码维护的复杂度;用写寄存器的方式控制GPIO,速度应该快点
坏处是对对寄存器不熟悉的新手不太友好
使用基本只需要根据芯片资料修改一下代码中的寄存器相关的宏定义和mmap函数中的offset地址即可;
如果是MTK相关的芯片,直接根据芯片资料修改mmap函数中的offset地址
原代码针对的是MT7628, GPIO BASE ADDRESS 为0x10000600,故offset设为0x10000000,
而MT7621的 GPIO BASE ADDRESS 为0x1E000600,故offset设为0x1e0000000
详细代码请自行查看参考代码
static int gpio_mmap(void)
{
if ((gpio_mmap_fd = open(MMAP_PATH, O_RDWR)) < 0) {
fprintf(stderr, "unable to open mmap file");
return -1;
}
gpio_mmap_reg = (uint8_t*) mmap(NULL, 1024, PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, gpio_mmap_fd, 0x1e000000);
if (gpio_mmap_reg == MAP_FAILED) {
perror("foo");
fprintf(stderr, "failed to mmap");
gpio_mmap_reg = NULL;
close(gpio_mmap_fd);
return -1;
}
return 0;
}