Linux驱动开发之pinctrl与gpio子系统驱动实验【完整教程】

本文详细介绍了Linux驱动开发中如何操作gpio,包括获取设备节点、请求gpio、设置输入输出及读写值。还涵盖了gpiolib子系统的概念及其在驱动中的作用。此外,讲解了修改设备树以配置gpioled,并展示了从构建字符设备驱动框架到测试驱动的完整过程,最终实现驱动加载时LED自动亮起,卸载时熄灭。
摘要由CSDN通过智能技术生成

驱动框架构建之前,需要了解以下的基础知识:

1.驱动中对gpio的操作函数有

  (1)首先获取到gpio所处的设备结点,比如of_find_node_by_path。
  (2)获取gpio编号,of_get_named_gpio函数,返回值是gpio的编号。
  (3)请求此编号的gpio,gpio_request函数。
  (4)设置gpio输入或者输出,gpio_direction_input或者。gpio_direction_output。
  (5)如果是输入,通过gpio_get_value函数读取gpio的,如果是输出,通过gpio_set_value设置gpio的值。

总结:设备结点->编号->请求编号->输入输出->值

2.gpiolib

  gpio子系统就是负责管理整个框架的,gpio子系统会向应用提供一些API函数,也就是gpio_request、gpio_direction_input、gpio_direction_output等等
  gpio驱动为内核源码中的/drivers/gpio中,有大量的.c文件,这些是原厂提供的,但是有几个是gpiolib.c/.h文件都是内核的gpio核心,是某些大神写的,里面含有大量对gpio的操作,有兴趣的可以去详细看看,gpiolib向应用层提供API函数,向底层提供要注册的函数,如gpiochip_add()向系统添加gpio_chip结构体。

int gpiochip_add(struct gpio_chip *chip)
{
   
	unsigned long	flags;
	int		status = 0;
	unsigned	id;
	int		base = chip->base;
	struct gpio_desc *descs;
	*
	*
	*
	*//这个函数还有很多,有需要的请自行去查找

**

3.修改设备树

**
(1)在imx6ull-alientek-emmc.dts文件中首先在&iomuxc中添加pinctrl_gpioled: ledgrp{}

&iomuxc {
   
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
   
		pinctrl_hog_1: hoggrp-1 {
   
			fsl,pins = <
				MX6UL_PAD_UART1_RTS_B__GPIO1_IO19	0x17059 /* SD1 CD */
				MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT	0x17059 /* SD1 VSELECT */
				/* MX6UL_PAD_GPIO1_IO09__GPIO1_IO09        0x17059 SD1 RESET */
				MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID	0x13058	/* USB_OTG1_ID */
			>;
		};
        
		pinctrl_gpioled : ledgrp{
   
			fsl,pin = <
				MX6UL_PAD_GPIO1_IO03__GPIO01_IO03   0X10B0
			>;
		}
		******
		******

(2)在根节点中添加gpioled{}

gpioled{
   
		compatible = "alientek,gpioled"; 
		pinctrl-names = "default";             //默认default
		pinctrl-0 = <&pinctrl_gpioled>;        //这个就是刚才我们新添加到
		led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;  //低点平有效
		status = "okay";
	};

4.make dtbs成功后,将新编译的dtb拷贝到tftpboot目录下,启动开发板。

5.cd /proc/device-tree 中可以看到刚创建的子节点gpioled

gpio子节点

6.构建字符设备驱动框架、创建类

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>

#define GPIOLED_CNT 1<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拼个世界给自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值