Skip to main content
Qualcomm® Linux 内核中的 Pinctrl 子系统管理和配置用于通用输入/输出(GPIO)、集成电路间(I2C)、串行外设接口(SPI)和其他硬件接口的引脚。 Pinctrl 配置,例如 引脚复用 和 引脚分组,在特定于设备的 pinctrl 驱动程序中管理,驱动程序列出所有可用的引脚和功能。 例如,QCS6490 对应的驱动程序位于 kernel-src/drivers/pinctrl/qcom/pinctrl-sc7280.c 文件中。 其他受支持目标的对应 pinctrl 驱动程序位于以下文件中:
  • QCS5430:kernel-src/drivers/pinctrl/qcom/pinctrl-sc7280.c
  • IQ-9075:kernel-src/drivers/pinctrl/qcom/pinctrl-sa8775p.c
  • IQ-8275:kernel-src/drivers/pinctrl/qcom/pinctrl-qcs8300.c
  • IQ-615:kernel-src/drivers/pinctrl/qcom/pinctrl-qcs615.c
有关其他 Qualcomm SoC pinctrl 驱动程序的更多信息,请参见 Pinctrl Drivers。
以下是 pinctrl 数据对象: 表:Pinctrl 数据对象
有关 QCS6490 相应 SoC pinctrl 绑定文档支持功能的更多信息,请参见 pinctrl binding documentation。
功能选择 对于 sc7280_functions 数据对象,一个或多个 GPIO 引脚用作一个功能,并且必须注册到设备树并传递给正确的设备节点。 系统启动期间,内核 pinctrl 基础架构会注册这些功能。 以下示例显示了内核配置基础架构:

配置 GPIO 用法

GPIO 引脚配置需要以下两个设置。这些设置定义了 GPIO 引脚状态,并使这些引脚可用于任何输入/输出活动。
  • 复用(Mux):mux 设置需要从 SoC 特定 pinctrl 驱动程序中一组可用功能中选择映射的功能名称。有关 pinctrl 的更多信息,请参见 Pinctrl configuration。
  • 配置:配置方面需要设置驱动强度和偏置属性。
以下示例展示了这两个设置如何使用以下过程定义 GPIO 引脚:
  1. 在设备树中定义引脚配置:
  2. 在设备树中配置设备节点或知识产权(IP)块:
  3. 驱动程序代码必须使用通用 API 在 pinctrl 配置中选择并注册其 GPIO 配置。以下是可用 API 的示例:
GPIO 作为中断请求 (IRQ) 要将 GPIO 设置为 IRQ,请使用以下过程:
  1. 在 DTS 文件中配置 GPIO 引脚:
    1. 设置 GPIO 引脚的属性和功能。
    2. 使用以下配置将引脚设置为使用 GPIO 55 用于 qup_se_l3() 功能:
  2. 为您要将 GPIO 设置为 IRQ 的设备节点创建一个与上述配置类似的 DT 条目。在以下示例中,GPIO55 配置为 IRQ,父级为顶层模式多路复用器(TLMM),电平设置为高。
  3. 驱动程序必须读取该值,并使用 request_irq API 将其注册为通用中断控制器(GIC)的中断,同时指定中断服务寄存器(ISR)和 IRQ 标志。

配置 GPIO 以生成时钟或脉冲宽度调制

将任何 GPIO 配置为 GP_CLK 作为备用功能,以获取时钟或脉冲宽度调制(PWM)。
以下过程适用于 QCS6490 SoC。
有关如何查找具有 GP_CLK 功能的 GPIO 的更多信息,请参见 Pin descriptions。
  1. 在 kernel/arch/arm64/boot/dts/qcom/sc7280.dtsi 文件中添加 GPIO 配置节点。
  1. 在 kernel/arch/arm64/boot/dts/qcom/sc7280.dtsi 文件中定义设备树节点。
  2. 在设备驱动程序中添加以下代码:
  3. 如果您不使用时钟或 PWM,请调用 clk_disable_unprepare() 以禁用时钟以节省功耗。注意 确保先调用 clk_prepare_enable() 然后再调用 clk_disable_unprepare()。
  4. 要生成所需的占空比,请在 clk_prepare_enable API 之后调用 clk_set_duty_cycle() API。

从用户空间配置 GPIO

使用用户空间的 libgpiod 库来控制 GPIO 以获得更好的性能。
  1. 要从主机计算机编译并推送 libgpiod 库,请执行以下操作:
    1. 要安装 Arm®(Arm64)工具链,请运行以下命令:
    2. 要从 libgpiod 1.6.4.tar.xz 下载并解压 libgpiod 源代码,请运行以下命令:
    3. 要为静态链接配置源代码,请运行以下命令:
    4. 要编译库,请运行以下命令:
      注意 编译会创建链接二进制文件。
    5. 要构建静态链接的二进制文件,请运行以下命令:
  2. 编译后要将二进制文件推送到您的设备,请运行 scp 命令。例如:
将二进制文件推送到您的设备后,在设备上运行以下命令与 GPIO 交互:
  1. 使用 gpiodetect 和 gpioinfo 命令列出 GPIO 芯片和线路。以下示例显示 GPIO 芯片信息:
    以下示例显示 GPIO 线路:
  2. 使用 gpioset 命令设置 GPIO 值。例如,要在 gpiochip4 上设置 GPIO line 0,请执行以下操作:
  3. 使用 gpioget 命令读取 GPIO 值。例如,要读取 gpiochip4 上 GPIO line 0 的值,请执行以下操作: