• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <errno.h>
18 #include <stdint.h>
19 #include <string.h>
20 
21 #include <gpio.h>
22 #include <i2c.h>
23 #include <seos.h>
24 #include <util.h>
25 #include <gpio.h>
26 #include <atomicBitset.h>
27 #include <atomic.h>
28 #include <platform.h>
29 
30 #include <plat/cmsis.h>
31 #include <plat/dma.h>
32 #include <plat/gpio.h>
33 #include <plat/i2c.h>
34 #include <plat/pwr.h>
35 #include <plat/plat.h>
36 
37 #include <cpu/barrier.h>
38 
39 #define I2C_VERBOSE_DEBUG       0
40 #define I2C_MAX_QUEUE_DEPTH     5
41 
42 #if I2C_VERBOSE_DEBUG
43 #define i2c_log_debug(x) osLog(LOG_DEBUG, x "\n")
44 #else
45 #define i2c_log_debug(x) do {} while(0)
46 #endif
47 
48 #define I2C_CR1_PE          (1 << 0)
49 #define I2C_CR1_SMBUS       (1 << 1)
50 #define I2C_CR1_SMBTYPE     (1 << 3)
51 #define I2C_CR1_ENARP       (1 << 4)
52 #define I2C_CR1_ENPEC       (1 << 5)
53 #define I2C_CR1_ENGC        (1 << 6)
54 #define I2C_CR1_NOSTRETCH   (1 << 7)
55 #define I2C_CR1_START       (1 << 8)
56 #define I2C_CR1_STOP        (1 << 9)
57 #define I2C_CR1_ACK         (1 << 10)
58 #define I2C_CR1_POS         (1 << 11)
59 #define I2C_CR1_PEC         (1 << 12)
60 #define I2C_CR1_ALERT       (1 << 13)
61 #define I2C_CR1_SWRST       (1 << 15)
62 
63 #define I2C_CR2_FREQ(x)     ((x) & I2C_CR2_FREQ_MASK)
64 #define I2C_CR2_FREQ_MASK   0x3F
65 #define I2C_CR2_ITERREN     (1 << 8)
66 #define I2C_CR2_ITEVTEN     (1 << 9)
67 #define I2C_CR2_ITBUFEN     (1 << 10)
68 #define I2C_CR2_DMAEN       (1 << 11)
69 #define I2C_CR2_LAST        (1 << 12)
70 
71 #define I2C_OAR1_ADD7(x)    (((x) & I2C_OAR1_ADD7_MASK) << 1)
72 #define I2C_OAR1_ADD7_MASK  0x7F
73 #define I2C_OAR1_ADD10(x)   ((x) & I2C_OAR1_ADD10_MASK)
74 #define I2C_OAR1_ADD10_MASK 0x3FF
75 #define I2C_OAR1_ADDMODE    (1 << 15)
76 
77 #define I2C_SR1_SB          (1 << 0)
78 #define I2C_SR1_ADDR        (1 << 1)
79 #define I2C_SR1_BTF         (1 << 2)
80 #define I2C_SR1_ADD10       (1 << 3)
81 #define I2C_SR1_STOPF       (1 << 4)
82 #define I2C_SR1_RXNE        (1 << 6)
83 #define I2C_SR1_TXE         (1 << 7)
84 #define I2C_SR1_BERR        (1 << 8)
85 #define I2C_SR1_ARLO        (1 << 9)
86 #define I2C_SR1_AF          (1 << 10)
87 #define I2C_SR1_OVR         (1 << 11)
88 #define I2C_SR1_PECERR      (1 << 12)
89 #define I2C_SR1_TIMEOUT     (1 << 14)
90 #define I2C_SR1_SMBALERT    (1 << 15)
91 
92 #define I2C_SR2_MSL         (1 << 0)
93 #define I2C_SR2_BUSY        (1 << 1)
94 #define I2C_SR2_TRA         (1 << 2)
95 #define I2C_SR2_GENCALL     (1 << 4)
96 #define I2C_SR2_SMBDEFAULT  (1 << 5)
97 #define I2C_SR2_SMBHOST     (1 << 6)
98 #define I2C_SR2_DUALF       (1 << 7)
99 
100 #define I2C_CCR(x)          ((x) & I2C_CCR_MASK)
101 #define I2C_CCR_MASK        0xFFF
102 #define I2C_CCR_DUTY_16_9   (1 << 14)
103 #define I2C_CCR_FM          (1 << 15)
104 
105 #define I2C_TRISE(x)        ((x) & I2C_TRISE_MASK)
106 #define I2C_TRISE_MASK      0x3F
107 
108 struct StmI2c {
109     volatile uint32_t CR1;
110     volatile uint32_t CR2;
111     volatile uint32_t OAR1;
112     volatile uint32_t OAR2;
113     volatile uint32_t DR;
114     volatile uint32_t SR1;
115     volatile uint32_t SR2;
116     volatile uint32_t CCR;
117     volatile uint32_t TRISE;
118     volatile uint32_t FLTR;
119 };
120 
121 enum StmI2cSpiMasterState
122 {
123     STM_I2C_MASTER_IDLE,
124     STM_I2C_MASTER_START,
125     STM_I2C_MASTER_TX_ADDR,
126     STM_I2C_MASTER_TX_DATA,
127     STM_I2C_MASTER_RX_ADDR,
128     STM_I2C_MASTER_RX_DATA,
129 };
130 
131 struct I2cStmState {
132     struct {
133         union {
134             uint8_t *buf;
135             const uint8_t *cbuf;
136             uint8_t byte;
137         };
138         size_t size;
139         size_t offset;
140         bool preamble;
141 
142         I2cCallbackF callback;
143         void *cookie;
144     } rx, tx;
145 
146     enum {
147         STM_I2C_DISABLED,
148         STM_I2C_SLAVE,
149         STM_I2C_MASTER,
150     } mode;
151 
152     enum {
153         STM_I2C_SLAVE_IDLE,
154         STM_I2C_SLAVE_RX_ARMED,
155         STM_I2C_SLAVE_RX,
156         STM_I2C_SLAVE_TX_ARMED,
157         STM_I2C_SLAVE_TX,
158     } slaveState;
159 
160     // StmI2cSpiMasterState
161     uint8_t masterState;
162     uint16_t tid;
163 };
164 
165 struct StmI2cCfg {
166     struct StmI2c *regs;
167 
168     uint32_t clock;
169 
170     IRQn_Type irqEv;
171     IRQn_Type irqEr;
172 };
173 
174 struct StmI2cDev {
175     const struct StmI2cCfg *cfg;
176     const struct StmI2cBoardCfg *board;
177     struct I2cStmState state;
178 
179     uint32_t next;
180     uint32_t last;
181 
182     struct Gpio *scl;
183     struct Gpio *sda;
184 
185     uint8_t addr;
186 };
187 
188 static const struct StmI2cCfg mStmI2cCfgs[] = {
189     [0] = {
190         .regs = (struct StmI2c *)I2C1_BASE,
191 
192         .clock = PERIPH_APB1_I2C1,
193 
194         .irqEv = I2C1_EV_IRQn,
195         .irqEr = I2C1_ER_IRQn,
196     },
197     [1] = {
198         .regs = (struct StmI2c *)I2C2_BASE,
199 
200         .clock = PERIPH_APB1_I2C2,
201 
202         .irqEv = I2C2_EV_IRQn,
203         .irqEr = I2C2_ER_IRQn,
204     },
205     [2] = {
206         .regs = (struct StmI2c *)I2C3_BASE,
207 
208         .clock = PERIPH_APB1_I2C3,
209 
210         .irqEv = I2C3_EV_IRQn,
211         .irqEr = I2C3_ER_IRQn,
212     },
213 };
214 
215 static struct StmI2cDev mStmI2cDevs[ARRAY_SIZE(mStmI2cCfgs)];
216 
217 struct StmI2cXfer
218 {
219     uint32_t        id;
220     const void     *txBuf;
221     size_t          txSize;
222     void           *rxBuf;
223     size_t          rxSize;
224     I2cCallbackF    callback;
225     void           *cookie;
226     uint8_t         busId; /* for us these are both fine in a uint 8 */
227     uint8_t         addr;
228     uint16_t        tid;
229 };
230 
231 ATOMIC_BITSET_DECL(mXfersValid, I2C_MAX_QUEUE_DEPTH, static);
232 static struct StmI2cXfer mXfers[I2C_MAX_QUEUE_DEPTH] = { };
233 
stmI2cGetXfer(void)234 static inline struct StmI2cXfer *stmI2cGetXfer(void)
235 {
236     int32_t idx = atomicBitsetFindClearAndSet(mXfersValid);
237 
238     if (idx < 0)
239         return NULL;
240     else
241         return mXfers + idx;
242 }
243 
stmI2cPutXfer(struct StmI2cXfer * xfer)244 static inline void stmI2cPutXfer(struct StmI2cXfer *xfer)
245 {
246     if (xfer)
247         atomicBitsetClearBit(mXfersValid, xfer - mXfers);
248 }
249 
stmI2cAckEnable(struct StmI2cDev * pdev)250 static inline void stmI2cAckEnable(struct StmI2cDev *pdev)
251 {
252     pdev->cfg->regs->CR1 |= I2C_CR1_ACK;
253 }
254 
stmI2cAckDisable(struct StmI2cDev * pdev)255 static inline void stmI2cAckDisable(struct StmI2cDev *pdev)
256 {
257     pdev->cfg->regs->CR1 &= ~I2C_CR1_ACK;
258 }
259 
stmI2cDmaEnable(struct StmI2cDev * pdev)260 static inline void stmI2cDmaEnable(struct StmI2cDev *pdev)
261 {
262     pdev->cfg->regs->CR2 |= I2C_CR2_DMAEN;
263 }
264 
stmI2cDmaDisable(struct StmI2cDev * pdev)265 static inline void stmI2cDmaDisable(struct StmI2cDev *pdev)
266 {
267     pdev->cfg->regs->CR2 &= ~I2C_CR2_DMAEN;
268 }
269 
stmI2cStopEnable(struct StmI2cDev * pdev)270 static inline void stmI2cStopEnable(struct StmI2cDev *pdev)
271 {
272     struct StmI2c *regs = pdev->cfg->regs;
273 
274     while (regs->CR1 & (I2C_CR1_STOP | I2C_CR1_START))
275         ;
276     regs->CR1 |= I2C_CR1_STOP;
277 }
278 
stmI2cStartEnable(struct StmI2cDev * pdev)279 static inline void stmI2cStartEnable(struct StmI2cDev *pdev)
280 {
281     struct StmI2c *regs = pdev->cfg->regs;
282 
283     while (regs->CR1 & (I2C_CR1_STOP | I2C_CR1_START))
284         ;
285     regs->CR1 |= I2C_CR1_START;
286 }
287 
stmI2cIrqEnable(struct StmI2cDev * pdev,uint32_t mask)288 static inline void stmI2cIrqEnable(struct StmI2cDev *pdev,
289         uint32_t mask)
290 {
291     pdev->cfg->regs->CR2 |= mask;
292 }
293 
stmI2cIrqDisable(struct StmI2cDev * pdev,uint32_t mask)294 static inline void stmI2cIrqDisable(struct StmI2cDev *pdev,
295         uint32_t mask)
296 {
297     pdev->cfg->regs->CR2 &= ~mask;
298 }
299 
stmI2cEnable(struct StmI2cDev * pdev)300 static inline void stmI2cEnable(struct StmI2cDev *pdev)
301 {
302     pdev->cfg->regs->CR1 |= I2C_CR1_PE;
303 }
304 
stmI2cDisable(struct StmI2cDev * pdev)305 static inline void stmI2cDisable(struct StmI2cDev *pdev)
306 {
307     pdev->cfg->regs->CR1 &= ~I2C_CR1_PE;
308 }
309 
stmI2cSpeedSet(struct StmI2cDev * pdev,const uint32_t speed)310 static inline void stmI2cSpeedSet(struct StmI2cDev *pdev,
311         const uint32_t speed)
312 {
313     struct StmI2c *regs = pdev->cfg->regs;
314     int ccr, ccr_1, ccr_2;
315     int apb1_clk;
316 
317     apb1_clk = pwrGetBusSpeed(PERIPH_BUS_APB1);
318 
319     regs->CR2 = (regs->CR2 & ~I2C_CR2_FREQ_MASK) |
320                  I2C_CR2_FREQ(apb1_clk / 1000000);
321 
322     if (speed <= 100000) {
323         ccr = apb1_clk / (speed * 2);
324         if (ccr < 4)
325             ccr = 4;
326         regs->CCR = I2C_CCR(ccr);
327 
328         regs->TRISE = I2C_TRISE((apb1_clk / 1000000) + 1);
329     } else if (speed <= 400000) {
330         ccr_1 = apb1_clk / (speed * 3);
331         if (ccr_1 == 0 || apb1_clk / (ccr_1 * 3) > speed)
332             ccr_1 ++;
333         ccr_2 = apb1_clk / (speed * 25);
334         if (ccr_2 == 0 || apb1_clk / (ccr_2 * 25) > speed)
335             ccr_2 ++;
336 
337         if ((apb1_clk / (ccr_1 * 3)) > (apb1_clk / (ccr_2 * 25)))
338             regs->CCR = I2C_CCR_FM | I2C_CCR(ccr_1);
339         else
340             regs->CCR = I2C_CCR_FM | I2C_CCR_DUTY_16_9 | I2C_CCR(ccr_2);
341 
342         regs->TRISE = I2C_TRISE(((3*apb1_clk)/10000000) + 1);
343     }
344 }
345 
stmI2cSlaveIdle(struct StmI2cDev * pdev)346 static inline void stmI2cSlaveIdle(struct StmI2cDev *pdev)
347 {
348     struct I2cStmState *state = &pdev->state;
349 
350     state->slaveState = STM_I2C_SLAVE_RX_ARMED;
351     stmI2cAckEnable(pdev);
352     stmI2cIrqDisable(pdev, I2C_CR2_ITBUFEN | I2C_CR2_ITERREN);
353 }
354 
stmI2cInvokeRxCallback(struct I2cStmState * state,size_t tx,size_t rx,int err)355 static inline void stmI2cInvokeRxCallback(struct I2cStmState *state, size_t tx, size_t rx, int err)
356 {
357     uint16_t oldTid = osSetCurrentTid(state->tid);
358     state->rx.callback(state->rx.cookie, tx, rx, err);
359     osSetCurrentTid(oldTid);
360 }
361 
stmI2cInvokeTxCallback(struct I2cStmState * state,size_t tx,size_t rx,int err)362 static inline void stmI2cInvokeTxCallback(struct I2cStmState *state, size_t tx, size_t rx, int err)
363 {
364     uint16_t oldTid = osSetCurrentTid(state->tid);
365     state->tx.callback(state->tx.cookie, tx, rx, err);
366     osSetCurrentTid(oldTid);
367 }
368 
stmI2cSlaveRxDone(struct StmI2cDev * pdev)369 static inline void stmI2cSlaveRxDone(struct StmI2cDev *pdev)
370 {
371     struct I2cStmState *state = &pdev->state;
372     size_t rxOffst = state->rx.offset;
373 
374     state->rx.offset = 0;
375     stmI2cInvokeRxCallback(state, 0, rxOffst, 0);
376 }
377 
stmI2cSlaveTxDone(struct StmI2cDev * pdev)378 static inline void stmI2cSlaveTxDone(struct StmI2cDev *pdev)
379 {
380     struct I2cStmState *state = &pdev->state;
381     size_t txOffst = state->tx.offset;
382 
383     stmI2cSlaveIdle(pdev);
384     stmI2cInvokeTxCallback(state, txOffst, 0, 0);
385 }
386 
stmI2cSlaveTxNextByte(struct StmI2cDev * pdev)387 static void stmI2cSlaveTxNextByte(struct StmI2cDev *pdev)
388 {
389     struct I2cStmState *state = &pdev->state;
390     struct StmI2c *regs = pdev->cfg->regs;
391 
392     if (state->tx.preamble) {
393         regs->DR = state->tx.byte;
394         state->tx.offset++;
395     } else if (state->tx.offset < state->tx.size) {
396         regs->DR = state->tx.cbuf[state->tx.offset];
397         state->tx.offset++;
398     } else {
399         state->slaveState = STM_I2C_SLAVE_TX_ARMED;
400         stmI2cIrqDisable(pdev, I2C_CR2_ITBUFEN);
401         stmI2cInvokeTxCallback(state, state->tx.offset, 0, 0);
402     }
403 }
404 
stmI2cSlaveAddrMatched(struct StmI2cDev * pdev)405 static void stmI2cSlaveAddrMatched(struct StmI2cDev *pdev)
406 {
407     struct I2cStmState *state = &pdev->state;
408     struct StmI2c *regs = pdev->cfg->regs;
409 
410     i2c_log_debug("addr");
411 
412     if (state->slaveState == STM_I2C_SLAVE_RX_ARMED) {
413         state->slaveState = STM_I2C_SLAVE_RX;
414         stmI2cIrqEnable(pdev, I2C_CR2_ITBUFEN | I2C_CR2_ITERREN);
415     } else if (state->slaveState == STM_I2C_SLAVE_TX) {
416         stmI2cIrqEnable(pdev, I2C_CR2_ITBUFEN | I2C_CR2_ITERREN);
417     }
418     /* clear ADDR by doing a dummy reads from SR1 (already read) then SR2 */
419     (void)regs->SR2;
420 }
421 
stmI2cSlaveStopRxed(struct StmI2cDev * pdev)422 static void stmI2cSlaveStopRxed(struct StmI2cDev *pdev)
423 {
424     struct StmI2c *regs = pdev->cfg->regs;
425 
426     i2c_log_debug("stopf");
427 
428     (void)regs->SR1;
429     stmI2cEnable(pdev);
430     /* clear STOPF by doing a dummy read from SR1 and strobing the PE bit */
431 
432     stmI2cSlaveIdle(pdev);
433     stmI2cSlaveRxDone(pdev);
434 }
435 
stmI2cSlaveRxBufNotEmpty(struct StmI2cDev * pdev)436 static inline void stmI2cSlaveRxBufNotEmpty(struct StmI2cDev *pdev)
437 {
438     struct I2cStmState *state = &pdev->state;
439     struct StmI2c *regs = pdev->cfg->regs;
440     uint8_t data = regs->DR;
441 
442     i2c_log_debug("rxne");
443 
444     if (state->rx.offset < state->rx.size) {
445         state->rx.buf[state->rx.offset] = data;
446         state->rx.offset++;
447     } else {
448         stmI2cAckDisable(pdev);
449         /* TODO: error on overflow */
450     }
451 }
452 
stmI2cSlaveTxBufEmpty(struct StmI2cDev * pdev)453 static void stmI2cSlaveTxBufEmpty(struct StmI2cDev *pdev)
454 {
455     struct I2cStmState *state = &pdev->state;
456 
457     i2c_log_debug("txe");
458 
459     if (state->slaveState == STM_I2C_SLAVE_RX) {
460         state->slaveState = STM_I2C_SLAVE_TX_ARMED;
461         stmI2cIrqDisable(pdev, I2C_CR2_ITBUFEN);
462         stmI2cAckDisable(pdev);
463         stmI2cSlaveRxDone(pdev);
464         /* stmI2cTxNextByte() will happen when the task provides a
465            TX buffer; the I2C controller will stretch the clock until then */
466     } else {
467         stmI2cSlaveTxNextByte(pdev);
468     }
469 }
470 
stmI2cSlaveNakRxed(struct StmI2cDev * pdev)471 static void stmI2cSlaveNakRxed(struct StmI2cDev *pdev)
472 {
473     struct I2cStmState *state = &pdev->state;
474     struct StmI2c *regs = pdev->cfg->regs;
475 
476     i2c_log_debug("af");
477 
478     if (state->slaveState == STM_I2C_SLAVE_TX) {
479         state->tx.offset--;
480         /* NACKs seem to be preceded by a spurious TXNE, so adjust the offset to
481            compensate (the corresponding byte written to DR was never actually
482            transmitted) */
483         stmI2cSlaveTxDone(pdev);
484     }
485     regs->SR1 &= ~I2C_SR1_AF;
486 }
487 
stmI2cMasterTxRxDone(struct StmI2cDev * pdev,int err)488 static inline void stmI2cMasterTxRxDone(struct StmI2cDev *pdev, int err)
489 {
490     struct I2cStmState *state = &pdev->state;
491     size_t txOffst = state->tx.offset;
492     size_t rxOffst = state->rx.offset;
493     uint32_t id;
494     int i;
495     struct StmI2cXfer *xfer;
496 
497     if (pdev->board->sleepDev >= 0)
498         platReleaseDevInSleepMode(pdev->board->sleepDev);
499 
500     state->tx.offset = 0;
501     state->rx.offset = 0;
502     stmI2cInvokeTxCallback(state, txOffst, rxOffst, err);
503 
504     do {
505         id = atomicAdd32bits(&pdev->next, 1);
506     } while (!id);
507 
508     for (i=0; i<I2C_MAX_QUEUE_DEPTH; i++) {
509         xfer = &mXfers[i];
510 
511         if (xfer->busId == (pdev - mStmI2cDevs) &&
512                 atomicCmpXchg32bits(&xfer->id, id, 0)) {
513             pdev->addr = xfer->addr;
514             state->tx.cbuf = xfer->txBuf;
515             state->tx.offset = 0;
516             state->tx.size = xfer->txSize;
517             state->tx.callback = xfer->callback;
518             state->tx.cookie = xfer->cookie;
519             state->rx.buf = xfer->rxBuf;
520             state->rx.offset = 0;
521             state->rx.size = xfer->rxSize;
522             state->rx.callback = NULL;
523             state->rx.cookie = NULL;
524             state->tid = xfer->tid;
525             atomicWriteByte(&state->masterState, STM_I2C_MASTER_START);
526             if (pdev->board->sleepDev >= 0)
527                 platRequestDevInSleepMode(pdev->board->sleepDev, 12);
528             stmI2cPutXfer(xfer);
529             stmI2cStartEnable(pdev);
530             return;
531         }
532     }
533 
534     atomicWriteByte(&state->masterState, STM_I2C_MASTER_IDLE);
535 }
536 
stmI2cMasterDmaTxDone(void * cookie,uint16_t bytesLeft,int err)537 static void stmI2cMasterDmaTxDone(void *cookie, uint16_t bytesLeft, int err)
538 {
539     struct StmI2cDev *pdev = cookie;
540     struct I2cStmState *state = &pdev->state;
541     struct StmI2c *regs = pdev->cfg->regs;
542 
543     state->tx.offset = state->tx.size - bytesLeft;
544     state->tx.size = 0;
545     stmI2cDmaDisable(pdev);
546     if (err == 0 && state->rx.size > 0) {
547         atomicWriteByte(&state->masterState, STM_I2C_MASTER_START);
548         stmI2cStartEnable(pdev);
549     } else {
550         while (!(regs->SR1 & I2C_SR1_BTF))
551             ;
552 
553         stmI2cStopEnable(pdev);
554         stmI2cMasterTxRxDone(pdev, err);
555     }
556 }
557 
stmI2cMasterDmaRxDone(void * cookie,uint16_t bytesLeft,int err)558 static void stmI2cMasterDmaRxDone(void *cookie, uint16_t bytesLeft, int err)
559 {
560     struct StmI2cDev *pdev = cookie;
561     struct I2cStmState *state = &pdev->state;
562 
563     state->rx.offset = state->rx.size - bytesLeft;
564     state->rx.size = 0;
565 
566     stmI2cDmaDisable(pdev);
567     stmI2cStopEnable(pdev);
568     stmI2cMasterTxRxDone(pdev, err);
569 }
570 
stmI2cMasterDmaCancel(struct StmI2cDev * pdev)571 static inline void stmI2cMasterDmaCancel(struct StmI2cDev *pdev)
572 {
573     struct I2cStmState *state = &pdev->state;
574 
575     dmaStop(I2C_DMA_BUS, pdev->board->dmaRx.stream);
576     state->rx.offset = state->rx.size - dmaBytesLeft(I2C_DMA_BUS,
577             pdev->board->dmaRx.stream);
578     dmaStop(I2C_DMA_BUS, pdev->board->dmaTx.stream);
579     state->tx.offset = state->tx.size - dmaBytesLeft(I2C_DMA_BUS,
580             pdev->board->dmaTx.stream);
581 
582     stmI2cDmaDisable(pdev);
583 }
584 
stmI2cMasterStartDma(struct StmI2cDev * pdev,const struct StmI2cDmaCfg * dmaCfg,const void * buf,size_t size,DmaCallbackF callback,bool rx,bool last)585 static inline void stmI2cMasterStartDma(struct StmI2cDev *pdev,
586         const struct StmI2cDmaCfg *dmaCfg, const void *buf,
587         size_t size, DmaCallbackF callback, bool rx, bool last)
588 {
589     struct StmI2c *regs = pdev->cfg->regs;
590     struct dmaMode mode;
591 
592     memset(&mode, 0, sizeof(mode));
593     mode.priority = DMA_PRIORITY_HIGH;
594     mode.direction = rx ? DMA_DIRECTION_PERIPH_TO_MEM :
595             DMA_DIRECTION_MEM_TO_PERIPH;
596     mode.periphAddr = (uintptr_t)&regs->DR;
597     mode.minc = true;
598     mode.channel = dmaCfg->channel;
599 
600     dmaStart(I2C_DMA_BUS, dmaCfg->stream, buf, size, &mode, callback, pdev);
601     if (last)
602         stmI2cIrqEnable(pdev, I2C_CR2_LAST);
603     else
604         stmI2cIrqDisable(pdev, I2C_CR2_LAST);
605     stmI2cDmaEnable(pdev);
606 }
607 
stmI2cMasterSentStart(struct StmI2cDev * pdev)608 static void stmI2cMasterSentStart(struct StmI2cDev *pdev)
609 {
610     struct I2cStmState *state = &pdev->state;
611     struct StmI2c *regs = pdev->cfg->regs;
612 
613     if (atomicReadByte(&state->masterState) == STM_I2C_MASTER_START) {
614         if (state->tx.size > 0) {
615             atomicWriteByte(&state->masterState, STM_I2C_MASTER_TX_ADDR);
616             regs->DR = pdev->addr << 1;
617         } else {
618             atomicWriteByte(&state->masterState, STM_I2C_MASTER_RX_ADDR);
619             stmI2cAckEnable(pdev);
620             regs->DR = (pdev->addr << 1) | 0x01;
621         }
622     }
623 }
624 
stmI2cMasterSentAddr(struct StmI2cDev * pdev)625 static void stmI2cMasterSentAddr(struct StmI2cDev *pdev)
626 {
627     struct I2cStmState *state = &pdev->state;
628     struct StmI2c *regs = pdev->cfg->regs;
629     uint8_t masterState = atomicReadByte(&state->masterState);
630 
631     if (masterState == STM_I2C_MASTER_TX_ADDR) {
632         stmI2cMasterStartDma(pdev, &pdev->board->dmaTx, state->tx.cbuf,
633                 state->tx.size, stmI2cMasterDmaTxDone, false, !!state->rx.size);
634         regs->SR2; // Clear ADDR
635         atomicWriteByte(&state->masterState, STM_I2C_MASTER_TX_DATA);
636     } else if (masterState == STM_I2C_MASTER_RX_ADDR) {
637         if (state->rx.size == 1) // Generate NACK here for 1 byte transfers
638             stmI2cAckDisable(pdev);
639 
640         stmI2cMasterStartDma(pdev, &pdev->board->dmaRx, state->rx.buf,
641                 state->rx.size, stmI2cMasterDmaRxDone, true,
642                 state->rx.size > 1);
643         regs->SR2; // Clear ADDR
644         atomicWriteByte(&state->masterState, STM_I2C_MASTER_RX_DATA);
645     }
646 }
647 
stmI2cMasterNakRxed(struct StmI2cDev * pdev)648 static void stmI2cMasterNakRxed(struct StmI2cDev *pdev)
649 {
650     struct I2cStmState *state = &pdev->state;
651     struct StmI2c *regs = pdev->cfg->regs;
652     uint8_t masterState = atomicReadByte(&state->masterState);
653     int err = 0;
654 
655     if (masterState == STM_I2C_MASTER_TX_ADDR ||
656             masterState == STM_I2C_MASTER_RX_ADDR) {
657         err = -ENXIO;
658     } else if (masterState == STM_I2C_MASTER_TX_DATA ||
659             masterState == STM_I2C_MASTER_RX_DATA) {
660         stmI2cMasterDmaCancel(pdev);
661         err = -EIO;
662     }
663 
664     if (err) {
665         regs->SR1 &= ~I2C_SR1_AF;
666         stmI2cStopEnable(pdev);
667         stmI2cMasterTxRxDone(pdev, err);
668     }
669 }
670 
stmI2cMasterBusError(struct StmI2cDev * pdev)671 static void stmI2cMasterBusError(struct StmI2cDev *pdev)
672 {
673     struct StmI2c *regs = pdev->cfg->regs;
674 
675     stmI2cMasterDmaCancel(pdev);
676     regs->SR1 &= ~I2C_SR1_BERR;
677     stmI2cMasterTxRxDone(pdev, -EIO);
678 }
679 
stmI2cMasterArbitrationLoss(struct StmI2cDev * pdev)680 static void stmI2cMasterArbitrationLoss(struct StmI2cDev *pdev)
681 {
682     struct StmI2c *regs = pdev->cfg->regs;
683 
684     stmI2cMasterDmaCancel(pdev);
685     regs->SR1 &= ~I2C_SR1_ARLO;
686     stmI2cMasterTxRxDone(pdev, -EBUSY);
687 }
688 
stmI2cMasterUnexpectedError(struct StmI2cDev * pdev)689 static void stmI2cMasterUnexpectedError(struct StmI2cDev *pdev)
690 {
691     struct StmI2c *regs = pdev->cfg->regs;
692 
693     osLog(LOG_ERROR, "Unexpected I2C ERR interrupt: SR1 = %04lX, SR2 = %04lX\n",
694             regs->SR1, regs->SR2);
695 
696     stmI2cMasterDmaCancel(pdev);
697     regs->SR1 = 0;
698     stmI2cMasterTxRxDone(pdev, -EIO);
699 }
700 
stmI2cIsrEvent(struct StmI2cDev * pdev)701 static void stmI2cIsrEvent(struct StmI2cDev *pdev)
702 {
703     struct StmI2c *regs = pdev->cfg->regs;
704     uint16_t sr1 = regs->SR1;
705 
706     if (pdev->state.mode == STM_I2C_SLAVE) {
707         if (sr1 & I2C_SR1_ADDR) {
708             stmI2cSlaveAddrMatched(pdev);
709         } else if (sr1 & I2C_SR1_RXNE) {
710             stmI2cSlaveRxBufNotEmpty(pdev);
711         } else if (sr1 & I2C_SR1_TXE) {
712             stmI2cSlaveTxBufEmpty(pdev);
713         } else if (sr1 & I2C_SR1_BTF) {
714             if (regs->SR2 & I2C_SR2_TRA)
715                 stmI2cSlaveTxBufEmpty(pdev);
716            else
717                 stmI2cSlaveRxBufNotEmpty(pdev);
718         } else if (sr1 & I2C_SR1_STOPF) {
719             stmI2cSlaveStopRxed(pdev);
720         }
721         /* TODO: other flags */
722     } else if (pdev->state.mode == STM_I2C_MASTER) {
723         if (sr1 & I2C_SR1_SB)
724             stmI2cMasterSentStart(pdev);
725         else if (sr1 & I2C_SR1_ADDR)
726             stmI2cMasterSentAddr(pdev);
727     }
728 }
729 
stmI2cIsrError(struct StmI2cDev * pdev)730 static void stmI2cIsrError(struct StmI2cDev *pdev)
731 {
732     struct StmI2c *regs = pdev->cfg->regs;
733     uint16_t sr1 = regs->SR1;
734 
735     if (pdev->state.mode == STM_I2C_SLAVE) {
736         if (sr1 & I2C_SR1_AF)
737             stmI2cSlaveNakRxed(pdev);
738         /* TODO: other flags */
739     } else if (pdev->state.mode == STM_I2C_MASTER) {
740         if (sr1 & I2C_SR1_AF)
741             stmI2cMasterNakRxed(pdev);
742         else if (sr1 & I2C_SR1_BERR)
743             stmI2cMasterBusError(pdev);
744         else if (sr1 & I2C_SR1_ARLO)
745             stmI2cMasterArbitrationLoss(pdev);
746         else
747             stmI2cMasterUnexpectedError(pdev);
748     }
749 }
750 
751 #define DECLARE_IRQ_HANDLERS(_n)                \
752     extern void I2C##_n##_EV_IRQHandler();      \
753     extern void I2C##_n##_ER_IRQHandler();      \
754                                                 \
755     extern void I2C##_n##_EV_IRQHandler()       \
756     {                                           \
757         stmI2cIsrEvent(&mStmI2cDevs[_n - 1]);  \
758     }                                           \
759                                                 \
760     extern void I2C##_n##_ER_IRQHandler()       \
761     {                                           \
762         stmI2cIsrError(&mStmI2cDevs[_n - 1]);  \
763     }
764 
765 DECLARE_IRQ_HANDLERS(1);
766 DECLARE_IRQ_HANDLERS(2);
767 DECLARE_IRQ_HANDLERS(3);
768 
stmI2cGpioInit(const struct StmI2cBoardCfg * board,const struct StmI2cGpioCfg * cfg)769 static inline struct Gpio* stmI2cGpioInit(const struct StmI2cBoardCfg *board, const struct StmI2cGpioCfg *cfg)
770 {
771     struct Gpio* gpio = gpioRequest(cfg->gpioNum);
772     gpioConfigAlt(gpio, board->gpioSpeed, board->gpioPull, GPIO_OUT_OPEN_DRAIN,
773             cfg->func);
774 
775     return gpio;
776 }
777 
i2cMasterRequest(uint32_t busId,uint32_t speed)778 int i2cMasterRequest(uint32_t busId, uint32_t speed)
779 {
780     if (busId >= ARRAY_SIZE(mStmI2cDevs))
781         return -EINVAL;
782 
783     const struct StmI2cBoardCfg *board = boardStmI2cCfg(busId);
784     if (!board)
785         return -EINVAL;
786 
787     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
788     struct I2cStmState *state = &pdev->state;
789     const struct StmI2cCfg *cfg = &mStmI2cCfgs[busId];
790 
791     if (state->mode == STM_I2C_DISABLED) {
792         state->mode = STM_I2C_MASTER;
793 
794         pdev->cfg = cfg;
795         pdev->board = board;
796         pdev->next = 2;
797         pdev->last = 1;
798         atomicBitsetInit(mXfersValid, I2C_MAX_QUEUE_DEPTH);
799 
800         pdev->scl = stmI2cGpioInit(board, &board->gpioScl);
801         pdev->sda = stmI2cGpioInit(board, &board->gpioSda);
802 
803         pwrUnitClock(PERIPH_BUS_APB1, cfg->clock, true);
804 
805         stmI2cDisable(pdev);
806 
807         pwrUnitReset(PERIPH_BUS_APB1, cfg->clock, true);
808         pwrUnitReset(PERIPH_BUS_APB1, cfg->clock, false);
809 
810         stmI2cIrqEnable(pdev, I2C_CR2_ITEVTEN | I2C_CR2_ITERREN);
811         stmI2cSpeedSet(pdev, speed);
812         atomicWriteByte(&state->masterState, STM_I2C_MASTER_IDLE);
813 
814         NVIC_EnableIRQ(cfg->irqEr);
815         NVIC_EnableIRQ(cfg->irqEv);
816 
817         stmI2cEnable(pdev);
818         return 0;
819     } else {
820         return -EBUSY;
821     }
822 }
823 
i2cMasterRelease(uint32_t busId)824 int i2cMasterRelease(uint32_t busId)
825 {
826     if (busId >= ARRAY_SIZE(mStmI2cDevs))
827         return -EINVAL;
828 
829     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
830     struct I2cStmState *state = &pdev->state;
831     const struct StmI2cCfg *cfg = pdev->cfg;
832 
833     if (state->mode == STM_I2C_MASTER) {
834         if (atomicReadByte(&state->masterState) == STM_I2C_MASTER_IDLE) {
835             state->mode = STM_I2C_DISABLED;
836             stmI2cIrqEnable(pdev, I2C_CR2_ITERREN | I2C_CR2_ITEVTEN);
837             stmI2cDisable(pdev);
838             pwrUnitClock(PERIPH_BUS_APB1, cfg->clock, false);
839 
840             gpioRelease(pdev->scl);
841             gpioRelease(pdev->sda);
842 
843             return 0;
844         } else {
845             return -EBUSY;
846         }
847     } else {
848         return -EINVAL;
849     }
850 }
851 
852 
i2cMasterTxRx(uint32_t busId,uint32_t addr,const void * txBuf,size_t txSize,void * rxBuf,size_t rxSize,I2cCallbackF callback,void * cookie)853 int i2cMasterTxRx(uint32_t busId, uint32_t addr,
854         const void *txBuf, size_t txSize, void *rxBuf, size_t rxSize,
855         I2cCallbackF callback, void *cookie)
856 {
857     uint32_t id;
858 
859     if (busId >= ARRAY_SIZE(mStmI2cDevs))
860         return -EINVAL;
861     else if (addr & 0x80)
862         return -ENXIO;
863 
864     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
865     struct I2cStmState *state = &pdev->state;
866 
867     if (state->mode != STM_I2C_MASTER)
868         return -EINVAL;
869 
870     struct StmI2cXfer *xfer = stmI2cGetXfer();
871 
872     if (xfer) {
873         xfer->busId = busId;
874         xfer->addr = addr;
875         xfer->txBuf = txBuf;
876         xfer->txSize = txSize;
877         xfer->rxBuf = rxBuf;
878         xfer->rxSize = rxSize;
879         xfer->callback = callback;
880         xfer->cookie = cookie;
881         xfer->tid = osGetCurrentTid();
882 
883         do {
884             id = atomicAdd32bits(&pdev->last, 1);
885         } while (!id);
886 
887         // after this point the transfer can be picked up by the transfer
888         // complete interrupt
889         atomicWrite32bits(&xfer->id, id);
890 
891         // only initiate transfer here if we are in IDLE. Otherwise the transfer
892         // completion interrupt will start the next transfer (not necessarily
893         // this one)
894         if (atomicCmpXchgByte((uint8_t *)&state->masterState,
895                 STM_I2C_MASTER_IDLE, STM_I2C_MASTER_START)) {
896             // it is possible for this transfer to already be complete by the
897             // time we get here. if so, transfer->id will have been set to 0.
898             if (atomicCmpXchg32bits(&xfer->id, id, 0)) {
899                 pdev->addr = xfer->addr;
900                 state->tx.cbuf = xfer->txBuf;
901                 state->tx.offset = 0;
902                 state->tx.size = xfer->txSize;
903                 state->tx.callback = xfer->callback;
904                 state->tx.cookie = xfer->cookie;
905                 state->rx.buf = xfer->rxBuf;
906                 state->rx.offset = 0;
907                 state->rx.size = xfer->rxSize;
908                 state->rx.callback = NULL;
909                 state->rx.cookie = NULL;
910                 state->tid = xfer->tid;
911                 if (pdev->board->sleepDev >= 0)
912                     platRequestDevInSleepMode(pdev->board->sleepDev, 12);
913                 stmI2cPutXfer(xfer);
914                 stmI2cStartEnable(pdev);
915             }
916         }
917         return 0;
918     } else {
919         return -EBUSY;
920     }
921 }
922 
i2cSlaveRequest(uint32_t busId,uint32_t addr)923 int i2cSlaveRequest(uint32_t busId, uint32_t addr)
924 {
925     if (busId >= ARRAY_SIZE(mStmI2cDevs))
926         return -EINVAL;
927 
928     const struct StmI2cBoardCfg *board = boardStmI2cCfg(busId);
929     if (!board)
930         return -EINVAL;
931 
932     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
933     const struct StmI2cCfg *cfg = &mStmI2cCfgs[busId];
934 
935     if (pdev->state.mode == STM_I2C_DISABLED) {
936         pdev->state.mode = STM_I2C_SLAVE;
937 
938         pdev->addr = addr;
939         pdev->cfg = cfg;
940         pdev->board = board;
941 
942         pdev->scl = stmI2cGpioInit(board, &board->gpioScl);
943         pdev->sda = stmI2cGpioInit(board, &board->gpioSda);
944 
945         return 0;
946     } else {
947         return -EBUSY;
948     }
949 }
950 
i2cSlaveRelease(uint32_t busId)951 int i2cSlaveRelease(uint32_t busId)
952 {
953     if (busId >= ARRAY_SIZE(mStmI2cDevs))
954         return -EINVAL;
955 
956     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
957     const struct StmI2cCfg *cfg = pdev->cfg;
958 
959     if (pdev->state.mode == STM_I2C_SLAVE) {
960         pdev->state.mode = STM_I2C_DISABLED;
961         stmI2cIrqDisable(pdev, I2C_CR2_ITERREN | I2C_CR2_ITEVTEN);
962         stmI2cAckDisable(pdev);
963         stmI2cDisable(pdev);
964         pwrUnitClock(PERIPH_BUS_APB1, cfg->clock, false);
965 
966         gpioRelease(pdev->scl);
967         gpioRelease(pdev->sda);
968 
969         return 0;
970     } else {
971         return -EBUSY;
972     }
973 }
974 
i2cSlaveEnableRx(uint32_t busId,void * rxBuf,size_t rxSize,I2cCallbackF callback,void * cookie)975 void i2cSlaveEnableRx(uint32_t busId, void *rxBuf, size_t rxSize,
976         I2cCallbackF callback, void *cookie)
977 {
978     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
979     const struct StmI2cCfg *cfg = pdev->cfg;
980     struct I2cStmState *state = &pdev->state;
981 
982     if (pdev->state.mode == STM_I2C_SLAVE) {
983         state->rx.buf = rxBuf;
984         state->rx.offset = 0;
985         state->rx.size = rxSize;
986         state->rx.callback = callback;
987         state->rx.cookie = cookie;
988         state->slaveState = STM_I2C_SLAVE_RX_ARMED;
989         state->tid = osGetCurrentTid();
990 
991         pwrUnitClock(PERIPH_BUS_APB1, cfg->clock, true);
992         pwrUnitReset(PERIPH_BUS_APB1, cfg->clock, true);
993         pwrUnitReset(PERIPH_BUS_APB1, cfg->clock, false);
994 
995         NVIC_EnableIRQ(cfg->irqEr);
996         NVIC_EnableIRQ(cfg->irqEv);
997 
998         stmI2cEnable(pdev);
999         cfg->regs->OAR1 = I2C_OAR1_ADD7(pdev->addr);
1000         stmI2cIrqEnable(pdev, I2C_CR2_ITERREN | I2C_CR2_ITEVTEN);
1001         stmI2cAckEnable(pdev);
1002     }
1003 }
1004 
i2cSlaveTx(uint32_t busId,const void * txBuf,uint8_t byte,size_t txSize,I2cCallbackF callback,void * cookie)1005 static int i2cSlaveTx(uint32_t busId, const void *txBuf, uint8_t byte,
1006         size_t txSize, I2cCallbackF callback, void *cookie)
1007 {
1008     struct StmI2cDev *pdev = &mStmI2cDevs[busId];
1009     struct I2cStmState *state = &pdev->state;
1010 
1011     if (pdev->state.mode == STM_I2C_SLAVE) {
1012         if (state->slaveState == STM_I2C_SLAVE_RX)
1013             return -EBUSY;
1014 
1015         if (txBuf) {
1016             state->tx.cbuf = txBuf;
1017             state->tx.preamble = false;
1018         } else {
1019             state->tx.byte = byte;
1020             state->tx.preamble = true;
1021         }
1022         state->tx.offset = 0;
1023         state->tx.size = txSize;
1024         state->tx.callback = callback;
1025         state->tx.cookie = cookie;
1026 
1027         if (state->slaveState == STM_I2C_SLAVE_TX_ARMED) {
1028             state->slaveState = STM_I2C_SLAVE_TX;
1029             stmI2cSlaveTxNextByte(pdev);
1030             stmI2cIrqEnable(pdev, I2C_CR2_ITBUFEN);
1031         } else {
1032             state->slaveState = STM_I2C_SLAVE_TX;
1033         }
1034 
1035         return 0;
1036     } else {
1037         return -EBUSY;
1038     }
1039 }
1040 
i2cSlaveTxPreamble(uint32_t busId,uint8_t byte,I2cCallbackF callback,void * cookie)1041 int i2cSlaveTxPreamble(uint32_t busId, uint8_t byte, I2cCallbackF callback,
1042         void *cookie)
1043 {
1044     return i2cSlaveTx(busId, NULL, byte, 0, callback, cookie);
1045 }
1046 
i2cSlaveTxPacket(uint32_t busId,const void * txBuf,size_t txSize,I2cCallbackF callback,void * cookie)1047 int i2cSlaveTxPacket(uint32_t busId, const void *txBuf, size_t txSize,
1048         I2cCallbackF callback, void *cookie)
1049 {
1050     return i2cSlaveTx(busId, txBuf, 0, txSize, callback, cookie);
1051 }
1052