Skip to content

Commit 632586e

Browse files
committed
[Silicon Labs] Update TB Sense 2
* Update i2c driver to tackle multiple I2C object instances on different pins * Update pinmap to enable the extra peripherals of EFx32xG12 over EFx32xG1
1 parent 067fe9b commit 632586e

File tree

3 files changed

+297
-3
lines changed

3 files changed

+297
-3
lines changed

targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFR32MG12/PeripheralPins.c

Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,37 @@ const PinMap PinMap_I2C_SCL[] = {
100100
{PF7, I2C_0, 30},
101101
{PA0, I2C_0, 31},
102102

103+
{PA7, I2C_1, 0},
104+
{PA8, I2C_1, 1},
105+
{PA9, I2C_1, 2},
106+
{PI2, I2C_1, 3},
107+
{PI3, I2C_1, 4},
108+
{PB6, I2C_1, 5},
109+
{PB7, I2C_1, 6},
110+
{PB8, I2C_1, 7},
111+
{PB9, I2C_1, 8},
112+
{PB10, I2C_1, 9},
113+
{PJ14, I2C_1, 10},
114+
{PJ15, I2C_1, 11},
115+
{PC0, I2C_1, 12},
116+
{PC1, I2C_1, 13},
117+
{PC2, I2C_1, 14},
118+
{PC3, I2C_1, 15},
119+
{PC4, I2C_1, 16},
120+
{PC5, I2C_1, 17},
121+
{PF8, I2C_1, 20},
122+
{PF9, I2C_1, 21},
123+
{PF10, I2C_1, 22},
124+
{PF11, I2C_1, 23},
125+
{PF12, I2C_1, 24},
126+
{PF13, I2C_1, 25},
127+
{PF14, I2C_1, 26},
128+
{PF15, I2C_1, 27},
129+
{PK0, I2C_1, 28},
130+
{PK1, I2C_1, 29},
131+
{PK2, I2C_1, 30},
132+
{PA6, I2C_1, 31},
133+
103134
{NC , NC , NC}
104135
};
105136

@@ -139,7 +170,39 @@ const PinMap PinMap_I2C_SDA[] = {
139170
{PF6, I2C_0, 30},
140171
{PF7, I2C_0, 31},
141172

173+
{PA6, I2C_1, 0},
174+
{PA7, I2C_1, 1},
175+
{PA8, I2C_1, 2},
176+
{PA9, I2C_1, 3},
177+
{PI2, I2C_1, 4},
178+
{PI3, I2C_1, 5},
179+
{PB6, I2C_1, 6},
180+
{PB7, I2C_1, 7},
181+
{PB8, I2C_1, 8},
182+
{PB9, I2C_1, 9},
183+
{PB10, I2C_1, 10},
184+
{PJ14, I2C_1, 11},
185+
{PJ15, I2C_1, 12},
186+
{PC0, I2C_1, 13},
187+
{PC1, I2C_1, 14},
188+
{PC2, I2C_1, 15},
189+
{PC3, I2C_1, 16},
190+
{PC4, I2C_1, 17},
191+
{PC5, I2C_1, 18},
192+
{PF8, I2C_1, 21},
193+
{PF9, I2C_1, 22},
194+
{PF10, I2C_1, 23},
195+
{PF11, I2C_1, 24},
196+
{PF12, I2C_1, 25},
197+
{PF13, I2C_1, 26},
198+
{PF14, I2C_1, 27},
199+
{PF15, I2C_1, 28},
200+
{PK0, I2C_1, 29},
201+
{PK1, I2C_1, 30},
202+
{PK2, I2C_1, 31},
203+
142204
/* Not connected */
205+
143206
{NC , NC , NC}
144207
};
145208

@@ -220,6 +283,42 @@ const PinMap PinMap_SPI_MOSI[] = {
220283
{PF6, SPI_1, 30},
221284
{PF7, SPI_1, 31},
222285

286+
/* USART2 */
287+
{PA6, SPI_2, 1},
288+
{PA7, SPI_2, 2},
289+
{PA8, SPI_2, 3},
290+
{PA9, SPI_2, 4},
291+
{PI0, SPI_2, 5},
292+
{PI1, SPI_2, 6},
293+
{PI2, SPI_2, 7},
294+
{PI3, SPI_2, 8},
295+
{PB6, SPI_2, 9},
296+
{PB7, SPI_2, 10},
297+
{PB8, SPI_2, 11},
298+
{PB9, SPI_2, 12},
299+
{PB10, SPI_2, 13},
300+
{PF8, SPI_2, 21},
301+
{PF9, SPI_2, 22},
302+
{PF10, SPI_2, 23},
303+
{PF11, SPI_2, 24},
304+
{PF12, SPI_2, 25},
305+
{PF13, SPI_2, 26},
306+
{PF14, SPI_2, 27},
307+
{PF15, SPI_2, 28},
308+
{PK0, SPI_2, 29},
309+
{PK1, SPI_2, 30},
310+
{PK2, SPI_2, 31},
311+
312+
/* USART3 */
313+
{PJ14, SPI_3, 16},
314+
{PJ15, SPI_3, 17},
315+
{PC0, SPI_3, 18},
316+
{PC1, SPI_3, 19},
317+
{PC2, SPI_3, 20},
318+
{PC3, SPI_3, 21},
319+
{PC4, SPI_3, 22},
320+
{PC5, SPI_3, 23},
321+
223322
{NC , NC , NC}
224323
};
225324

@@ -262,6 +361,42 @@ const PinMap PinMap_SPI_MISO[] = {
262361
{PF7, SPI_1, 30},
263362
{PA0, SPI_1, 31},
264363

364+
/* USART2 */
365+
{PA6, SPI_2, 0},
366+
{PA7, SPI_2, 1},
367+
{PA8, SPI_2, 2},
368+
{PA9, SPI_2, 3},
369+
{PI0, SPI_2, 4},
370+
{PI1, SPI_2, 5},
371+
{PI2, SPI_2, 6},
372+
{PI3, SPI_2, 7},
373+
{PB6, SPI_2, 8},
374+
{PB7, SPI_2, 9},
375+
{PB8, SPI_2, 10},
376+
{PB9, SPI_2, 11},
377+
{PB10, SPI_2, 12},
378+
{PF8, SPI_2, 20},
379+
{PF9, SPI_2, 21},
380+
{PF10, SPI_2, 22},
381+
{PF11, SPI_2, 23},
382+
{PF12, SPI_2, 24},
383+
{PF13, SPI_2, 25},
384+
{PF14, SPI_2, 26},
385+
{PF15, SPI_2, 27},
386+
{PK0, SPI_2, 28},
387+
{PK1, SPI_2, 29},
388+
{PK2, SPI_2, 30},
389+
390+
/* USART3 */
391+
{PJ14, SPI_3, 15},
392+
{PJ15, SPI_3, 16},
393+
{PC0, SPI_3, 17},
394+
{PC1, SPI_3, 18},
395+
{PC2, SPI_3, 19},
396+
{PC3, SPI_3, 20},
397+
{PC4, SPI_3, 21},
398+
{PC5, SPI_3, 22},
399+
265400
{NC , NC , NC}
266401
};
267402

@@ -305,6 +440,42 @@ const PinMap PinMap_SPI_CLK[] = {
305440
{PA0, SPI_1, 30},
306441
{PA1, SPI_1, 31},
307442

443+
/* USART2 */
444+
{PA7, SPI_2, 0},
445+
{PA8, SPI_2, 1},
446+
{PA9, SPI_2, 2},
447+
{PI0, SPI_2, 3},
448+
{PI1, SPI_2, 4},
449+
{PI2, SPI_2, 5},
450+
{PI3, SPI_2, 6},
451+
{PB6, SPI_2, 7},
452+
{PB7, SPI_2, 8},
453+
{PB8, SPI_2, 9},
454+
{PB9, SPI_2, 10},
455+
{PB10, SPI_2, 11},
456+
{PF8, SPI_2, 19},
457+
{PF9, SPI_2, 20},
458+
{PF10, SPI_2, 21},
459+
{PF11, SPI_2, 22},
460+
{PF12, SPI_2, 23},
461+
{PF13, SPI_2, 24},
462+
{PF14, SPI_2, 25},
463+
{PF15, SPI_2, 26},
464+
{PK0, SPI_2, 27},
465+
{PK1, SPI_2, 28},
466+
{PK2, SPI_2, 29},
467+
{PA6, SPI_2, 31},
468+
469+
/* USART3 */
470+
{PJ14, SPI_3, 14},
471+
{PJ15, SPI_3, 15},
472+
{PC0, SPI_3, 16},
473+
{PC1, SPI_3, 17},
474+
{PC2, SPI_3, 18},
475+
{PC3, SPI_3, 19},
476+
{PC4, SPI_3, 20},
477+
{PC5, SPI_3, 21},
478+
308479
{NC , NC , NC}
309480
};
310481

@@ -346,6 +517,42 @@ const PinMap PinMap_SPI_CS[] = {
346517
{PF6, SPI_1, 27},
347518
{PF7, SPI_1, 28},
348519

520+
/* USART2 */
521+
{PA8, SPI_2, 0},
522+
{PA9, SPI_2, 1},
523+
{PI0, SPI_2, 2},
524+
{PI1, SPI_2, 3},
525+
{PI2, SPI_2, 4},
526+
{PI3, SPI_2, 5},
527+
{PB6, SPI_2, 6},
528+
{PB7, SPI_2, 7},
529+
{PB8, SPI_2, 8},
530+
{PB9, SPI_2, 9},
531+
{PB10, SPI_2, 10},
532+
{PF8, SPI_2, 18},
533+
{PF9, SPI_2, 19},
534+
{PF10, SPI_2, 20},
535+
{PF11, SPI_2, 21},
536+
{PF12, SPI_2, 22},
537+
{PF13, SPI_2, 23},
538+
{PF14, SPI_2, 24},
539+
{PF15, SPI_2, 25},
540+
{PK0, SPI_2, 26},
541+
{PK1, SPI_2, 27},
542+
{PK2, SPI_2, 28},
543+
{PA6, SPI_2, 30},
544+
{PA7, SPI_2, 31},
545+
546+
/* USART3 */
547+
{PJ14, SPI_3, 13},
548+
{PJ15, SPI_3, 14},
549+
{PC0, SPI_3, 15},
550+
{PC1, SPI_3, 16},
551+
{PC2, SPI_3, 17},
552+
{PC3, SPI_3, 18},
553+
{PC4, SPI_3, 19},
554+
{PC5, SPI_3, 20},
555+
349556
{NC , NC , NC}
350557
};
351558

@@ -385,6 +592,42 @@ const PinMap PinMap_UART_TX[] = {
385592
{PF6, USART_1, 30},
386593
{PF7, USART_1, 31},
387594

595+
/* USART2 */
596+
{PA6, USART_2, 1},
597+
{PA7, USART_2, 2},
598+
{PA8, USART_2, 3},
599+
{PA9, USART_2, 4},
600+
{PI0, USART_2, 5},
601+
{PI1, USART_2, 6},
602+
{PI2, USART_2, 7},
603+
{PI3, USART_2, 8},
604+
{PB6, USART_2, 9},
605+
{PB7, USART_2, 10},
606+
{PB8, USART_2, 11},
607+
{PB9, USART_2, 12},
608+
{PB10, USART_2, 13},
609+
{PF8, USART_2, 21},
610+
{PF9, USART_2, 22},
611+
{PF10, USART_2, 23},
612+
{PF11, USART_2, 24},
613+
{PF12, USART_2, 25},
614+
{PF13, USART_2, 26},
615+
{PF14, USART_2, 27},
616+
{PF15, USART_2, 28},
617+
{PK0, USART_2, 29},
618+
{PK1, USART_2, 30},
619+
{PK2, USART_2, 31},
620+
621+
/* USART3 */
622+
{PJ14, USART_3, 16},
623+
{PJ15, USART_3, 17},
624+
{PC0, USART_3, 18},
625+
{PC1, USART_3, 19},
626+
{PC2, USART_3, 20},
627+
{PC3, USART_3, 21},
628+
{PC4, USART_3, 22},
629+
{PC5, USART_3, 23},
630+
388631
{NC , NC , NC}
389632
};
390633

@@ -423,5 +666,41 @@ const PinMap PinMap_UART_RX[] = {
423666
{PF6, USART_1, 29},
424667
{PF7, USART_1, 30},
425668

669+
/* USART2 */
670+
{PA6, USART_2, 0},
671+
{PA7, USART_2, 1},
672+
{PA8, USART_2, 2},
673+
{PA9, USART_2, 3},
674+
{PI0, USART_2, 4},
675+
{PI1, USART_2, 5},
676+
{PI2, USART_2, 6},
677+
{PI3, USART_2, 7},
678+
{PB6, USART_2, 8},
679+
{PB7, USART_2, 9},
680+
{PB8, USART_2, 10},
681+
{PB9, USART_2, 11},
682+
{PB10, USART_2, 12},
683+
{PF8, USART_2, 20},
684+
{PF9, USART_2, 21},
685+
{PF10, USART_2, 22},
686+
{PF11, USART_2, 23},
687+
{PF12, USART_2, 24},
688+
{PF13, USART_2, 25},
689+
{PF14, USART_2, 26},
690+
{PF15, USART_2, 27},
691+
{PK0, USART_2, 28},
692+
{PK1, USART_2, 29},
693+
{PK2, USART_2, 30},
694+
695+
/* USART3 */
696+
{PJ14, USART_3, 15},
697+
{PJ15, USART_3, 16},
698+
{PC0, USART_3, 17},
699+
{PC1, USART_3, 18},
700+
{PC2, USART_3, 19},
701+
{PC3, USART_3, 20},
702+
{PC4, USART_3, 21},
703+
{PC5, USART_3, 22},
704+
426705
{NC , NC , NC}
427706
};

targets/TARGET_Silicon_Labs/TARGET_EFM32/common/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct dac_s {
5959
#if DEVICE_I2C
6060
struct i2c_s {
6161
I2C_TypeDef *i2c;
62+
uint32_t location;
6263
#if DEVICE_I2C_ASYNCH
6364
uint32_t events;
6465
I2C_TransferSeq_TypeDef xfer;

targets/TARGET_Silicon_Labs/TARGET_EFM32/i2c_api.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,13 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
121121
int loc = pinmap_merge(loc_sda, loc_scl);
122122
MBED_ASSERT(loc != NC);
123123
/* Set location */
124+
obj->i2c.location = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << _I2C_ROUTE_LOCATION_SHIFT);
124125
obj->i2c.i2c->ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << _I2C_ROUTE_LOCATION_SHIFT);
125126
#else
126127
obj->i2c.i2c->ROUTEPEN = I2C_ROUTEPEN_SDAPEN | I2C_ROUTEPEN_SCLPEN;
127-
obj->i2c.i2c->ROUTELOC0 = (pin_location(sda, PinMap_I2C_SDA) << _I2C_ROUTELOC0_SDALOC_SHIFT) |
128-
(pin_location(scl, PinMap_I2C_SCL) << _I2C_ROUTELOC0_SCLLOC_SHIFT);
128+
obj->i2c.location = (pin_location(sda, PinMap_I2C_SDA) << _I2C_ROUTELOC0_SDALOC_SHIFT) |
129+
(pin_location(scl, PinMap_I2C_SCL) << _I2C_ROUTELOC0_SCLLOC_SHIFT);
130+
obj->i2c.i2c->ROUTELOC0 = obj->i2c.location;
129131
#endif
130132

131133
/* Set up the pins for I2C use */
@@ -215,6 +217,13 @@ int i2c_start(i2c_t *obj)
215217
{
216218
I2C_TypeDef *i2c = obj->i2c.i2c;
217219

220+
/* Restore pin configuration in case we changed I2C object */
221+
#ifdef I2C_ROUTE_SDAPEN
222+
obj->i2c.i2c->ROUTE = obj->i2c.location;
223+
#else
224+
obj->i2c.i2c->ROUTELOC0 = obj->i2c.location;
225+
#endif
226+
218227
/* Ensure buffers are empty */
219228
i2c->CMD = I2C_CMD_CLEARPC | I2C_CMD_CLEARTX;
220229
if (i2c->IF & I2C_IF_RXDATAV) {
@@ -410,7 +419,6 @@ int i2c_slave_read(i2c_t *obj, char *data, int length)
410419
data[count] = i2c_byte_read(obj, 0);
411420
}
412421

413-
414422
return count;
415423

416424
}
@@ -459,6 +467,12 @@ void i2c_transfer_asynch(i2c_t *obj, const void *tx, size_t tx_length, void *rx,
459467
if((tx_length == 0) && (rx_length == 0)) return;
460468
// For now, we are assuming a solely interrupt-driven implementation.
461469

470+
#ifdef I2C_ROUTE_SDAPEN
471+
obj->i2c.i2c->ROUTE = obj->i2c.location;
472+
#else
473+
obj->i2c.i2c->ROUTELOC0 = obj->i2c.location;
474+
#endif
475+
462476
// Store transfer config
463477
obj->i2c.xfer.addr = address;
464478

0 commit comments

Comments
 (0)