Blame view

RIOT/cpu/samd21/include/periph_cpu.h 4.52 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  /*
   * Copyright (C) 2015-2016 Freie Universitรคt Berlin
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @ingroup         cpu_samd21
   * @brief           CPU specific definitions for internal peripheral handling
   * @{
   *
   * @file
   * @brief           CPU specific definitions for internal peripheral handling
   *
   * @author          Hauke Petersen <hauke.petersen@fu-berlin.de>
   */
  
  #ifndef PERIPH_CPU_H
  #define PERIPH_CPU_H
  
  #include <limits.h>
  
  #include "periph_cpu_common.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * @brief   Mapping of pins to EXTI lines, -1 means not EXTI possible
   */
  static const int8_t exti_config[2][32] = {
  #ifdef CPU_MODEL_SAMD21J18A
      { 0,  1,  2,  3,  4,  5,  6,  7, -1,  9, 10, 11, 12, 13, 14, 15,
        0,  1,  2,  3,  4,  5,  6,  7, 12, 13, -1, 15,  8, -1, 10, 11},
      { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
        0,  1, -1, -1, -1, -1,  6,  7, -1, -1, -1, -1, -1, -1, 14, 15},
  #elif CPU_MODEL_SAMD21G18A
      { 0,  1,  2,  3,  4,  5,  6,  7, -1,  9, 10, 11, 12, 13, 14, 15,
        0,  1,  2,  3,  4,  5,  6,  7, 12, 13, -1, 15,  8, -1, 10, 11},
      {-1, -1,  2,  3, -1, -1, -1, -1,  8,  9, 10, 11, -1, -1, -1, -1,
       -1, -1, -1, -1, -1, -1,  6,  7, -1, -1, -1, -1, -1, -1, -1, -1},
  #elif CPU_MODEL_SAMR21G18A
      {-1,  1, -1, -1,  4,  5,  6,  7, -1,  9, 10, 11, 12, 13, 14, 15,
       -1,  1,  2,  3, -1, -1,  6,  7, 12, 13, -1, 15,  8, -1, 10, 11},
      { 0, -1,  2,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        0,  1, -1, -1, -1, -1,  6,  7, -1, -1, -1, -1,  8, -1, -1, -1},
  #elif CPU_MODEL_SAMR21E18A
      {-1, -1, -1, -1, -1, -1,  6,  7, -1,  9, 10, 11, -1, -1, 14, 15,
       -1,  1,  2,  3, -1, -1, -1, -1, 12, 13, -1, 15,  8, -1, 10, 11},
      { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        0,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
  #else
      #error Please define a proper CPU_MODEL.
  #endif
  };
  
  /**
   * @brief   Available ports on the SAMD21
   */
  enum {
      PA = 0,                 /**< port A */
      PB = 1,                 /**< port B */
      PC = 2,                 /**< port C */
  };
  
  /**
   * @brief   Generate GPIO mode bitfields
   *
   * We use 3 bit to determine the pin functions:
   * - bit 0: PD(0) or PU(1)
   * - bit 1: input enable
   * - bit 2: pull enable
   */
  #define GPIO_MODE(pr, ie, pe)   (pr | (ie << 1) | (pe << 2))
  
  /**
   * @brief   Override SPI hardware chip select macro
   *
   * As of now, we do not support HW CS, so we always set it to a fixed value
   */
  #define SPI_HWCS(x)     (UINT_MAX - 1)
  
  #ifndef DOXYGEN
  /**
   * @brief   Override GPIO modes
   * @{
   */
  #define HAVE_GPIO_MODE_T
  typedef enum {
      GPIO_IN    = GPIO_MODE(0, 1, 0),    /**< IN */
      GPIO_IN_PD = GPIO_MODE(0, 1, 1),    /**< IN with pull-down */
      GPIO_IN_PU = GPIO_MODE(1, 1, 1),    /**< IN with pull-up */
      GPIO_OUT   = GPIO_MODE(0, 0, 0),    /**< OUT (push-pull) */
      GPIO_OD    = 0xfe,                  /**< not supported by HW */
      GPIO_OD_PU = 0xff                   /**< not supported by HW */
  } gpio_mode_t;
  /** @} */
  #endif /* ndef DOXYGEN */
  
  /**
   * @brief   PWM channel configuration data structure
   */
  typedef struct {
      gpio_t pin;                 /**< GPIO pin */
      gpio_mux_t mux;             /**< pin function multiplex value */
      uint8_t chan;               /**< TCC channel to use */
  } pwm_conf_chan_t;
  
  /**
   * @brief   PWM device configuration data structure
   */
  typedef struct {
      Tcc *dev;                   /**< TCC device to use */
      pwm_conf_chan_t chan[3];    /**< channel configuration */
  } pwm_conf_t;
  
  /**
   * @brief   Return the numeric id of a SERCOM device derived from its address
   *
   * @param[in] sercom    SERCOM device
   *
   * @return              numeric id of the given SERCOM device
   */
  static inline int _sercom_id(SercomUsart *sercom)
  {
      return ((((uint32_t)sercom) >> 10) & 0x7) - 2;
  }
  
  /**
   * @brief   Override the ADC resolution configuration
   * @{
   */
  #define HAVE_ADC_RES_T
  typedef enum {
      ADC_RES_6BIT  = 0xff,                       /**< not supported */
      ADC_RES_8BIT  = ADC_CTRLB_RESSEL_8BIT,      /**< ADC resolution: 8 bit */
      ADC_RES_10BIT = ADC_CTRLB_RESSEL_10BIT,     /**< ADC resolution: 10 bit */
      ADC_RES_12BIT = ADC_CTRLB_RESSEL_12BIT,     /**< ADC resolution: 12 bit */
      ADC_RES_14BIT = 0xfe,                       /**< not supported */
      ADC_RES_16BIT = 0xfd                        /**< not supported */
  } adc_res_t;
  /** @} */
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* PERIPH_CPU_H */
  /** @} */