Home | History | Annotate | Download | only in stm32
      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 
    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 
    244 static inline void stmI2cPutXfer(struct StmI2cXfer *xfer)
    245 {
    246     if (xfer)
    247         atomicBitsetClearBit(mXfersValid, xfer - mXfers);
    248 }
    249 
    250 static inline void stmI2cAckEnable(struct StmI2cDev *pdev)
    251 {
    252     pdev->cfg->regs->CR1 |= I2C_CR1_ACK;
    253 }
    254 
    255 static inline void stmI2cAckDisable(struct StmI2cDev *pdev)
    256 {
    257     pdev->cfg->regs->CR1 &= ~I2C_CR1_ACK;
    258 }
    259 
    260 static inline void stmI2cDmaEnable(struct StmI2cDev *pdev)
    261 {
    262     pdev->cfg->regs->CR2 |= I2C_CR2_DMAEN;
    263 }
    264 
    265 static inline void stmI2cDmaDisable(struct StmI2cDev *pdev)
    266 {
    267     pdev->cfg->regs->CR2 &= ~I2C_CR2_DMAEN;
    268 }
    269 
    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 
    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 
    288 static inline void stmI2cIrqEnable(struct StmI2cDev *pdev,
    289         uint32_t mask)
    290 {
    291     pdev->cfg->regs->CR2 |= mask;
    292 }
    293 
    294 static inline void stmI2cIrqDisable(struct StmI2cDev *pdev,
    295         uint32_t mask)
    296 {
    297     pdev->cfg->regs->CR2 &= ~mask;
    298 }
    299 
    300 static inline void stmI2cEnable(struct StmI2cDev *pdev)
    301 {
    302     pdev->cfg->regs->CR1 |= I2C_CR1_PE;
    303 }
    304 
    305 static inline void stmI2cDisable(struct StmI2cDev *pdev)
    306 {
    307     pdev->cfg->regs->CR1 &= ~I2C_CR1_PE;
    308 }
    309 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
   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 
   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 
   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