使用GPIO子系统去访问gpio

使用GPIO子系统

1.查看gpio设备

cat /sys/kernel/debug/gpio

使用该指令去查看当前注册的gpio设备

image-20240501140301299

我们有许多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

image-20240501165307887

image-20240501165732218

image-20240501171105436

​ 编写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安装驱动

image-20240501170232869

出现保存,使用dmesg -c查看日志内容

image-20240501170401487

可以看到日志io控制权获取失败,根据返回错误可以知道是设备繁忙,原因很简单,通过命令查看

cat /sys/kernel/debug/gpio

image-20240501140301299

该io已经被驱动占用,使用lsmod查看当前设备上加载的驱动

image-20240501170815964

驱动当中有个led_gpio,是orangepi自带的led驱动,使用rmmod卸载驱动,再去查看注册的io设备

image-20240501170953716

已经没有这个gpio设备,再注册驱动

image-20240501171215824

编写测试代码

image-20240501175157099

编写测试代码
可以看到可以成功让led闪烁

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值