GPIOs

Macros

GPIO_OFFSET
0x200000

This macro defines the offset at which the GPIO registers are located from the peripheral base.

GPIO_SIZE
0xB0

This macro holds the size of the GPIO registers which needs to be mapped.

Registers

volatile uint32_t *gpio_base_ptr

This pointer points, when mapped, to the base of the GPIO registers.

struct gpio_register_map

This struct maps the registers of the GPIOs. The names of the struct members correspond to the registers from the Datasheet:

struct gpio_register_map {
        uint32_t FSEL[6];
        uint32_t: 32;
        uint32_t SET[2];
        uint32_t: 32;
        uint32_t CLR[2];
        uint32_t: 32;
        uint32_t LEV[2];
        uint32_t: 32;
        uint32_t EDS[2];
        uint32_t: 32;
        uint32_t REN[2];
        uint32_t: 32;
        uint32_t FEN[2];
        uint32_t: 32;
        uint32_t HEN[2];
        uint32_t: 32;
        uint32_t LEN[2];
        uint32_t: 32;
        uint32_t AREN[2];
        uint32_t: 32;
        uint32_t AFEN[2];
        uint32_t: 32;
        uint32_t PUD;
        uint32_t PUDCLK[2];
};
GP
#define GP ((volatile struct gpio_register_map *)gpio_base_ptr)

By using this macro, the registers of the GPIOs can be accessed like this GP->SET[0].

Enums

pin_functions_t

This enum holds the values for the various pin functions:

typedef enum {
        INPUT, OUTPUT, ALT0, ALT1, ALT2, ALT3, ALT4, ALT5
} pin_functions_t;
pud_t

This enum holds the values for the states of the pullups / -downs:

typedef enum {
        PUD_DISABLE, PUD_DOWN, PUD_UP
} pud_t;

Functions

uint32_t * gpio_map(void)

This function maps the GPIO registers. It calls peripheral_map() with the values GPIO_OFFSET and GPIO_SIZE.

void gpio_unmap(void)

This function unmaps the GPIOs.

void gpio_func(uint32_t pin, pin_functions_t function)

This function sets the pin pin to the pin function function.

void gpio_set(uint32_t pin)

Set the pin pin.

void gpio_clr(uint32_t pin)

Clear the pin pin.

uint32_t gpio_tst(uint32_t pin)

Test the pin pin. This function returns 0 or false when the pin is low and non-zero if the pin is high.

void gpio_pud(uint32_t pin, pud_t val)

Use the pullup / -down functionality val on the pin pin.

void gpio_inp(uint32_t pin)

Make pin pin an input.

void gpio_out(uint32_t pin)

Make pin pin an output.

void gpio_clear_pud(void)

This function clears all pullup / -downs. This function is called in gpio_map() and gpio_unmap() because the Raspberry Pi does not clear its pullup / -downs, even after power down.