前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >08_调试与使用虚拟的GPIO控制器

08_调试与使用虚拟的GPIO控制器

作者头像
韦东山
发布2021-12-08 10:09:12
6250
发布2021-12-08 10:09:12
举报
文章被收录于专栏:韦东山嵌入式

目录

百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041

资料下载

coding无法使用浏览器打开,必须用git工具下载:

代码语言:javascript
复制
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git

视频观看

百问网驱动大全

调试与使用虚拟的GPIO控制器

参考资料:

1. 硬件功能

假设使用这个虚拟的GPIO Controller的pinA来控制LED:

在这里插入图片描述
在这里插入图片描述

2. 编写设备树文件

代码语言:javascript
复制
gpio_virt: virtual_gpiocontroller {
	compatible = "100ask,virtual_gpio";
    gpio-controller;
    #gpio-cells = <2>;
    ngpios = <4>;
};

myled {
	compatible = "100ask,leddrv";
	led-gpios = <&gpio_virt 0 GPIO_ACTIVE_LOW>;
};

3. 上机实验

3.1 设置工具链

1. STM32MP157 注意:对于STM32MP157,以前说编译内核/驱动、编译APP的工具链不一样,其实编译APP用的工具链也能用来编译内核。

代码语言:javascript
复制
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

2. IMX6ULL

代码语言:javascript
复制
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
3.2 编译、替换设备树

1. STM32MP157

在这里插入图片描述
在这里插入图片描述

2. IMX6ULL

3.3 编译、安装驱动程序

4. STM32MP157上的bug

在STM32MP157上做如下实验时:

代码语言:javascript
复制
echo 509 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio509/direction
cat /sys/class/gpio/gpio509/value

发现对于value执行一次cat操作,导致virt_gpio_get_value函数被调用3次,如下:

代码语言:javascript
复制
cat /sys/class/gpio/gpio509/value
[   96.283263] get pin 1, it's val = 0
[   96.297803] get pin 1, it's val = 0
[   96.312604] get pin 1, it's val = 0

cat value这个操作,会导致驱动drivers/gpio/gpiolib-sysfs.c中的value_show函数被调用。

value_show只会调用一次GPIO Controller中的get函数。

所以,我们编写了一个read.c程序,源码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv)
{
        int fd = open(argv[1], O_RDONLY);
    
        char buf[10];
    
        read(fd, buf, 10);
        printf("%s\n", buf);
        return 0;
}

编译read.c:

代码语言:javascript
复制
arm-buildroot-linux-gnueabihf-gcc -o read read.c

放到板子上执行,发现读取value文件一次,只会导致get函数被调用一次,如下:

代码语言:javascript
复制
# ./read /sys/class/gpio/gpio509/value
[  298.663613] get pin 1, it's val = 0
1

所以:问题在于cat命令,虽然我们执行了一次cat操作,但是它发起了3次读value文件的操作。

代码语言:javascript
复制
  return 0;

}

代码语言:javascript
复制
编译read.c:

```shell
arm-buildroot-linux-gnueabihf-gcc -o read read.c

放到板子上执行,发现读取value文件一次,只会导致get函数被调用一次,如下:

代码语言:javascript
复制
# ./read /sys/class/gpio/gpio509/value
[  298.663613] get pin 1, it's val = 0
1

所以:问题在于cat命令,虽然我们执行了一次cat操作,但是它发起了3次读value文件的操作。

至于cat的bug在哪,无关紧要,先不花时间去查。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 资料下载
  • 视频观看
  • 调试与使用虚拟的GPIO控制器
    • 1. 硬件功能
      • 2. 编写设备树文件
        • 3. 上机实验
          • 3.2 编译、替换设备树
          • 3.3 编译、安装驱动程序
        • 4. STM32MP157上的bug
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档