diff options
Diffstat (limited to 'src/lib/gpio.h')
| -rw-r--r-- | src/lib/gpio.h | 71 | 
1 files changed, 38 insertions, 33 deletions
diff --git a/src/lib/gpio.h b/src/lib/gpio.h index 7620f96..bc9bdde 100644 --- a/src/lib/gpio.h +++ b/src/lib/gpio.h @@ -1,9 +1,30 @@ -#ifndef _GPIO_H -#define _GPIO_H +/* ***************************************************************************** + *  This program is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + *  Created: 12/18/09 02:36:01 + *  Copyright (c) 2009 Perry L. Hung. All rights reserved. + * + * ****************************************************************************/ -#include <inttypes.h> -#include "util.h" +/** + *  @file gpio.h + * + *  @brief GPIO prototypes, defines, and inlined access functions + */ +#ifndef _GPIO_H +#define _GPIO_H  /* Each of the GPIO port bits can be in the following modes (STM32 138/995):   *      Input floating @@ -13,15 +34,15 @@   *      Output open-drain   *      Output push-pull   *      Alternate function push-pull - *      Alternate function open-drain  + *      Alternate function open-drain   *   * - After reset, the alternate functions are not active and IO prts   * are set to Input Floating mode */ -#define _GPIOA_BASE               (GPIO_Port*)0x40010800 -#define _GPIOB_BASE               (GPIO_Port*)0x40010C00 -#define _GPIOC_BASE               (GPIO_Port*)0x40011000 -#define _GPIOD_BASE               (GPIO_Port*)0x40011400 +#define GPIOA_BASE               (GPIO_Port*)0x40010800 +#define GPIOB_BASE               (GPIO_Port*)0x40010C00 +#define GPIOC_BASE               (GPIO_Port*)0x40011000 +#define GPIOD_BASE               (GPIO_Port*)0x40011400  /* Pin modes are set by [CNFx[1:0] : MODEx[1:0]] */  #define GPIO_SPEED_50MHZ            (0x3) // Max output speed 50 MHz @@ -37,13 +58,13 @@  #define GPIO_MODE_INPUT_PD          (0x02 << 2)  #define GPIO_MODE_INPUT_PU          (0x02 << 2) -#define INPUT_ANALOG                GPIO_MODE_INPUT_ANALOG -#define INPUT_DIGITAL               GPIO_MODE_INPUT_FLOATING -#define INPUT_FLOATING              GPIO_MODE_INPUT_FLOATING -#define INPUT_PULLDOWN              GPIO_MODE_INPUT_PD -#define INPUT_PULLUP                GPIO_MODE_INPUT_PU -#define INPUT                       GPIO_MODE_INPUT_FLOATING -#define OUTPUT                      GPIO_MODE_OUTPUT_PP +//#define INPUT_ANALOG                GPIO_MODE_INPUT_ANALOG +//#define INPUT_DIGITAL               GPIO_MODE_INPUT_FLOATING +//#define INPUT_FLOATING              GPIO_MODE_INPUT_FLOATING +//#define INPUT_PULLDOWN              GPIO_MODE_INPUT_PD +//#define INPUT_PULLUP                GPIO_MODE_INPUT_PU +//#define INPUT                       GPIO_MODE_INPUT_FLOATING +//#define OUTPUT                      GPIO_MODE_OUTPUT_PP  typedef struct {      volatile uint32_t CRL;      // Port configuration register low @@ -65,23 +86,7 @@ extern "C"{  #endif  void gpio_init(void); - -static inline void gpio_set_mode(GPIO_Port* port, uint8_t gpio_pin, uint8_t mode) { -    uint32_t tmp; -    uint32_t shift = POS(gpio_pin % 8); -    GPIOReg CR; - -    ASSERT(port); -    ASSERT(gpio_pin < 16); - -    CR = (gpio_pin < 8) ? &(port->CRL) : &(port->CRH); - -    tmp = *CR; -    tmp &= POS_MASK(shift); -    tmp |= mode << shift; - -    *CR = tmp; -} +void gpio_set_mode(GPIO_Port* port, uint8_t gpio_pin, uint8_t mode);  static inline void gpio_write_bit(GPIO_Port *port, uint8_t gpio_pin, uint8_t val) {      if (val){  | 
