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

配置 GPIO 使用

GPIO 引脚配置需要以下两项设置。这些设置定义了 GPIO 引脚状态,并使这些引脚可用于任何输入/输出活动。
  • 复用(Mux):复用设置需要从特定于 SoC 的 pinctrl 驱动中可用功能集里选择所映射的功能名称。有关 pinctrl 的更多信息,请参阅 Pinctrl 配置
  • 配置(Configuration):配置方面需要设置驱动强度(drive strength)和偏置(bias)属性。
以下示例展示了如何通过以下步骤用这两项设置定义 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(指定中断服务寄存器(ISR)和 IRQ 标志)将其作为中断注册到通用中断控制器(GIC)。

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

将任何具有 GP_CLK 备用功能的 GPIO 配置为时钟或脉宽调制(PWM)输出。
以下步骤适用于 QCS6490 SoC。
有关如何查找具有 GP_CLK 功能的 GPIO 的更多信息,请参阅引脚描述
  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_disable_unprepare() 之前先调用 clk_prepare_enable()
  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. 使用 gpiodetectgpioinfo 命令列出 GPIO 芯片和线路。以下示例展示了 GPIO 芯片信息:
    以下示例展示了 GPIO 线路:
  2. 使用 gpioset 命令设置 GPIO 值。例如,要设置 gpiochip4 上的 GPIO line 0,请执行以下操作:
  3. 使用 gpioget 命令读取 GPIO 值。例如,要读取 gpiochip4GPIO line 0 的值,请执行以下操作: