aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/platforms/LPC122x/i2c_lld.h
blob: edff13a95b157b40f2953f67a0fc941c64e87557 (plain)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/*
    ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio
    LPC122x I2C driver - Copyright (C) 2013 Marcin Jokel

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/
/*
   Concepts and parts of this file have been contributed by Uladzimir Pylinsky
   aka barthess.
 */

/**
 * @file    LPC122x/i2c_lld.h
 * @brief   LPC122x I2C subsystem low level driver header.
 *
 * @addtogroup I2C
 * @{
 */

#ifndef _I2C_LLD_H_
#define _I2C_LLD_H_

#if HAL_USE_I2C || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver constants.                                                         */
/*===========================================================================*/

#define I2C_CONSET_AA               0x04  /* Assert acknowledge flag. */
#define I2C_CONSET_SI               0x08  /* I2C interrupt flag. */
#define I2C_CONSET_STO              0x10  /* STOP flag. */
#define I2C_CONSET_STA              0x20  /* START flag. */
#define I2C_CONSET_EN               0x40  /* I2C interface enable. */

#define I2C_CONCLR_AAC              0x04  /* Assert acknowledge Clear bit. */
#define I2C_CONCLR_SIC              0x08  /* I2C interrupt Clear bit. */
#define I2C_CONCLR_STAC             0x20  /* START flag Clear bit. */
#define I2C_CONCLR_ENC              0x40  /* I2C interface Disable bit. */

#define I2C_WR_BIT                  0x00
#define I2C_RD_BIT                  0x01

#define I2C_STATE_MS_START          0x08
#define I2C_STATE_MS_RSTART         0x10
#define I2C_STATE_MS_SLAW_ACK       0x18
#define I2C_STATE_MS_SLAW_NACK      0x20
#define I2C_STATE_MS_TDAT_ACK       0x28
#define I2C_STATE_MS_TDAT_NACK      0x30
#define I2C_STATE_ARB_LOST          0x38

#define I2C_STATE_MS_SLAR_ACK       0x40
#define I2C_STATE_MS_SLAR_NACK      0x48
#define I2C_STATE_MS_RDAT_ACK       0x50
#define I2C_STATE_MS_RDAT_NACK      0x58

#define I2C_STATE_BUS_ERROR         0x00

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/
/**
 * @name    Configuration options
 * @{
 */

/**
 * @brief   I2C interrupt priority level setting.
 */
#if !defined(LPC122x_I2C_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define LPC122x_I2C_IRQ_PRIORITY     3
#endif

/** @} */

/*===========================================================================*/
/* Derived constants and error checks.                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver data structures and types.                                         */
/*===========================================================================*/

/**
 * @brief   Type representing I2C address.
 */
typedef uint16_t i2caddr_t;

/**
 * @brief   I2C Driver condition flags type.
 */
typedef uint32_t i2cflags_t;
/**
 * @brief   Supported modes for the I2C bus.
 */
typedef enum {
  I2C_STANDARD_MODE = 1,
  I2C_FAST_MODE = 2,
  I2C_FAST_MODE_PLUS = 3
} i2cmode_t;

/**
 * @brief Driver configuration structure.
 */
typedef struct {
  i2cmode_t       mode;          /**< @brief Specifies the I2C mode.        */
  uint32_t        clock_timing;  /**< @brief Specifies the clock timing     */
} I2CConfig;

/**
 * @brief   Type of a structure representing an I2C driver.
 */
typedef struct I2CDriver I2CDriver;

/**
 * @brief Structure representing an I2C driver.
 */
struct I2CDriver {
  /**
   * @brief   Driver state.
   */
  i2cstate_t                state;
  /**
   * @brief   Current configuration data.
   */
  const I2CConfig           *config;
  /**
   * @brief   Error flags.
   */
  i2cflags_t                errors;
#if I2C_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
#if CH_USE_MUTEXES || defined(__DOXYGEN__)
  /**
   * @brief   Mutex protecting the bus.
   */
  Mutex                     mutex;
#elif CH_USE_SEMAPHORES
  Semaphore                 semaphore;
#endif
#endif /* I2C_USE_MUTUAL_EXCLUSION */
#if defined(I2C_DRIVER_EXT_FIELDS)
  I2C_DRIVER_EXT_FIELDS
#endif
  /* End of the mandatory fields.*/
  /**
   * @brief   Thread waiting for I/O completion.
   */
  Thread                    *thread;
  /**
   * @brief     Current slave address without R/W bit.
   */
  i2caddr_t                 addr;
  /**
   * @brief     Pointer to the transmit buffer.
   */
  const uint8_t             *txbuf;
  /**
    * @brief    Number of bytes to transmit.
    */
  size_t                    txbytes;
  /**
    * @brief     Pointer to the receive buffer.
    */
  uint8_t                   *rxbuf;
  /**
      * @brief    Number of bytes to receive.
      */
  size_t                    rxbytes;
  /**
   * @brief     Pointer to the I2C registers block.
   */
  LPC_I2C_Type              *i2c;
};

/*===========================================================================*/
/* Driver macros.                                                            */
/*===========================================================================*/

/**
 * @brief   Get errors from I2C driver.
 *
 * @param[in] i2cp      pointer to the @p I2CDriver object
 *
 * @notapi
 */
#define i2c_lld_get_errors(i2cp) ((i2cp)->errors)

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

#if !defined(__DOXYGEN__)
extern I2CDriver I2CD1;
#endif

#endif /* !defined(__DOXYGEN__) */

#ifdef __cplusplus
extern "C" {
#endif
  void i2c_lld_init(void);
  void i2c_lld_start(I2CDriver *i2cp);
  void i2c_lld_stop(I2CDriver *i2cp);
  msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr,
                                        const uint8_t *txbuf, size_t txbytes,
                                        uint8_t *rxbuf, size_t rxbytes,
                                        systime_t timeout);
  msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr,
                                       uint8_t *rxbuf, size_t rxbytes,
                                       systime_t timeout);
#ifdef __cplusplus
}
#endif



#endif /* _I2C_LLD_H_ */

/** @} */