1.概念介绍 Pinctrl子系统是驱动分离分层思想下的产物,硬件属性方面放在设备树dts中,其中关于设备所使用的的管脚配置,可以集中使用pinctrl。...其中设备树pinctrl节点添加可参考文档 kernel-4.14/Documentation/devicetree /bindings/pinctrl/pinctrl-mt65xx.txt 其中涉及到...先将GPIO85和GPIO18复用为GPIO功能,然后管脚每个状态对应一个pinctrl-num。...2.2 查找pinctrl节点 (2)从节点中查找设备device结构体 of_find_device_by_node 获取pinctrl句柄,参数为此设备的device结构体。...devm_pinctrl_get ? 2.3 获取pinctrl句柄 (3)获取要使用的pin对应的每一种状态pin_state。
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...export ARCH=arm export CROSS_COMPILE=arm-buildroot-linux-gnueabihf- export PATH=$PATH:/home/book/100ask_stm32mp157..._pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 2....IMX6ULL export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export PATH=$PATH:/home/book/100ask_imx6ull-sdk.../ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin 4.2 编译、替换设备树 1.
主要参考文档是:内核Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt 这会涉及2个对象:pin controller、client...Pinctrl系统的客户,那就是使用Pinctrl系统的设备,使用引脚的设备。它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚。...16.1.3 示例 16.1.4 代码中怎么引用pinctrl 这是透明的,我们的驱动基本不用管。当设备切换状态时,对应的pinctrl就会被调用。...非要自己调用,也有函数: devm_pinctrl_get_select_default(struct device *dev); // 使用"default"状态的引脚 pinctrl_get_select...(struct device *dev, const char *name); // 根据name选择某种状态的引脚 pinctrl_put(struct pinctrl *p); // 不再使用,
工具 分析源码可以在线查看 Linux 内核源码,在线网址跳转函数和查找结构体也很方便: https://elixir.bootlin.com/linux/latest/source 对嵌入式工程师来讲...,较少谈及设计模式、重构等,因为我们受限于两个方面:硬件、系统(Linux、Android)。...在 Linux 内核源码中,pinctrl 子系统的代码大都在 kernel/drivers/pinctrl/...,不同平台有不同的文件夹。...module_init,只是 arch_initcall 会先调用,具体我在这边写过: Linux 驱动挂载顺序分析 我们从下往上看,可以看到最后调用的是 imx6ul_pinctrl_probe...pinctrl_register probe 函数后面的调用中,最重要的是调用 pinctrl_register 函数,此函数用于向 Linux 内核注册一个 PIN 控制器,,此函数原型如下: struct
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 Pinctrl子系统视频介绍 参考资料: Linux 5.x内核文档 Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt...Linux 4.x内核文档 Documentation\pinctrl.txt Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt...Pinctrl作用 Pinctrl:Pin Controller,顾名思义,就是用来控制引脚的: 引脚枚举与命名(Enumerating and naming) 引脚复用(Multiplexing):...对于一般的驱动工程师,只需要知道“怎么使用pinctrl”即可。 2.
Linux下针对引脚有2个重要的子系统:GPIO、Pinctrl。 1.Pinctrl子系统重要概念 1.1 引入 无论是哪种芯片,都有类似下图的结构: ?...驱动程序中要包含头文件, #include // descriptor-based 或 #include // legacy...比如在Linux开发过程中,先申请了GPIO,再申请内存;如果内存申请失败,那么在返回之前就需要先释放GPIO资源。...使用GIT命令载后,源码leddrv.c位于这个目录下: 01_all_series_quickstart\ 04_快速入门_正式开始\ 02_嵌入式Linux驱动开发基础知识\source\ 05_gpio_and_pinctrl...我们也把它上传到GIT去了,使用GIT命令载后,在这个目录下: 01_all_series_quickstart\ 04_快速入门_正式开始\ 02_嵌入式Linux驱动开发基础知识\source\ 05
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 Pinctrl子系统主要数据结构 参考资料: Linux 5.x内核 Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt....c Linux 4.x内核文档 Documentation\pinctrl.txt Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt...使用pinctrl_desc注册得到pinctrl_dev 调用devm_pinctrl_register或pinctrl_register,就可以根据pinctrl_desc构造出pinctrl_dev...来处理设备树的pinctrl节点信息,得到一系列的pinctrl_map 这些pinctrl_map放在pinctrl.dt_maps链表中 每个pinctrl_map都被转换为pinctrl_setting
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 编写虚拟的Pinctrl驱动程序 参考资料: 1....):比如用作GPIO、I2C或其他功能 引脚配置(Configuration):比如上拉、下拉、open drain、驱动强度等 Pinctrl驱动程序的核心是构造一个pinctrl_desc结构体:...编写Pinctrl驱动程序 5.1 核心:pinctrl_desc 分配pinctrl_desc结构体 设置pinctrl_desc结构体 注册pinctrl_desc结构体 5.2 辅助函数 include.../linux/of.h for_each_child_of_node of_get_child_count of_find_property of_property_read_u32
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 调试虚拟的Pinctrl驱动程序 参考资料: 1...._pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 2..../ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin 1.2 编译、替换设备树 1....Pinctrl调试信息 开发板的/sys/kernel/debug/pinctrl/目录下,每一个pin controller都有一个目录,比如virtual_pincontroller。
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 client端使用pinctrl过程的情景分析_基于IMX6ULL 参考资料: Linux 5.x内核 Documentation\devicetree\bindings...\stm32\pinctrl-stm32.c Linux 4.x内核 Documentation\pinctrl.txt Documentation\devicetree\bindings\pinctrl...来处理设备树的pinctrl节点信息,得到一系列的pinctrl_map 这些pinctrl_map放在pinctrl.dt_maps链表中 每个pinctrl_map都被转换为pinctrl_setting...pinctrl_map: 转换为多少个pinctrl_map,完全由具体的驱动决定 每个pinctrl_map,又被转换为一个pinctrl_setting 举例,设备节点里有:pinctrl-0 =
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态; sysfs文件系统的建立可以参照下面的博客...:http://www.cnblogs.com/linhaostudy/p/8377895.html 一、GPIO的调试方法: 在Linux下,通过sysfs,获取gpio状态,也可以操作gpio。...子系统设备树: Pin Control Subsystem是Linux内核抽象出的一套用于控制硬件引脚的一套子系统。...linux内核中的GPIO系统之(2):pin control subsystem Linux内核中的GPIO系统之(3):pin controller driver代码分析 linux内核中的GPIO...系统之(4):pinctrl驱动的理解和总结 linux内核中的GPIO系统之(5):gpio subsysem和pinctrl subsystem之间的耦合 DTS代码: 1 device_node
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 GPIO子系统与Pinctrl子系统的交互 参考资料: Linux 5.x内核文档 Linux-5.4\Documentation\driver-api Linux-5.4...\Documentation\devicetree\bindings\gpio\gpio.txt Linux-5.4\drivers\gpio\gpio-74x164.c Linux 4.x内核文档...Linux-4.9.88\Documentation\gpio Linux-4.9.88\Documentation\devicetree\bindings\gpio\gpio.txt Linux-...GPIO和Pinctrl的映射关系 2.1 示例 从上图可知: 左边的Pinctrl支持8个引脚,在Pinctrl的内部编号为0~7 图中有2个GPIO控制器 GPIO0内部引脚编号为03
1.2 适用范围 表 1-1: 适用产品列表 内核版本 驱动文件 Linux-4.9 及以上 pinctrl-sunxi.c 1.3 相关人员 本文档适用于所有需要在 Linux 内核 sunxi...Pinctrl framework:Linux 提供的 pinctrl 驱动框架。 Pinctrl sunxi driver:sunxi 平台需要实现的驱动。...| |-- pinctrl-sun*.c | `-- pinctrl-sun*-r.c `-- include `-- linux `-- pinctrl |-- consumer.h |-- devinfo.h...* 文件中 (Linux5.4 直接放在 sun.dtsi 中),配置了该 SoC 的 pinctrl 控制器的通用配置信息,一般不建议修改,有 pinctrl 驱动维护者维护。...linux-4.9 上面 pinctrl 中一些模块使用 board.dts 的简单配置如下: pio: pinctrl@0300b000 { input-debounce = <0 0 0 0
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 Pincontroller构造过程情景分析_基于IMX6ULL 参考资料: Linux 4.x内核文档 Documentation\pinctrl.txt Documentation.../dts/100ask_imx6ull-14x14.dts drivers\pinctrl\freescale\pinctrl-imx6ul.c drivers\pinctrl\freescale\pinctrl-imx.c...驱动代码执行流程 驱动程序位置: drivers\pinctrl\freescale\pinctrl-imx6ul.c drivers\pinctrl\freescale\pinctrl-imx.c 调用过程...: imx6ul_pinctrl_probe imx_pinctrl_probe(pdev, pinctrl_info); imx_pinctrl_desc->name = dev_name
gpio.c #include #include #include #include #include #include static int __init mypinctrl_init(void) { int gpionum...3、pinctrl_select_state 在 Linux 中,加 devm_ 开头的函数,代表这个函数支持资源管理。...#include #include #include #include #include #include #include static
= "default"; pinctrl-0 = ; key-gpio = ; // 低电平有效...pinctrl-0 = ; imx6ul-evk { `````省略````` pinctrl_key: keygrp {...编写按键驱动程序 key.c #include #include #include #include #include #include #include #include... #include #include #include #include
drivers/input/touchscreen/goodix.c Linux 4.x内核 Documentation\devicetree\bindings\input\touchscreen...-14x14.dts STM32MP157:Linux-5.4/arch/arm/boot/dts/stm32mp15xx-100ask.dtsi 1....= "default"; pinctrl-0 = ; /*pinctrl-1 = ;*/ /* pinctrl-names = "default", "int-output-low", "int-output-high", "int-input"; pinctrl...-0 = ; pinctrl-1 = ; pinctrl-2 = ;
2、嵌入式 Linux 平台 先总结一句:不管是单片机还是高端 ARM 平台,最底层都是寄存器,硬件之上就是寄存器,任何封装形式到最底层就是操作寄存器。...对于上了 Linux 系统的平台,我们有其他方法,让它可以像单片机一样简单的操作 IO 口,这得益于各路 Linux 大神对系统底层的封装。...在 Linux 中有 pinctrl 和 gpio 子系统,它们提供了 API 接口给你使用,让你方便的操控 GPIO 口。...Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对 GPIO 的配置推出了 gpio 子系统。...(具体原因看下面这篇文章) Linux 驱动挂载顺序分析 pinctrl 和 gpio 子系统软件框架如下: pinctrl gpio 可以看出其实两者软件框架一样的,主要是 HW Abstract
.dts STM32MP157:Linux-5.4/arch/arm/boot/dts/stm32mp15xx-100ask.dtsi QEMU:linux-4.9.88/arch/arm/boot/dts...debounce-interval: 消除抖动的间隔,单位:ms,默认是5ms 2.2 100ASK_IMX6ULL gpio-keys { compatible = "gpio-keys"; pinctrl-names...interrupts = ; }; }; 2.4 QEMU gpio-keys@0 { compatible = "gpio-keys"; pinctrl-names...= "default"; pinctrl-0 = ; status = "okay"; Key0{ label = "Key...compatible = "gpio-keys"; pinctrl-names = "default"; pinctrl-0 = ;
uart_debug_tx = port:PB06 uart_debug_rx = port:PB07 修改设备树(Linux...= "default", "sleep"; pinctrl-0 = ; pinctrl-1 = ; status = "okay";...}; &uart3 { pinctrl-names = "default", "sleep"; pinctrl-0 = ; pinctrl-1 = <&uart3...= "default", "sleep"; pinctrl-0 = ; pinctrl-1 = ; status = "disabled..."; # 关闭UART0 }; &uart3 { pinctrl-names = "default", "sleep"; pinctrl
领取专属 10元无门槛券
手把手带您无忧上云