百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041
coding无法使用浏览器打开,必须用git工具下载:
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
参考资料:
假设使用这个虚拟的GPIO Controller的pinA来控制LED:
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.1 设置工具链
1. STM32MP157 注意:对于STM32MP157,以前说编译内核/驱动、编译APP的工具链不一样,其实编译APP用的工具链也能用来编译内核。
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
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
1. STM32MP157
2. IMX6ULL
在STM32MP157上做如下实验时:
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次,如下:
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程序,源码如下:
#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:
arm-buildroot-linux-gnueabihf-gcc -o read read.c
放到板子上执行,发现读取value文件一次,只会导致get函数被调用一次,如下:
# ./read /sys/class/gpio/gpio509/value
[ 298.663613] get pin 1, it's val = 0
1
所以:问题在于cat命令,虽然我们执行了一次cat操作,但是它发起了3次读value文件的操作。
return 0;
}
编译read.c:
```shell
arm-buildroot-linux-gnueabihf-gcc -o read read.c
放到板子上执行,发现读取value文件一次,只会导致get函数被调用一次,如下:
# ./read /sys/class/gpio/gpio509/value
[ 298.663613] get pin 1, it's val = 0
1
所以:问题在于cat命令,虽然我们执行了一次cat操作,但是它发起了3次读value文件的操作。
至于cat的bug在哪,无关紧要,先不花时间去查。