使用 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:当您的 GPIO 线路可以响应按键生成中断时,使用 drivers/input/keyboard/gpio_keys.c。还支持防抖动。
gpio-keys-polled:当您的 GPIO 线路无法生成中断时,使用 drivers/input/keyboard/gpio_keys_polled.c,因此需要由定时器定期轮询。
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 线路以及 Linux 高分辨率定时器可以实现的范围内产生 PWM 波形。
extcon-gpio:当您需要读取外部连接器的状态时,例如音频驱动程序的耳机线路或 HDMI 连接器,则使用 drivers/extcon/extcon-gpio.c。它将提供比 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 用于通过敲击(位操作)两个 GPIO 线路来驱动 I2C 总线(两条线,SDA 和 SCL 线路)。它将像任何其他 I2C 总线一样出现在系统中,并使得可以将 I2C 设备驱动程序连接到总线上,就像任何其他 I2C 总线驱动程序一样。
spi_gpio:drivers/spi/spi-gpio.c 用于使用 GPIO 敲击(位操作)来驱动 SPI 总线(可变数量的线路,至少是 SCK,以及可选的 MISO、MOSI 和片选线路)。它将像系统上的任何其他 SPI 总线一样出现,并使得可以将 SPI 设备驱动程序连接到总线上,就像任何其他 SPI 总线驱动程序一样。例如,任何 MMC/SD 卡都可以通过使用 MMC/SD 卡子系统的 mmc_spi 主机连接到此 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 来定期“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 用于通过位操作两个 GPIO 线路来驱动 PS/2 (IBM) serio 总线、数据线和时钟线。它将像系统上的任何其他 serio 总线一样出现,并使得可以连接例如键盘和其他基于 PS/2 协议的设备的驱动程序。
cec-gpio:drivers/media/platform/cec-gpio/ 用于仅使用 GPIO 与 CEC 消费电子控制总线进行交互。它用于与 HDMI 总线上的设备通信。
gpio-charger:如果需要进行电池充电,并且您只能依靠 GPIO 线路来检查 AC 充电器的存在或更复杂的任务(例如使用 GPIO 线路指示充电状态),则使用 drivers/power/supply/gpio-charger.c,此驱动程序提供该功能,并且还提供一种明确定义的方式来传递来自硬件描述(例如设备树)的充电参数。
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 通信;它们比您的用户空间代码更好地与内核框架集成。毋庸置疑,仅使用适当的内核驱动程序,特别是通过提供现成的组件,将简化并加快您的嵌入式黑客操作。