使用GPIO的子系统驱动程序

请注意,对于常见的GPIO任务,存在标准的内核驱动程序,它们将为该任务提供正确的内核和用户空间API/ABI,并且这些驱动程序可以很容易地使用诸如设备树或ACPI之类的硬件描述与其他内核子系统互连

  • leds-gpio: drivers/leds/leds-gpio.c 将处理连接到GPIO线路的LED,为您提供LED sysfs接口

  • ledtrig-gpio: drivers/leds/trigger/ledtrig-gpio.c 将提供一个LED触发器,即LED将响应于GPIO线路变为高电平或低电平而打开/关闭(并且该LED可能反过来使用如上所述的leds-gpio)。

  • gpio-keys: drivers/input/keyboard/gpio_keys.c 在您的GPIO线路可以响应按键生成中断时使用。 还支持去抖动。

  • gpio-keys-polled: drivers/input/keyboard/gpio_keys_polled.c 在您的GPIO线路无法生成中断时使用,因此需要通过计时器定期轮询它。

  • gpio_mouse: drivers/input/mouse/gpio_mouse.c 用于通过简单地使用GPIO而无需鼠标端口来提供最多三个按钮的鼠标。 您可以剪断鼠标电缆并将电线连接到GPIO线路,或者将鼠标连接器焊接到线路上,以获得更永久的解决方案。

  • gpio-beeper: drivers/input/misc/gpio-beeper.c 用于从连接到GPIO线路的外部扬声器提供哔哔声。 (如果蜂鸣声由开/关控制,对于实际的PWM波形,请参见下面的pwm-gpio。)

  • pwm-gpio: drivers/pwm/pwm-gpio.c 用于使用高分辨率计时器切换GPIO,从而在GPIO线路上产生PWM波形,以及Linux高分辨率计时器可以执行的操作。

  • extcon-gpio: drivers/extcon/extcon-gpio.c 在您需要读取外部连接器状态时使用,例如音频驱动程序的耳机线路或HDMI连接器。 它将提供比GPIO更好的用户空间sysfs接口。

  • restart-gpio: drivers/power/reset/gpio-restart.c 用于通过拉低GPIO线路来重启/重新启动系统,并将注册一个重启处理程序,以便用户空间可以发出正确的系统调用来重启系统。

  • poweroff-gpio: drivers/power/reset/gpio-poweroff.c 用于通过拉低GPIO线路来关闭系统电源,并将注册一个pm_power_off()回调,以便用户空间可以发出正确的系统调用来关闭系统电源。

  • gpio-gate-clock: drivers/clk/clk-gpio.c 用于控制使用GPIO的门控时钟(开/关),并与时钟子系统集成。

  • i2c-gpio: drivers/i2c/busses/i2c-gpio.c 用于通过锤击(位 banging)两条GPIO线路来驱动I2C总线(两条线,SDA和SCL线路)。 它将作为任何其他I2C总线出现在系统中,并使其可以像任何其他I2C总线驱动程序一样连接总线上I2C设备的驱动程序。

  • spi_gpio: drivers/spi/spi-gpio.c 用于使用GPIO锤击(位 banging)来驱动SPI总线(可变数量的线,至少SCK和可选的MISO,MOSI和芯片选择线)。 它将作为系统上的任何其他SPI总线出现,并使其可以像任何其他SPI总线驱动程序一样连接总线上SPI设备的驱动程序。 例如,然后可以使用MMC/SD卡子系统中的mmc_spi主机将任何MMC/SD卡连接到此SPI。

  • w1-gpio: drivers/w1/masters/w1-gpio.c 用于使用GPIO线路驱动单线总线,与W1子系统集成,并像任何其他W1设备一样处理总线上的设备。

  • gpio-fan: drivers/hwmon/gpio-fan.c 用于控制用于冷却系统的风扇,该风扇连接到GPIO线路(以及可选的GPIO报警线路),并提供所有正确的内核和sysfs接口,以使您的系统不会过热。

  • gpio-regulator: drivers/regulator/gpio-regulator.c 用于通过拉低GPIO线路来控制提供特定电压的稳压器,与稳压器子系统集成,并为您提供所有正确的接口。

  • gpio-wdt: drivers/watchdog/gpio_wdt.c 用于提供一个看门狗定时器,该定时器将通过从1到0到1切换GPIO线路来定期“ping”连接到GPIO线路的硬件。 如果该硬件未定期收到其“ping”,它将重置系统。

  • gpio-nand: drivers/mtd/nand/raw/gpio.c 用于将NAND闪存芯片连接到一组简单的GPIO线路:RDY,NCE,ALE,CLE,NWP。 它与NAND闪存MTD子系统交互,并提供芯片访问和分区解析,就像任何其他NAND驱动硬件一样。

  • ps2-gpio: drivers/input/serio/ps2-gpio.c 用于通过位 banging 两条 GPIO 线路来驱动 PS/2 (IBM) serio 总线、数据和时钟线。 它将作为任何其他 serio 总线出现在系统中,并使连接驱动程序(例如键盘和其他基于 PS/2 协议的设备)成为可能。

  • cec-gpio: drivers/media/platform/cec-gpio/ 用于仅使用 GPIO 与 CEC 消费电子控制总线交互。 它用于与 HDMI 总线上的设备通信。

  • gpio-charger: drivers/power/supply/gpio-charger.c 用于在您需要执行电池充电并且您唯一能做的就是检查交流充电器的存在或更复杂的任务,例如仅使用 GPIO 线路指示充电状态时,此驱动程序提供该功能,并且还提供了一种明确定义的方式来传递来自硬件描述(如设备树)的充电参数。

  • gpio-mux: drivers/mux/gpio.c 用于使用 n 个 GPIO 线路控制多路复用器,这样您可以通过激活不同的 GPIO 线路在 2^n 个不同的设备中进行多路复用。 通常,GPIO 位于 SoC 上,而设备是一些 SoC 外部实体,例如 PCB 上可以选择性启用的不同组件。

除此之外,MMC/SD等子系统中有特殊的GPIO驱动程序,用于读取卡检测和写保护GPIO线路,TTY串行子系统中也使用两个GPIO线路来模拟MCTRL(调制解调器控制)信号CTS/RTS。 MTD NOR闪存也有额外的GPIO线路附加组件,尽管地址总线通常直接连接到闪存。

请使用这些方法,而不是直接从用户空间与GPIO通信;它们与内核框架的集成比您的用户空间代码更好。 无需赘述,仅使用适当的内核驱动程序将通过提供现成的组件来简化和加速您的嵌入式黑客行为。