1.\" $NetBSD: gpio.4,v 1.33 2018/05/19 13:59:06 thorpej Exp $ 2.\" $OpenBSD: gpio.4,v 1.5 2004/11/23 09:39:29 reyk Exp $ 3.\" 4.\" Copyright (c) 2004 Alexander Yurchenko <grange@openbsd.org> 5.\" 6.\" Permission to use, copy, modify, and distribute this software for any 7.\" purpose with or without fee is hereby granted, provided that the above 8.\" copyright notice and this permission notice appear in all copies. 9.\" 10.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17.\" 18.Dd February 20, 2018 19.Dt GPIO 4 20.Os 21.Sh NAME 22.Nm gpio 23.Nd General Purpose Input/Output 24.Sh SYNOPSIS 25.Cd "gpio* at elansc?" 26.Cd "gpio* at epgpio?" 27.Cd "gpio* at gcscpcib?" 28.Cd "gpio* at gpiosim?" 29.Cd "gpio* at gscpcib?" 30.Cd "gpio* at ichlpcib?" 31.Cd "gpio* at nsclpcsio?" 32.Cd "gpio* at soekrisgpio?" 33.Cd "gpio* at ppbus?" 34.Cd "gpio* at ptcd?" 35.Cd "gpio* at wbsio?" 36.Pp 37.In sys/types.h 38.In sys/gpio.h 39.In sys/ioctl.h 40.Sh DESCRIPTION 41The 42.Nm 43device attaches to the GPIO controller and provides a uniform 44programming interface to its pins. 45.Pp 46Each GPIO controller with an attached 47.Nm 48device has an associated device file under the 49.Pa /dev 50directory, e.g.\& 51.Pa /dev/gpio0 . 52Access from userland is performed through 53.Xr ioctl 2 54calls on these devices. 55.Pp 56Whether the layout of the GPIO device can be configured is subject to 57authorization by the 58.Xr kauth 9 59framework. 60.Pp 61If for example 62.Xr secmodel_securelevel 9 63is active, the layout of the GPIO device is defined at a securelevel 64less than 1, i.e. typically during system boot, and cannot be changed later. 65GPIO pins can be configured and given a symbolic name and device drivers 66that use GPIO pins can be attached to the 67.Nm 68device at a securelevel less than 1. 69All other pins will not be accessible once the runlevel has been raised. 70.Sh IOCTL INTERFACE 71The following structures and constants are defined in the 72.In sys/gpio.h 73header file: 74.Pp 75.Bl -tag -width XXXX -compact 76.It Dv GPIOINFO ( struct gpio_info ) 77Returns information about the GPIO controller in the 78.Fa gpio_info 79structure: 80.Bd -literal 81struct gpio_info { 82 int gpio_npins; /* total number of pins available */ 83}; 84.Ed 85.Pp 86.It Dv GPIOREAD ( struct gpio_req ) 87Returns the input pin value in the 88.Fa gpio_pin_op 89structure: 90.Bd -literal 91#define GPIOMAXNAME 64 92 93struct gpio_req { 94 char gp_name[GPIOMAXNAME]; /* pin name */ 95 int gp_pin; /* pin number */ 96 int gp_value; /* value */ 97}; 98.Ed 99.Pp 100The 101.Fa gp_name 102or 103.Fa gp_pin 104field must be set before calling. 105.Pp 106.It Dv GPIOWRITE ( struct gpio_req ) 107Writes the output value to the pin. 108The value set in the 109.Fa gp_value 110field must be either 111.Dv GPIO_PIN_LOW 112(logical 0) or 113.Dv GPIO_PIN_HIGH 114(logical 1). 115On return, the 116.Fa gp_value 117field contains the old pin state. 118.Pp 119.It Dv GPIOTOGGLE ( struct gpio_req ) 120Toggles the pin output value, i.e. changes it to the opposite. 121.Fa gp_value 122field is ignored and on return contains the old pin state. 123.Pp 124.It Dv GPIOSET ( struct gpio_set ) 125Changes pin configuration flags with the new ones provided in the 126.Fa gpio_set 127structure: 128.Bd -literal 129#define GPIOMAXNAME 64 130 131struct gpio_set { 132 char gp_name[GPIOMAXNAME]; /* pin name */ 133 int gp_pin; /* pin number */ 134 int gp_caps; /* pin capabilities (ro) */ 135 int gp_flags; /* pin configuration flags */ 136 char gp_name2[GPIOMAXNAME]; /* new name */ 137}; 138.Ed 139.Pp 140The 141.Fa gp_flags 142field is a combination of the following flags: 143.Pp 144.Bl -tag -width GPIO_PIN_OPENDRAIN -compact 145.It Dv GPIO_PIN_INPUT 146input direction 147.It Dv GPIO_PIN_OUTPUT 148output direction 149.It Dv GPIO_PIN_INOUT 150bi-directional 151.It Dv GPIO_PIN_OPENDRAIN 152open-drain output 153.It Dv GPIO_PIN_PUSHPULL 154push-pull output 155.It Dv GPIO_PIN_TRISTATE 156output disabled 157.It Dv GPIO_PIN_PULLUP 158internal pull-up enabled 159.It Dv GPIO_PIN_PULLDOWN 160internal pull-down enabled 161.It Dv GPIO_PIN_INVIN 162invert input 163.It Dv GPIO_PIN_INVOUT 164invert output 165.It Dv GPIO_PIN_PULSATE 166pulsate output 167.It Dv GPIO_PIN_ALT0 - 168.It Dv GPIO_PIN_ALT7 169select alternate pin function 0 to 7 170.El 171.Pp 172Note that the GPIO controller 173may not support all of these flags. 174On return the 175.Fa gp_caps 176field contains flags that are supported. 177If no flags are specified, the pin configuration stays unchanged. 178.Pp 179Only GPIO pins that have been set using 180.Ar GPIOSET 181will be accessible at securelevels greater than 0. 182.Pp 183.It Dv GPIOUNSET ( struct gpio_set ) 184Unset the specified pin, i.e. clear its name and make it unaccessible 185at securelevels greater than 0. 186.Pp 187.It Dv GPIOATTACH ( struct gpio_attach ) 188Attach the device described in the 189.Fa gpio_attach 190structure on this gpio device. 191.Bd -literal 192struct gpio_attach { 193 char ga_dvname[16]; /* device name */ 194 int ga_offset; /* pin number */ 195 uint32_t ga_mask; /* binary mask */ 196 uint32_t ga_flags; /* driver dependent */ 197}; 198.Ed 199.Pp 200The 201.Xr drvctl 8 202command can be used to detach a device from a gpio pin. 203.El 204.Sh FILES 205.Bl -tag -width "/dev/gpiou" -compact 206.It /dev/gpio Ns Ar u 207GPIO device unit 208.Ar u 209file. 210.El 211.Sh SEE ALSO 212.Xr ioctl 2 , 213.Xr drvctl 8 , 214.Xr gpioctl 8 215.Sh HISTORY 216The 217.Nm 218device first appeared in 219.Ox 3.6 220and 221.Nx 4.0 . 222.Sh AUTHORS 223.An -nosplit 224The 225.Nm 226driver was written by 227.An Alexander Yurchenko Aq Mt grange@openbsd.org . 228.Nm 229and was ported to 230.Nx 231by 232.An Jared D. McNeill Aq Mt jmcneill@NetBSD.org . 233Runtime device attachment was added by 234.An Marc Balmer Aq Mt marc@msys.ch . 235.Sh BUGS 236Event capabilities are not supported. 237