---
name: "gpioctl"
section: "8"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["freebsd", "openbsd"]
url: "https://new.carta.tech/gpioctl"
---

# gpioctl(8)

control GPIO devices

## NAME

**gpioctl** – control GPIO devices

## SYNOPSIS

**gpioctl** \[**-q**\] *device* *pin* \[**0** \| **1** \| **2** \| **on** \| **off** \| **toggle**\]

**gpioctl** \[**-q**\] *device* *pin* **set** \[*flags*\] \[*name*\]

**gpioctl** \[**-q**\] *device* *pin* **unset**

**gpioctl** \[**-q**\] *device* **attach** *device* *offset* *mask* \[*flag*\]

**gpioctl** \[**-q**\] *device* **detach** *device*

## DESCRIPTION

The **gpioctl** program allows manipulation of GPIO (General Purpose Input/Output) device pins. Such devices can be either part of the chipset or embedded CPU, or a separate chip. The usual way of using GPIO is to connect some simple devices such as LEDs and 1-wire thermal sensors to its pins.

Each GPIO device has an associated device file in the */dev* directory. *device* can be specified with or without the */dev* prefix. For example, */dev/gpio0* or *gpio0*.

GPIO pins can be either “read” or “written” with the values of logical 0 or 1. If only a *pin* number is specified on the command line, the pin state will be read from the GPIO controller and displayed. To write to a pin, a value must be specified after the *pin* number. Values can be either **0** or **1**. A value of **2** has a special meaning: it “toggles” the pin, i.e. changes its state to the opposite. Instead of the numerical values, the word **on**, **off**, or **toggle** can be used.

Only pins that have been configured at securelevel 0, typically during system startup, are accessible once the securelevel has been raised. Pins can be given symbolic names for easier use. Besides using individual pins, device drivers that use GPIO pins can be attached to a [gpio(4)](/gpio/4.md) device using the **gpioctl** command.

The following configuration *flags* are supported by the GPIO framework. Note that not all the flags can be supported by the particular GPIO controller.

- in

  input direction

- out

  output direction

- inout

  bi-directional

- od

  open-drain output

- pp

  push-pull output

- tri

  tri-state (output disabled)

- pu

  internal pull-up enabled

- pd

  internal pull-down enabled

- iin

  invert input

- iout

  invert output

When attaching an I2C device, if the *flag* argument is set to 1, the order of the SDA and SCL signals is reversed (see [gpioiic(4)](/gpioiic/4.md)).

When executed with only the [gpio(4)](/gpio/4.md) device name as argument, **gpioctl** reads information about the GPIO device and displays it. At securelevel 0 the number of physically available pins is displayed, at higher securelevels the number of configured (**set**) pins is displayed.

The options are as follows:

- **-q**

  Operate quietly i.e. nothing is printed to stdout.

## FILES

- /dev/gpio*u*

  GPIO device unit *u* file.

## EXAMPLES

Configure pin 20 to have push-pull output:

```
# gpioctl gpio0 20 set out pp
```

Write logical 1 to pin 20:

```
# gpioctl gpio0 20 1
```

Attach a [onewire(4)](/onewire/4.md) bus on a [gpioow(4)](/gpioow/4.md) device on pin 4:

```
# gpioctl gpio0 attach gpioow 4 0x01
```

Detach the gpioow0 device:

```
# gpioctl gpio0 detach gpioow0
```

Configure pin 5 as output and name it error\_led:

```
# gpioctl gpio0 5 set out error_led
```

Toggle the error\_led:

```
# gpioctl gpio0 error_led 2
```

## SEE ALSO

[gpio(4)](/gpio/4.md)

## HISTORY

The **gpioctl** command first appeared in OpenBSD 3.6.

## AUTHORS

The **gpioctl** program was written by Alexander Yurchenko ⟨*grange@openbsd.org*⟩. Device attachment was added by Marc Balmer ⟨*mbalmer@openbsd.org*⟩.
