Skip to content

Commit

Permalink
cpu/kinetis_common: reworked GPIO driver
Browse files Browse the repository at this point in the history
  • Loading branch information
haukepetersen committed Feb 29, 2016
1 parent 0e285e8 commit 34f9dee
Show file tree
Hide file tree
Showing 2 changed files with 228 additions and 333 deletions.
59 changes: 38 additions & 21 deletions cpu/kinetis_common/include/periph_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

#include <stdint.h>

#include "periph/dev_enums.h"
#include "cpu.h"

#ifdef __cplusplus
extern "C" {
Expand All @@ -40,35 +40,44 @@ typedef uint16_t gpio_t;
*/
#define GPIO_UNDEF (0xffff)

/**
* @brief Definition of pin and port positions in the gpio_t type
* @{
*/
#define GPIO_PORT_SHIFT (8)
#define GPIO_PORT_MASK (0xff << (GPIO_PORT_SHIFT))
#define GPIO_PIN_SHIFT (0)
#define GPIO_PIN_MASK (0xff << (GPIO_PIN_SHIFT))
/** @} */

/**
* @brief Define a CPU specific GPIO pin generator macro
*/
#define GPIO_PIN(port, pin) ((port << GPIO_PORT_SHIFT) | pin)
#define GPIO_PIN(x, y) (((x + 1) << 12) | (x << 6) | y)

/**
* @brief Length of the CPU_ID in octets
*/
#define CPUID_LEN (16U)

/**
* @brief Define a condensed set of PORT PCR values
*
* To combine values just aggregate them using a logical OR.
*/
enum {
GPIO_AF_ANALOG = PORT_PCR_MUX(0), /**< use pin as analog input */
GPIO_AF_GPIO = PORT_PCR_MUX(1), /**< use pin as GPIO */
GPIO_AF_2 = PORT_PCR_MUX(2), /**< use alternate function 2 */
GPIO_AF_3 = PORT_PCR_MUX(3), /**< use alternate function 3 */
GPIO_AF_4 = PORT_PCR_MUX(4), /**< use alternate function 4 */
GPIO_AF_5 = PORT_PCR_MUX(5), /**< use alternate function 5 */
GPIO_AF_6 = PORT_PCR_MUX(6), /**< use alternate function 6 */
GPIO_AF_7 = PORT_PCR_MUX(7), /**< use alternate function 7 */
GPIO_PCR_OD = (PORT_PCR_ODE_MASK), /**< open-drain mode */
GPIO_PCR_PD = (PORT_PCR_PE_MASK), /**< enable pull-down */
GPIO_PCR_PU = (PORT_PCR_PE_MASK | PORT_PCR_PS_MASK) /**< enable PU */
};

/**
* @brief Override values for pull register configuration
* @{
*/
#define HAVE_GPIO_PP_T
typedef enum {
GPIO_NOPULL = 4, /**< do not use internal pull resistors */
GPIO_PULLUP = 9, /**< enable internal pull-up resistor */
GPIO_PULLDOWN = 8 /**< enable internal pull-down resistor */
GPIO_NOPULL = 0x0, /**< do not use internal pull resistors */
GPIO_PULLUP = GPIO_PCR_PU, /**< enable internal pull-up resistor */
GPIO_PULLDOWN = GPIO_PCR_PD /**< enable internal pull-down resistor */
} gpio_pp_t;
/** @} */

Expand All @@ -78,16 +87,16 @@ typedef enum {
*/
#define HAVE_GPIO_FLANK_T
typedef enum {
GPIO_LOGIC_ZERO = 0x8, /**< interrupt on logic zero */
GPIO_RISING = 0x9, /**< emit interrupt on rising flank */
GPIO_FALLING = 0xa, /**< emit interrupt on falling flank */
GPIO_BOTH = 0xb, /**< emit interrupt on both flanks */
GPIO_LOGIC_ONE = 0xc, /**< interrupt on logic one */
GPIO_RISING = PORT_PCR_IRQC(0x9), /**< emit interrupt on rising flank */
GPIO_FALLING = PORT_PCR_IRQC(0xa), /**< emit interrupt on falling flank */
GPIO_BOTH = PORT_PCR_IRQC(0xb), /**< emit interrupt on both flanks */
} gpio_flank_t;
/** @} */

/**
* @brief Available ports on the Kinetis family
*
* @todo This is not equal for all members of the Kinetis family, right?
*/
enum {
PORT_A = 0, /**< port A */
Expand All @@ -97,9 +106,17 @@ enum {
PORT_E = 4, /**< port E */
PORT_F = 5, /**< port F */
PORT_G = 6, /**< port G */
PORT_NUMOF
GPIO_PORTS_NUMOF /**< overall number of available ports */
};

/**
* @brief CPU internal function for initializing PORTs
*
* @param[in] pin pin to initialize
* @param[in] pcr value for the PORT's PCR register
*/
void gpio_init_port(gpio_t pin, uint32_t pcr);

#ifdef __cplusplus
}
#endif
Expand Down
Loading

0 comments on commit 34f9dee

Please sign in to comment.