Line data Source code
1 : // --------------------------------------------------------------------------- 2 : // USB EPROM/Flash Programmer 3 : // 4 : // Copyright (2022) Robson Martins 5 : // 6 : // This work is licensed under a Creative Commons Attribution-NonCommercial- 7 : // ShareAlike 4.0 International License. 8 : // --------------------------------------------------------------------------- 9 : /** 10 : * @ingroup Firmware 11 : * @file hal/gpio.cpp 12 : * @brief Implementation of the Pico GPIO Class. 13 : * 14 : * @author Robson Martins (https://www.robsonmartins.com) 15 : */ 16 : // --------------------------------------------------------------------------- 17 : 18 : #include "hal/gpio.hpp" 19 : 20 : #include "hardware/gpio.h" 21 : 22 : // --------------------------------------------------------------------------- 23 : 24 243 : Gpio::Gpio() {} 25 : 26 2515 : void Gpio::setPin(uint pin, bool value) { 27 2515 : initPin_(pin); 28 2515 : gpio_set_dir(pin, GPIO_OUT); 29 2515 : gpio_put(pin, value); 30 2515 : } 31 : 32 1032 : void Gpio::resetPin(uint pin) { 33 1032 : setPin(pin, false); 34 1032 : } 35 : 36 2 : void Gpio::togglePin(uint pin) { 37 2 : initPin_(pin); 38 2 : gpio_set_dir(pin, GPIO_OUT); 39 2 : uint32_t mask = 1ul << pin; 40 2 : gpio_xor_mask(mask); 41 2 : } 42 : 43 258 : bool Gpio::getPin(uint pin) { 44 258 : initPin_(pin); 45 258 : gpio_set_dir(pin, GPIO_IN); 46 258 : return (gpio_get(pin)); 47 : } 48 : 49 3 : void Gpio::pullUp(uint pin, bool enable) { 50 3 : initPin_(pin); 51 3 : bool down = gpio_is_pulled_down(pin); 52 3 : gpio_set_pulls(pin, enable, down); 53 3 : } 54 : 55 3 : void Gpio::pullDown(uint pin, bool enable) { 56 3 : initPin_(pin); 57 3 : bool up = gpio_is_pulled_up(pin); 58 3 : gpio_set_pulls(pin, up, enable); 59 3 : } 60 : 61 1 : void Gpio::disablePulls(uint pin) { 62 1 : initPin_(pin); 63 1 : gpio_disable_pulls(pin); 64 1 : } 65 : 66 9 : bool Gpio::isPulledUp(uint pin) { 67 9 : initPin_(pin); 68 9 : return gpio_is_pulled_up(pin); 69 : } 70 : 71 9 : bool Gpio::isPulledDown(uint pin) { 72 9 : initPin_(pin); 73 9 : return gpio_is_pulled_down(pin); 74 : } 75 : 76 2800 : void Gpio::initPin_(uint pin) { 77 2800 : if (initPins_.find(pin) != initPins_.end()) { 78 2755 : return; 79 : } 80 45 : gpio_init(pin); 81 45 : initPins_.insert(pin); 82 : }