| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 1 | ============================ | 
|  | 2 | Subsystem drivers using GPIO | 
|  | 3 | ============================ | 
|  | 4 |  | 
|  | 5 | Note that standard kernel drivers exist for common GPIO tasks and will provide | 
|  | 6 | the right in-kernel and userspace APIs/ABIs for the job, and that these | 
|  | 7 | drivers can quite easily interconnect with other kernel subsystems using | 
|  | 8 | hardware descriptions such as device tree or ACPI: | 
|  | 9 |  | 
|  | 10 | - leds-gpio: drivers/leds/leds-gpio.c will handle LEDs connected to  GPIO | 
|  | 11 | lines, giving you the LED sysfs interface | 
|  | 12 |  | 
|  | 13 | - ledtrig-gpio: drivers/leds/trigger/ledtrig-gpio.c will provide a LED trigger, | 
|  | 14 | i.e. a LED will turn on/off in response to a GPIO line going high or low | 
|  | 15 | (and that LED may in turn use the leds-gpio as per above). | 
|  | 16 |  | 
|  | 17 | - gpio-keys: drivers/input/keyboard/gpio_keys.c is used when your GPIO line | 
|  | 18 | can generate interrupts in response to a key press. Also supports debounce. | 
|  | 19 |  | 
|  | 20 | - gpio-keys-polled: drivers/input/keyboard/gpio_keys_polled.c is used when your | 
|  | 21 | GPIO line cannot generate interrupts, so it needs to be periodically polled | 
|  | 22 | by a timer. | 
|  | 23 |  | 
|  | 24 | - gpio_mouse: drivers/input/mouse/gpio_mouse.c is used to provide a mouse with | 
|  | 25 | up to three buttons by simply using GPIOs and no mouse port. You can cut the | 
|  | 26 | mouse cable and connect the wires to GPIO lines or solder a mouse connector | 
|  | 27 | to the lines for a more permanent solution of this type. | 
|  | 28 |  | 
|  | 29 | - gpio-beeper: drivers/input/misc/gpio-beeper.c is used to provide a beep from | 
|  | 30 | an external speaker connected to a GPIO line. | 
|  | 31 |  | 
|  | 32 | - extcon-gpio: drivers/extcon/extcon-gpio.c is used when you need to read an | 
|  | 33 | external connector status, such as a headset line for an audio driver or an | 
|  | 34 | HDMI connector. It will provide a better userspace sysfs interface than GPIO. | 
|  | 35 |  | 
|  | 36 | - restart-gpio: drivers/power/reset/gpio-restart.c is used to restart/reboot | 
|  | 37 | the system by pulling a GPIO line and will register a restart handler so | 
|  | 38 | userspace can issue the right system call to restart the system. | 
|  | 39 |  | 
|  | 40 | - poweroff-gpio: drivers/power/reset/gpio-poweroff.c is used to power the | 
|  | 41 | system down by pulling a GPIO line and will register a pm_power_off() | 
|  | 42 | callback so that userspace can issue the right system call to power down the | 
|  | 43 | system. | 
|  | 44 |  | 
|  | 45 | - gpio-gate-clock: drivers/clk/clk-gpio.c is used to control a gated clock | 
|  | 46 | (off/on) that uses a GPIO, and integrated with the clock subsystem. | 
|  | 47 |  | 
|  | 48 | - i2c-gpio: drivers/i2c/busses/i2c-gpio.c is used to drive an I2C bus | 
|  | 49 | (two wires, SDA and SCL lines) by hammering (bitbang) two GPIO lines. It will | 
|  | 50 | appear as any other I2C bus to the system and makes it possible to connect | 
|  | 51 | drivers for the I2C devices on the bus like any other I2C bus driver. | 
|  | 52 |  | 
|  | 53 | - spi_gpio: drivers/spi/spi-gpio.c is used to drive an SPI bus (variable number | 
|  | 54 | of wires, at least SCK and optionally MISO, MOSI and chip select lines) using | 
|  | 55 | GPIO hammering (bitbang). It will appear as any other SPI bus on the system | 
|  | 56 | and makes it possible to connect drivers for SPI devices on the bus like | 
|  | 57 | any other SPI bus driver. For example any MMC/SD card can then be connected | 
|  | 58 | to this SPI by using the mmc_spi host from the MMC/SD card subsystem. | 
|  | 59 |  | 
|  | 60 | - w1-gpio: drivers/w1/masters/w1-gpio.c is used to drive a one-wire bus using | 
|  | 61 | a GPIO line, integrating with the W1 subsystem and handling devices on | 
|  | 62 | the bus like any other W1 device. | 
|  | 63 |  | 
|  | 64 | - gpio-fan: drivers/hwmon/gpio-fan.c is used to control a fan for cooling the | 
|  | 65 | system, connected to a GPIO line (and optionally a GPIO alarm line), | 
|  | 66 | presenting all the right in-kernel and sysfs interfaces to make your system | 
|  | 67 | not overheat. | 
|  | 68 |  | 
|  | 69 | - gpio-regulator: drivers/regulator/gpio-regulator.c is used to control a | 
|  | 70 | regulator providing a certain voltage by pulling a GPIO line, integrating | 
|  | 71 | with the regulator subsystem and giving you all the right interfaces. | 
|  | 72 |  | 
|  | 73 | - gpio-wdt: drivers/watchdog/gpio_wdt.c is used to provide a watchdog timer | 
|  | 74 | that will periodically "ping" a hardware connected to a GPIO line by toggling | 
|  | 75 | it from 1-to-0-to-1. If that hardware does not receive its "ping" | 
|  | 76 | periodically, it will reset the system. | 
|  | 77 |  | 
|  | 78 | - gpio-nand: drivers/mtd/nand/raw/gpio.c is used to connect a NAND flash chip | 
|  | 79 | to a set of simple GPIO lines: RDY, NCE, ALE, CLE, NWP. It interacts with the | 
|  | 80 | NAND flash MTD subsystem and provides chip access and partition parsing like | 
|  | 81 | any other NAND driving hardware. | 
|  | 82 |  | 
|  | 83 | - ps2-gpio: drivers/input/serio/ps2-gpio.c is used to drive a PS/2 (IBM) serio | 
|  | 84 | bus, data and clock line, by bit banging two GPIO lines. It will appear as | 
|  | 85 | any other serio bus to the system and makes it possible to connect drivers | 
|  | 86 | for e.g. keyboards and other PS/2 protocol based devices. | 
|  | 87 |  | 
|  | 88 | - cec-gpio: drivers/media/platform/cec-gpio/ is used to interact with a CEC | 
|  | 89 | Consumer Electronics Control bus using only GPIO. It is used to communicate | 
|  | 90 | with devices on the HDMI bus. | 
|  | 91 |  | 
|  | 92 | Apart from this there are special GPIO drivers in subsystems like MMC/SD to | 
|  | 93 | read card detect and write protect GPIO lines, and in the TTY serial subsystem | 
|  | 94 | to emulate MCTRL (modem control) signals CTS/RTS by using two GPIO lines. The | 
|  | 95 | MTD NOR flash has add-ons for extra GPIO lines too, though the address bus is | 
|  | 96 | usually connected directly to the flash. | 
|  | 97 |  | 
|  | 98 | Use those instead of talking directly to the GPIOs using sysfs; they integrate | 
|  | 99 | with kernel frameworks better than your userspace code could. Needless to say, | 
|  | 100 | just using the appropriate kernel drivers will simplify and speed up your | 
|  | 101 | embedded hacking in particular by providing ready-made components. |