嵌入式驱动学习第七周——pinctrl子系统

前言

   pinctrl子系统用来控制每个端口的复用功能和电气属性,这篇博客来介绍一下pinctrl子系统。

   嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦!

pinctrl介绍

   pinctrl顾名思义就是控制pin引脚的。如下图所示,pinA可以通过IOMUX连接到GPIO,也可以连接到I2C,同时每个引脚的状态例如上拉、下拉、开漏开源等都可以交由pinctrl来控制。

在这里插入图片描述

   因此pinctrl的作用如下所示:

引脚枚举与命名
引脚复用:如GPIO、I2C或其他功能
引脚配置:如上拉、下拉、 开漏开源、驱动强度等

   一般Pinctrl驱动由芯片厂家的BSP工程师提供,一般的驱动工程师只需要在设备树里之名使用哪些引脚、复用为哪些功能、配置为哪些状态。

pinctrl 设备树

   pinctrl分为两部分,客户端和服务端:

客户端可以指定引脚描述、引脚组描述和配置描述,以满足其特定的功能和需求,不同厂商在客户端的编写格式相同
服务端是提供GPIO引脚配置的pinctrl设备树节点,描述GPIO引脚配置和使用规则的节点,定义了一组GPIO引脚的配置选项、引脚功能、电气特性等。

服务端

   打开设备树文件,我们以一个gpio为例:

pinctrl_led: ledgrp {
	fsl,pins = <
		MX6UL_PAD_GPIO1_IO03__GPIO1_IO03	0x10B0
	>;
};

   如上所示,我们配置GPIO1_IO3复用为GPIO功能,其他属性配置综合下来为:0x10B0,这个0x10b0就是之后会写入寄存器的值,实现复用为GPIO的功能。

客户端

   有了以上服务端的配置,接下来来看看如何使用,依旧是在设备树文件中,可以看到gpioled节点:

gpioled {
	#address-cells = <1>;
	#size-cells = <1>;
	compatible = "atkmini-gpioled";
	pinctrl-names = "default";				/* 用于pinctrl */
	pinctrl-0 = <&pinctrl_led>;				/* 用于pinctrl */
	led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
	status = "okay";
};

   上面的设备树中,pinctrl-names 代表状态名,pinctrl-0 代表“default”状态下对应的配置方案,即我们上一步设置的服务端的设备数代码,需要用&来引用。

   既然有pinctrl-0,那就肯定也有pinctrl-1等等,现在来看多个状态怎么配置

   假设现在服务端有pinctrl_led节点,pinctrl_led2 节点, pinctrl_led3 节点,然后我们配置的时候对应不同的速度,默认,100M,200M。

gpioled {
	...
	pinctrl-names = "default", "state_100mhz", "state_200mhz";				/* 用于pinctrl */
	pinctrl-0 = <&pinctrl_led>;				/* 用于pinctrl */
	pinctrl-1 = <&pinctrl_led2>;				/* 用于pinctrl */
	pinctrl-2 = <&pinctrl_led3>;				/* 用于pinctrl */
	...
};

   这样就可以根据不同的状态选择不同的引脚电气属性的配置,即state_100mhz时对应节点pinctrl_led2中的配置,state_200mhz时对应节点pinctrl_led3中的配置。

pinctrl添加

   由于服务端的写法不同的芯片也不同,因此如果要添加pinctrl,一般有三种方式:

第三方的辅助工具:如果芯片是stm32,可以选择用STM32CubeMX,如果芯片是IMX可以使用i.MX Pins Tool v6进行配置
厂家给出的例程
看源码写

参考资料

[1] 【正点原子】I.MX6U嵌入式Linux驱区动开发指南 第四十五章

[2] 【Linux驱动】pinctrl 和 gpio子系统(一)—— pinctrl 节点解析,引入gpio子系统

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入驱动是指针对特定硬件平台,开发设备驱动程序的技术。这些驱动程序可以控制各种外围设备,例如传感器、执行器、通信接口等。嵌入驱动程序通常需要直接操作硬件,因此需要深入了解硬件结构和编程技术。 以下是一个嵌入驱动学习实战的教程: 1. 首先,了解嵌入系统的基本概念和发展历史。可以学习嵌入系统的硬件、软件、通信接口、操作系统等方面的知识。 2. 掌握嵌入系统的基础编程语言,例如C语言和汇编语言。这些语言是嵌入系统开发的基础,需要熟练掌握。 3. 学习硬件体系结构和编程技术。这包括处理器架构、内存管理、中断处理、GPIO控制等方面的知识。 4. 学习嵌入系统的设备驱动程序开发技术。这包括字符设备驱动、块设备驱动、网络设备驱动等方面的知识。 5. 掌握常见的嵌入系统开发工具,例如编译器、调试器、仿真器等。这些工具可以帮助开发人员调试和测试驱动程序。 6. 进行实战练习,例如使用开发板开发一个简单的设备驱动程序。可以从最基础的GPIO控制开始,逐步扩展到其他设备驱动程序的开发。 7. 学习嵌入系统的调试技术,例如使用调试器进行单步调试和断点调试。这些技术可以帮助开发人员快速定位和解决问题。 总之,嵌入驱动学习需要系统化的知识结构和实战经验。通过不断学习和实践,可以逐步掌握嵌入驱动开发的技术和方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值