【Linux驱动开发】011 gpio子系统

这篇具有很好参考价值的文章主要介绍了【Linux驱动开发】011 gpio子系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

前面我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。 

 Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于 GPIO的配置推出了 gpio 子系统。

本节先讲解 gpio 子系统。 


二、gpio 子系统

1、gpio 子系统简介

上节讲解了 pinctrl 子系统,pinctrl 子系统重点是设置 PIN(有的 SOC 叫做 PAD)的复用和电气属性,如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统了。

gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,读取 GPIO 的值等

gpio 子系统的主要目的是:

方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API函数来操作 GPIO,Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程。

2、I.MX6ULL 的 gpio 子系统驱动 

<1> 设备树中的 gpio 信息

上节我们通过pinctrl 子系统,配置了 UART1_RTS_B 这个 PIN 复用为 GPIO1_IO19(SD卡CD信号检测引脚),并设置了电气属性:

pinctrl_hog_1: hoggrp-1 { 
    fsl,pins = < 
        MX6UL_PAD_UART1_RTS_B__GPIO1_IO19   0x17059 /* SD1 CD */ 
        ...... 
    >; 
}; 

要想设备的某个引脚使用 GPIO1_IO19,那么就需要在该设备对应的设备树节点中描述,在描述的同时会通过 gpio子系统配置 GPIO1_IO19。

// SD卡设备总节点
// usdhc1 节点需要描述 SD 卡所有的信息,因为驱动要使用
&usdhc1 {
    pinctrl-names = "default", "state_100mhz", "state_200mhz";
    pinctrl-0 = <&pinctrl_usdhc1>;
    pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
    pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
    cd-gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
    keep-power-in-suspend;
    enable-sdio-wakeup;
    vmmc-supply = <&reg_sd1_vmmc>;
    status = "okay";
};

<2> 设备节点中 pinctrl 信息详解

pinctrl-names 中保存了节点对应设备的不同工作状态,下面的pinctrl-0、1、2代表各个状态对应的pinctrl 配置集合,也就是说,如果设备处于default状态,会使用pinctrl-0的pinctrl 子系统配置,以此类推。但是上面为什么没有配置GPIO1_IO19 对应的pinctrl 子系统配置呢?pinctrl-0 应该是这样才对:

pinctrl-0 = < 
    &pinctrl_usdhc1
    &pinctrl_hog_1 // 上节的pinctrl配置
>;

如果没有对GPIO1_IO19 进行功能复用,该节点的引脚就无法使用GPIO功能,这是怎么回事呢?我们可以看iomuxc节点内容(上节),我们发现iomuxc节点已经将pinctrl 配置进行初始化调用(没必要在上面的usdhc1节点中,只是进行功能复用,在哪个节点中都一样),功能复用为GPIO。

【Linux驱动开发】011 gpio子系统

<3> 设备节点中 gpio 信息详解

usdhc1设备节点中下面的代码,用来配置该设备(SD卡)的CD引脚使用哪个IO。

cd-gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
  • “&gpio1”表示 CD 引脚所使用的 IO 属于 GPIO1 组;
  • “19” 表示 GPIO1 组的第 19 号 IO,通过这两个值 SD 卡驱动程序就知道 CD 引脚使用了 GPIO1_IO19这 GPIO;
  • “GPIO_ACTIVE_LOW” 表示低电平有效, “GPIO_ACTIVE_HIGH” 就表示高电平有效。 

根据上面这些信息,SD 卡驱动程序就可以使用 GPIO1_IO19 来检测 SD 卡的 CD 信号了,
打开 imx6ul.dtsi,在里面找到如下所示内容: 

gpio1: gpio@209c000 {
    compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
    reg = <0x0209c000 0x4000>;
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
                 <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
    gpio-ranges = <&iomuxc  0 23 10>, <&iomuxc 10 17 6>,
                  <&iomuxc 16 33 16>;
};
  • “gpio-controller”表示 gpio1 节点是个 GPIO 控制器。 
  • #gpio-cells 为 2,表示一共有两个 cell。第一个 cell 为 GPIO 编号,比如“&gpio1 3”就表示GPIO1_IO03。第二个 cell 表示 GPIO 极性 , 如果为0(GPIO_ACTIVE_HIGH) 的话表示高电平有效 , 如果为1(GPIO_ACTIVE_LOW)的话表示低电平有效。

<4> gpio 驱动程序详解

根据 dtsi 文件中 gpio1 节点(上方代码)的 compatible 属性描述了兼容性,在 Linux 内核中搜索“fsl,imx6ul-gpio”和“fsl,imx35-gpio”这两个字符串,可以查找 GPIO 驱动文件。可以得 GPIO 驱动也是个平台设备驱动,因此当设备树中的设备节点与驱动的 of_device_id 匹配以后 probe 函数就会执行,在这里就是 mxc_gpio_probe 函数。

3、设备树中添加 gpio 节点步骤(总结)

上节我们已经讲解了如何创建 test 设备的 pinctrl 节点。本节我们来学习一下如何创建 test 设备的 GPIO 节点。

👺 创建 test 设备节点

 在根节点“/”下创建 test 设备子节点:

test {
    /* 节点内容 */
};

👺 添加 pinctrl 信息 

上节我们创建了 pinctrl_test 节点,此节点描述了 test 设备所使用的 GPIO1_IO00 这个 PIN 的信息,我们要将这节点添加到 test 设备节点中:

test {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_test>;
    /* 其他节点内容 */
};

👺 添加 GPIO 属性信息 

我们最后需要在 test 节点中添加 GPIO 属性信息,表明 test 所使用的 GPIO 是哪个引脚: 文章来源地址https://www.toymoban.com/news/detail-434959.html

test {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_test>;
    gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
}

到了这里,关于【Linux驱动开发】011 gpio子系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(49)
  • 驱动开发作业3——GPIO子系统

    作业1:在内核模块中启用定时器,定时1s,让LED1以1s为周期实现流水灯  myled.c(驱动文件)    作业2:基于GPIO子系统完成LED灯驱动的注册,并利用应用程序测试  chrdevled.c(驱动文件) test.c(测试文件)

    2024年02月16日
    浏览(35)
  • [驱动开发]gpio子系统及中断实现led亮灭

    编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制发光二极管亮灭 2.按键1按下,led1电位反转;按键2按下,led2电位反转;按键3按下,led3电位反转   

    2024年02月14日
    浏览(75)
  • Linux驱动开发:SPI子系统

    MISO:主设备数据输入,从设备数据输出。 MOSI:主设备数据输出,从设备数据输入。 SCLK:时钟信号,由主设备产生。 CS:    从设备片选信号,由主设备控制。 CPOL(时钟极性) :   0:时钟起始位低电平      1:时钟起始为高电平   CPHA(时钟相位) :0:第一个时钟周期采样   1

    2024年02月06日
    浏览(48)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(75)
  • <Linux开发>驱动开发 -之-Linux INPUT 子系统

    <Linux开发>驱动开发 -之-Linux INPUT 子系统 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分) <Linux开发

    2024年02月09日
    浏览(48)
  • 【Linux驱动开发】010 pinctrl子系统

    上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于

    2024年02月14日
    浏览(43)
  • RK3568驱动指南|第十二篇 GPIO子系统-第128章 GPIO入门实验

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网

    2024年01月21日
    浏览(42)
  • 1.内核驱动中,驱动注册,阻塞IO,gpio子系统,中断处理的整体结合示例

    /*功能实现 在stm32开发板上实现功能            1.使用阻塞IO读取number变量的值,当number的值改变时打印number的值            2.注册KEY1按键的驱动和LED1的驱动以及对应的设备文件,            3.按键和指示灯设备信息放在同一个设备树的节点中            4.当KEY1按下时

    2024年02月15日
    浏览(35)
  • 【LED子系统深度剖析】一、开篇词|Linux驱动开发必读

    我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得!

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包