rpi_pico_sdk_sys/
gpio.rs

1use crate::*;
2
3// C macro definitions
4const sio_hw: *mut sio_hw_t = SIO_BASE as *mut sio_hw_t;
5// #define padsbank0_hw ((padsbank0_hw_t *)PADS_BANK0_BASE)
6const padsbank0_hw: *mut padsbank0_hw_t = PADS_BANK0_BASE as *mut padsbank0_hw_t;
7
8// NOTE: bindgen cannot handle static inline functions
9#[inline]
10pub unsafe fn gpio_pull_up(gpio: uint) {
11    gpio_set_pulls(gpio, true, false);
12}
13
14#[inline]
15pub unsafe fn gpio_is_pulled_up(gpio: uint) -> bool {
16    (*padsbank0_hw).io[gpio as usize] & PADS_BANK0_GPIO0_PUE_BITS != 0
17}
18#[inline]
19pub unsafe fn gpio_pull_down(gpio: uint) {
20    gpio_set_pulls(gpio, false, true);
21}
22#[inline]
23pub unsafe fn gpio_is_pulled_down(gpio: uint) -> bool {
24    (*padsbank0_hw).io[gpio as usize] & PADS_BANK0_GPIO0_PDE_BITS != 0
25}
26#[inline]
27pub unsafe fn gpio_disable_pulls(gpio: uint) {
28    gpio_set_pulls(gpio, false, false);
29}
30#[inline]
31pub unsafe fn gpio_get(gpio: uint) -> bool {
32    ((1 << gpio) & (*sio_hw).gpio_in) != 0
33}
34
35#[inline]
36pub unsafe fn gpio_get_all() -> uint32_t {
37    (*sio_hw).gpio_in
38}
39
40#[inline]
41pub unsafe fn gpio_set_mask(mask: uint32_t) {
42    (*sio_hw).gpio_set = mask;
43}
44
45#[inline]
46pub unsafe fn gpio_clr_mask(mask: uint32_t) {
47    (*sio_hw).gpio_clr = mask;
48}
49
50#[inline]
51pub unsafe fn gpio_xor_mask(mask: uint32_t) {
52    (*sio_hw).gpio_togl = mask;
53}
54
55/*
56#[inline]
57pub unsafe fn gpio_put_masked(mask: uint32_t, uint32_t value) {
58*/
59
60#[inline]
61pub unsafe fn gpio_put_all(value: uint32_t) {
62    (*sio_hw).gpio_out = value;
63}
64
65#[inline]
66pub unsafe fn gpio_put(gpio: uint, value: bool) {
67    let mask = 1 << gpio;
68    if value {
69        gpio_set_mask(mask);
70    } else {
71        gpio_clr_mask(mask);
72    }
73}
74#[inline]
75pub unsafe fn gpio_set_dir_out_masked(mask: uint32_t) {
76    (*sio_hw).gpio_oe_set = mask;
77}
78
79#[inline]
80pub unsafe fn gpio_set_dir_in_masked(mask: uint32_t) {
81    (*sio_hw).gpio_oe_clr = mask;
82}
83
84#[inline]
85pub unsafe fn gpio_set_dir_masked(mask: uint32_t, value: uint32_t) {
86    (*sio_hw).gpio_oe_togl = ((*sio_hw).gpio_oe ^ value) & mask;
87}
88
89/*
90#[inline]
91pub unsafe fn gpio_set_dir_all_bits(uint32_t values) {
92*/
93
94// NOTE: out changed from bool to u32
95#[inline]
96pub unsafe fn gpio_set_dir(gpio: uint, out: u32) {
97    let mask = 1 << gpio;
98    if out != 0 {
99        gpio_set_dir_out_masked(mask);
100    } else {
101        gpio_set_dir_in_masked(mask);
102    }
103}
104
105#[inline]
106pub unsafe fn gpio_is_dir_out(gpio: uint) -> bool {
107    (*sio_hw).gpio_oe & (1 << (gpio)) != 0
108}
109
110#[inline]
111pub unsafe fn gpio_get_dir(gpio: uint) -> uint {
112    gpio_is_dir_out(gpio) as uint
113}