Skip to content

Commit 739688f

Browse files
jrosbergxiaoxiang781216
authored andcommitted
sama5/twi: add support for flexcom twi
1 parent 725dfd5 commit 739688f

File tree

4 files changed

+234
-5
lines changed

4 files changed

+234
-5
lines changed

arch/arm/src/sama5/Kconfig

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,26 @@ config SAMA5_FLEXCOM_TWI
203203
bool
204204
default n
205205

206+
config SAMA5_FLEXCOM_TWI0
207+
bool
208+
default n
209+
210+
config SAMA5_FLEXCOM_TWI1
211+
bool
212+
default n
213+
214+
config SAMA5_FLEXCOM_TWI2
215+
bool
216+
default n
217+
218+
config SAMA5_FLEXCOM_TWI3
219+
bool
220+
default n
221+
222+
config SAMA5_FLEXCOM_TWI4
223+
bool
224+
default n
225+
206226
# Chip Selection
207227

208228
config ARCH_CHIP_SAMA5D2
@@ -864,6 +884,7 @@ config SAMA5_FLEXCOM0_SPI
864884
config SAMA5_FLEXCOM0_TWI
865885
bool "TWI"
866886
select SAMA5_FLEXCOM_TWI
887+
select SAMA5_FLEXCOM_TWI0
867888

868889
endchoice # FLEXCOM0 Configuration
869890

@@ -885,6 +906,7 @@ config SAMA5_FLEXCOM1_SPI
885906
config SAMA5_FLEXCOM1_TWI
886907
bool "TWI"
887908
select SAMA5_FLEXCOM_TWI
909+
select SAMA5_FLEXCOM_TWI1
888910

889911
endchoice # FLEXCOM1 Configuration
890912

@@ -906,6 +928,7 @@ config SAMA5_FLEXCOM2_SPI
906928
config SAMA5_FLEXCOM2_TWI
907929
bool "TWI"
908930
select SAMA5_FLEXCOM_TWI
931+
select SAMA5_FLEXCOM_TWI2
909932

910933
endchoice # FLEXCOM2 Configuration
911934

@@ -927,6 +950,7 @@ config SAMA5_FLEXCOM3_SPI
927950
config SAMA5_FLEXCOM3_TWI
928951
bool "TWI"
929952
select SAMA5_FLEXCOM_TWI
953+
select SAMA5_FLEXCOM_TWI3
930954

931955
endchoice # FLEXCOM3 Configuration
932956

@@ -948,6 +972,7 @@ config SAMA5_FLEXCOM4_SPI
948972
config SAMA5_FLEXCOM4_TWI
949973
bool "TWI"
950974
select SAMA5_FLEXCOM_TWI
975+
select SAMA5_FLEXCOM_TWI4
951976

952977
endchoice # FLEXCOM4 Configuration
953978
endmenu # Flexcom Configuration
@@ -3172,7 +3197,7 @@ config SAMA5_FLEXCOM_SPI_DMADEBUG
31723197
endmenu # Flexcom SPI device driver options
31733198
endif # SAMA5_FLEXCOM0_SPI || SAMA5_FLEXCOM1_SPI || SAMA5_FLEXCOM2_SPI || SAMA5_FLEXCOM3_SPI || SAMA5_FLEXCOM4_SPI
31743199

3175-
if SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3
3200+
if SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3 || SAMA5_FLEXCOM_TWI
31763201

31773202
menu "TWI device driver options"
31783203

@@ -3196,6 +3221,32 @@ config SAMA5_TWI3_FREQUENCY
31963221
default 100000
31973222
depends on SAMA5_TWI3
31983223

3224+
config SAMA5_TWI_FC0_FREQUENCY
3225+
int "TWI4 (flexcom-0) Frequency"
3226+
default 100000
3227+
depends on SAMA5_FLEXCOM_TWI0
3228+
3229+
config SAMA5_TWI_FC1_FREQUENCY
3230+
int "TWI5 (flexcom-1) Frequency"
3231+
default 100000
3232+
depends on SAMA5_FLEXCOM_TWI1
3233+
3234+
config SAMA5_TWI_FC2_FREQUENCY
3235+
int "TWI6 (flexcom-2) Frequency"
3236+
default 100000
3237+
depends on SAMA5_FLEXCOM_TWI2
3238+
3239+
config SAMA5_TWI_FC3_FREQUENCY
3240+
int "TWI7 (flexcom-3) Frequency"
3241+
default 100000
3242+
depends on SAMA5_FLEXCOM_TWI3
3243+
3244+
config SAMA5_TWI_FC4_FREQUENCY
3245+
int "TWI8 (flexcom-4) Frequency"
3246+
default 100000
3247+
depends on SAMA5_FLEXCOM_TWI4
3248+
3249+
31993250
config SAMA5_TWI_REGDEBUG
32003251
bool "TWI register level debug"
32013252
depends on DEBUG_I2C_INFO
@@ -3205,7 +3256,7 @@ config SAMA5_TWI_REGDEBUG
32053256
Very invasive! Requires also CONFIG_DEBUG_I2C_INFO.
32063257

32073258
endmenu # TWI device driver options
3208-
endif # SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3
3259+
endif # SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3 | SAMA5_FLEXCOM_TWI
32093260

32103261
if SAMA5_SSC0 || SAMA5_SSC1
32113262
menu "SSC Configuration"

arch/arm/src/sama5/Make.defs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ else
187187
ifeq ($(CONFIG_SAMA5_TWI2),y)
188188
CHIP_CSRCS += sam_twi.c
189189
endif
190+
ifeq ($(CONFIG_SAMA5_FLEXCOM_TWI),y)
191+
CHIP_CSRCS += sam_twi.c
192+
endif
190193
endif
191194
endif
192195

arch/arm/src/sama5/hardware/_sama5d2x_memorymap.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,10 @@
522522
#define SAM_PIOC_VBASE SAM_PIO_IOGROUPC_VBASE
523523
#define SAM_PIOD_VBASE SAM_PIO_IOGROUPD_VBASE
524524

525+
#define SAM_FLEXCOM_USART_OFFSET (0x200)
526+
#define SAM_FLEXCOM_SPI_OFFSET (0x400)
527+
#define SAM_FLEXCOM_TWI_OFFSET (0x600)
528+
525529
/* NuttX virtual base address
526530
*
527531
* The boot logic will create a temporarily mapping based on where NuttX is

arch/arm/src/sama5/sam_twi.c

Lines changed: 174 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,15 @@
7474
#include "sam_periphclks.h"
7575
#include "sam_pio.h"
7676
#include "sam_twi.h"
77+
#include "hardware/sam_flexcom.h"
7778

7879
#if defined(CONFIG_SAMA5_TWI0) || defined(CONFIG_SAMA5_TWI1) || \
79-
defined(CONFIG_SAMA5_TWI2) || defined(CONFIG_SAMA5_TWI3)
80+
defined(CONFIG_SAMA5_TWI2) || defined(CONFIG_SAMA5_TWI3) || \
81+
defined(CONFIG_SAMA5_FLEXCOM0_TWI) || \
82+
defined(CONFIG_SAMA5_FLEXCOM1_TWI) || \
83+
defined(CONFIG_SAMA5_FLEXCOM2_TWI) || \
84+
defined(CONFIG_SAMA5_FLEXCOM3_TWI) || \
85+
defined(CONFIG_SAMA5_FLEXCOM4_TWI)
8086

8187
/****************************************************************************
8288
* Pre-processor Definitions
@@ -329,6 +335,117 @@ static struct twi_dev_s g_twi3 =
329335
};
330336
#endif
331337

338+
#ifdef CONFIG_SAMA5_FLEXCOM0_TWI
339+
static const struct twi_attr_s g_twi4attr =
340+
{
341+
.twi = 4,
342+
.pid = SAM_PID_FLEXCOM0,
343+
.irq = SAM_IRQ_FLEXCOM0,
344+
.sclcfg = PIO_TWI4_CK,
345+
.sdacfg = PIO_TWI4_D,
346+
.base = SAM_FLEXCOM0_VBASE + SAM_FLEXCOM_TWI_OFFSET
347+
};
348+
349+
static struct twi_dev_s g_twi4 =
350+
{
351+
.dev =
352+
{
353+
.ops = &g_twiops,
354+
},
355+
.attr = &g_twi4attr,
356+
.lock = NXMUTEX_INITIALIZER,
357+
.waitsem = SEM_INITIALIZER(0),
358+
};
359+
#endif
360+
#ifdef CONFIG_SAMA5_FLEXCOM1_TWI
361+
static const struct twi_attr_s g_twi5attr =
362+
{
363+
.twi = 5,
364+
.pid = SAM_PID_FLEXCOM1,
365+
.irq = SAM_IRQ_FLEXCOM1,
366+
.sclcfg = PIO_TWI5_CK,
367+
.sdacfg = PIO_TWI5_D,
368+
.base = SAM_FLEXCOM1_VBASE + SAM_FLEXCOM_TWI_OFFSET
369+
};
370+
371+
static struct twi_dev_s g_twi4 =
372+
{
373+
.dev =
374+
{
375+
.ops = &g_twiops,
376+
},
377+
.attr = &g_twi5attr,
378+
.lock = NXMUTEX_INITIALIZER,
379+
.waitsem = SEM_INITIALIZER(0),
380+
};
381+
#endif
382+
#ifdef CONFIG_SAMA5_FLEXCOM2_TWI
383+
static const struct twi_attr_s g_twi6attr =
384+
{
385+
.twi = 6,
386+
.pid = SAM_PID_FLEXCOM2,
387+
.irq = SAM_IRQ_FLEXCOM2,
388+
.sclcfg = PIO_TWI6_CK,
389+
.sdacfg = PIO_TWI6_D,
390+
.base = SAM_FLEXCOM2_VBASE + SAM_FLEXCOM_TWI_OFFSET
391+
};
392+
393+
static struct twi_dev_s g_twi6 =
394+
{
395+
.dev =
396+
{
397+
.ops = &g_twiops,
398+
},
399+
.attr = &g_twi6attr,
400+
.lock = NXMUTEX_INITIALIZER,
401+
.waitsem = SEM_INITIALIZER(0),
402+
};
403+
#endif
404+
#ifdef CONFIG_SAMA5_FLEXCOM3_TWI
405+
static const struct twi_attr_s g_twi7attr =
406+
{
407+
.twi = 7,
408+
.pid = SAM_PID_FLEXCOM3,
409+
.irq = SAM_IRQ_FLEXCOM3,
410+
.sclcfg = PIO_TWI7_CK,
411+
.sdacfg = PIO_TWI7_D,
412+
.base = SAM_FLEXCOM3_VBASE + SAM_FLEXCOM_TWI_OFFSET
413+
};
414+
415+
static struct twi_dev_s g_twi7 =
416+
{
417+
.dev =
418+
{
419+
.ops = &g_twiops,
420+
},
421+
.attr = &g_twi7attr,
422+
.lock = NXMUTEX_INITIALIZER,
423+
.waitsem = SEM_INITIALIZER(0),
424+
};
425+
#endif
426+
#ifdef CONFIG_SAMA5_FLEXCOM4_TWI
427+
static const struct twi_attr_s g_twi8attr =
428+
{
429+
.twi = 8,
430+
.pid = SAM_PID_FLEXCOM3,
431+
.irq = SAM_IRQ_FLEXCOM3,
432+
.sclcfg = PIO_TWI8_CK,
433+
.sdacfg = PIO_TWI8_D,
434+
.base = SAM_FLEXCOM4_VBASE + SAM_FLEXCOM_TWI_OFFSET
435+
};
436+
437+
static struct twi_dev_s g_twi8 =
438+
{
439+
.dev =
440+
{
441+
.ops = &g_twiops,
442+
},
443+
.attr = &g_twi8attr,
444+
.lock = NXMUTEX_INITIALIZER,
445+
.waitsem = SEM_INITIALIZER(0),
446+
};
447+
#endif
448+
332449
/****************************************************************************
333450
* Private Functions
334451
****************************************************************************/
@@ -348,10 +465,9 @@ static struct twi_dev_s g_twi3 =
348465
* false: This is the same as the preceding register access.
349466
*
350467
****************************************************************************/
351-
352468
#ifdef CONFIG_SAMA5_TWI_REGDEBUG
353469
static bool twi_checkreg(struct twi_dev_s *priv, bool wr, uint32_t value,
354-
uint32_t address)
470+
uintptr_t address)
355471
{
356472
if (wr == priv->wrlast && /* Same kind of access? */
357473
value == priv->vallast && /* Same value? */
@@ -1249,6 +1365,61 @@ struct i2c_master_s *sam_i2cbus_initialize(int bus)
12491365
frequency = CONFIG_SAMA5_TWI3_FREQUENCY;
12501366
}
12511367
else
1368+
#endif
1369+
#ifdef CONFIG_SAMA5_FLEXCOM0_TWI
1370+
if (bus == 4)
1371+
{
1372+
/* Select up TWI4 (Flexcom-0) and the (initial) TWI frequency */
1373+
1374+
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX0_MR);
1375+
priv = &g_twi4;
1376+
frequency = CONFIG_SAMA5_TWI_FC0_FREQUENCY;
1377+
}
1378+
else
1379+
#endif
1380+
#ifdef CONFIG_SAMA5_FLEXCOM1_TWI
1381+
if (bus == 5)
1382+
{
1383+
/* Select up TWI5 (Flexcom-1) and the (initial) TWI frequency */
1384+
1385+
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX1_MR);
1386+
priv = &g_twi5;
1387+
frequency = CONFIG_SAMA5_TWI_FC1_FREQUENCY;
1388+
}
1389+
else
1390+
#endif
1391+
#ifdef CONFIG_SAMA5_FLEXCOM2_TWI
1392+
if (bus == 6)
1393+
{
1394+
/* Select up TWI6 (Flexcom-2) and the (initial) TWI frequency */
1395+
1396+
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX2_MR);
1397+
priv = &g_twi6;
1398+
frequency = CONFIG_SAMA5_TWI_FC2_FREQUENCY;
1399+
}
1400+
else
1401+
#endif
1402+
#ifdef CONFIG_SAMA5_FLEXCOM3_TWI
1403+
if (bus == 7)
1404+
{
1405+
/* Select up TWI7 (Flexcom-3) and the (initial) TWI frequency */
1406+
1407+
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX3_MR);
1408+
priv = &g_twi7;
1409+
frequency = CONFIG_SAMA5_TWI_FC3_FREQUENCY;
1410+
}
1411+
else
1412+
#endif
1413+
#ifdef CONFIG_SAMA5_FLEXCOM4_TWI
1414+
if (bus == 8)
1415+
{
1416+
/* Select up TWI8 (Flexcom-4) and the (initial) TWI frequency */
1417+
1418+
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX4_MR);
1419+
priv = &g_twi8;
1420+
frequency = CONFIG_SAMA5_TWI_FC4_FREQUENCY;
1421+
}
1422+
else
12521423
#endif
12531424
{
12541425
i2cerr("ERROR: Unsupported bus: TWI%d\n", bus);

0 commit comments

Comments
 (0)