使用GPIO子系统
1.查看gpio设备
cat /sys/kernel/debug/gpio
使用该指令去查看当前注册的gpio设备
我们有许多gpio设备时被注册的,有led,也有和usb控制相关的,还有蓝牙唤醒,以太网唤醒,这些都是和gpio相关的
每个列的含义
第一列是gpio的io数字,这个数字是给cpu使用,来判断当前控制的是哪个gpio
第二列是gpio的标签,驱动程序或者用户程序可以使用标签去访问该gpio
第三列是gpio的属性,输入还是输出,上拉还是下拉,是否配置到外部中断
2.尝试控制gpio
使用内核提供的访问去控制gpio,有两种,这次尝试使用传统的内核控制gpio。
所需要的内核头文件是 <linux/gpio>
访问步骤:
- 1.使用gpio_request获取gpio控制器
- 2.使用gpio_direction_output/gpio_direction_output设置gpio输入输出模式
- 3.当驱动放弃对该gpio控制,使用gpio_free施放该gpio
编写makefile
#先指定当前目录
PWD ?= $(shell pwd)
#内核源码路径
export KERNELDIR:=/home/qzl/orangepi-build/kernel/orange-pi-5.4-sun50iw9/
export CROSS_COMPILE ?= /home/qzl/orangepi-build/toolchains/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
obj-m += led_drv.o
module:
make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 modules
clean:
make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 clean
传入虚拟机中,编译完成取出.ko文件传入开发板使用insmod安装驱动
出现保存,使用dmesg -c查看日志内容
可以看到日志io控制权获取失败,根据返回错误可以知道是设备繁忙,原因很简单,通过命令查看
cat /sys/kernel/debug/gpio
该io已经被驱动占用,使用lsmod查看当前设备上加载的驱动
驱动当中有个led_gpio,是orangepi自带的led驱动,使用rmmod卸载驱动,再去查看注册的io设备
已经没有这个gpio设备,再注册驱动
编写测试代码
编写测试代码
可以看到可以成功让led闪烁