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