0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从Linux平台来研究GPIO软件框架

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:Jasonangel 2023-09-28 16:05 次阅读

嵌入式 Linux 平台

先总结一句:不管是单片机还是高端 ARM 平台,最底层都是寄存器,硬件之上就是寄存器,任何封装形式到最底层就是操作寄存器。

对于上了 Linux 系统的平台,我们有其他方法,让它可以像单片机一样简单的操作 IO 口,这得益于各路 Linux 大神对系统底层的封装。

在 Linux 中有 pinctrl 和 gpio 子系统,它们提供了 API 接口给你使用,让你方便的操控 GPIO 口。

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

上面这句话很重要,我详细解释一下:这里是将 pin 脚和控制 IO 口输入输出分离。

pinctrl 子系统管理 200 个 IO 口的上拉下拉电阻电流驱动能力,是硬件底层的存在。如果 pinctrl 将某个 pin 脚初始化成了普通GPIO 而不是 IIC 或者 SPI,那么接下来我们就可以使用 gpio 子系统的 API 去操作 IO 口输出高低电平。

传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置 方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:

①、获取设备树中 pin 信息

②、根据获取到的 pin 信息来设置 pin 的复用功能

③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。

对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成,pinctrl子系统源码目录为 drivers/pinctrl。

注意,pinctrl 子系统也是一个标准的 platform 驱动,当设备和驱动匹配的时候,probe 函数会执行,只是 pinctrl 子系统采用的arch_initcall 去声明,而不是module_init(device_initcall),所以在系统起来的时候它会先加载。(具体原因看下面这篇文章)

Linux 驱动挂载顺序分析

图片

gpio

可以看出其实两者软件框架一样的,主要是 HW Abstract layer 具体实现不一样。

你以为两者是分离的,实际上不是的,gpio 子系统是基于 pinctrl 子系统的,gpio 的 API 接口的实现很多都是基于 pinctrl子系统的函数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5096

    文章

    19199

    浏览量

    308290
  • Linux
    +关注

    关注

    87

    文章

    11354

    浏览量

    210660
  • 软件
    +关注

    关注

    69

    文章

    5034

    浏览量

    88184
  • GPIO
    +关注

    关注

    16

    文章

    1217

    浏览量

    52485
  • 系统
    +关注

    关注

    1

    文章

    1020

    浏览量

    21447
收藏 人收藏

    评论

    相关推荐

    一文搞懂Linux pinctrl/gpio子系统

    注: 所有文章基于linux-3.13以上,本系列主要介绍 GPIO的一些基本知识,驱动操作GPIO的接口,应用层通过sysfs操作GPIO的接口,
    发表于 06-09 09:52 2869次阅读

    需求的角度去理解Linux系列:总线、设备和驱动

    %的开发工作量,而你只需要完成20%的开发工作量。Linux平台上的各个子系统,如设备驱动模型、input子系统、I2C总线、frame buffer驱动等等都属于软件框架,它是针对特
    发表于 03-11 14:45

    Windows平台迁移到Linux平台怎么实现?

    我们试图Windows平台迁移到Linux平台。所以我们正在尝试为先前的块设计重新生成位文件。但是我们遇到了异常错误。是否有任何过程编译
    发表于 08-28 12:38

    Linux系统的功耗研究

    Linux正在嵌入式领域发挥着越来越重要的作用。对于嵌入式设备尤其是移动设备来说,功耗是系统的重要指标,系统设计的重要目标之一就是要尽可能地降低功耗。现在,对功耗的研究主要集中在硬件解决方案上,而软件
    发表于 11-04 06:45

    Linux 驱动 = 软件框架 + 硬件操作

      Linux 驱动 = 软件框架 + 硬件操作  驱动程序依赖于 Linux 内核,你为开发板 A 开发驱动,那就先在 Ubuntu 中得到、 配置、编译开发板 A 所使用的
    发表于 12-17 07:11

    基于Linux的XFRM框架下IPSec VPN的研究

    针对现有 IPSec VPN 系统在效率和可靠性方面存在的问题,提出并改进了一种基于Linux最新内核平台的 IPSec VPN网关系统。给出Linux 的XFRM 框架结构和函数调用
    发表于 04-13 09:31 31次下载

    基于Linux的实时平台研究

    主要介绍了一个基于Linux 操作系统的实时平台的技术研究和实现方法。所研究的实时平台以X86 体系PC 为硬件环境,
    发表于 06-01 10:31 11次下载

    嵌入式Linux软件测试框架研究

    嵌入式Linux 软件是最难测试的一类软件。在测试过程中通过使用有效的测试框架,可以显著提高测试效率,最终确保软件质量。通过对嵌入式
    发表于 06-07 17:14 29次下载

    第8章 Linux软件开发平台软件配置

    Linux软件开发平台软件配置 8.1 Linux 体系结构 8.2 Linux开发
    发表于 04-11 14:38 3次下载

    TI达芬奇软件框架技术的研究与改进

    TI达芬奇软件框架技术的研究与改进
    发表于 10-21 09:23 1次下载
    TI达芬奇<b class='flag-5'>软件</b><b class='flag-5'>框架</b>技术的<b class='flag-5'>研究</b>与改进

    如何在嵌入式Linux中使用GPIO

    了解如何在嵌入式Linux中使用GPIO,特别强调Zynq-7000系列。 我们介绍了基本的用户和内核空间GPIO使用情况,以及GPIOGPIO
    的头像 发表于 11-26 07:02 4134次阅读

    Linux DMA Engine框架的介绍

    此会话描述如何设备驱动程序在Linux中使用DMA。 这包括内存分配,缓存控制和DMA设备控制。 详细介绍了Linux DMA Engine框架
    的头像 发表于 11-23 06:29 6412次阅读

    嵌入式Linux驱动开发基础到框架

    一众嵌入式Linux驱动书中笔者最推崇宋宝华的《Linux设备驱动开发详解》,但他完全可以更进一步上升到驱动框架个例(比如USBwifi模块驱动)和应用层调用。有些书c语言基础谈起,
    发表于 11-01 16:58 14次下载
    嵌入式<b class='flag-5'>Linux</b>驱动开发<b class='flag-5'>从</b>基础到<b class='flag-5'>框架</b>

    Linux驱动分析之RTC框架

    Linux内核启动时,它会RTC中读取时间与日期,作为基准值。然后通过软件维护系统时间和日期。Linux系统中提供了RTC核心层,对于
    的头像 发表于 05-26 15:12 1087次阅读
    <b class='flag-5'>Linux</b>驱动分析之RTC<b class='flag-5'>框架</b>

    硬件软件角度理解Gadget框架

    2. 硬件软件角度理解 Gadget 框架 USB 传输的核心是 endpoint,使用 endpoint 可以收发数据。在 endpoint 之上,就可以模拟 USB 串口、USB 触碰屏
    的头像 发表于 07-13 11:32 1215次阅读
    <b class='flag-5'>从</b>硬件<b class='flag-5'>软件</b>角度理解Gadget<b class='flag-5'>框架</b>