sama5/twi: add support for flexcom twi
This commit is contained in:
parent
725dfd5db9
commit
739688f6c6
@ -203,6 +203,26 @@ config SAMA5_FLEXCOM_TWI
|
|||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config SAMA5_FLEXCOM_TWI0
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
|
config SAMA5_FLEXCOM_TWI1
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
|
config SAMA5_FLEXCOM_TWI2
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
|
config SAMA5_FLEXCOM_TWI3
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
|
config SAMA5_FLEXCOM_TWI4
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
# Chip Selection
|
# Chip Selection
|
||||||
|
|
||||||
config ARCH_CHIP_SAMA5D2
|
config ARCH_CHIP_SAMA5D2
|
||||||
@ -864,6 +884,7 @@ config SAMA5_FLEXCOM0_SPI
|
|||||||
config SAMA5_FLEXCOM0_TWI
|
config SAMA5_FLEXCOM0_TWI
|
||||||
bool "TWI"
|
bool "TWI"
|
||||||
select SAMA5_FLEXCOM_TWI
|
select SAMA5_FLEXCOM_TWI
|
||||||
|
select SAMA5_FLEXCOM_TWI0
|
||||||
|
|
||||||
endchoice # FLEXCOM0 Configuration
|
endchoice # FLEXCOM0 Configuration
|
||||||
|
|
||||||
@ -885,6 +906,7 @@ config SAMA5_FLEXCOM1_SPI
|
|||||||
config SAMA5_FLEXCOM1_TWI
|
config SAMA5_FLEXCOM1_TWI
|
||||||
bool "TWI"
|
bool "TWI"
|
||||||
select SAMA5_FLEXCOM_TWI
|
select SAMA5_FLEXCOM_TWI
|
||||||
|
select SAMA5_FLEXCOM_TWI1
|
||||||
|
|
||||||
endchoice # FLEXCOM1 Configuration
|
endchoice # FLEXCOM1 Configuration
|
||||||
|
|
||||||
@ -906,6 +928,7 @@ config SAMA5_FLEXCOM2_SPI
|
|||||||
config SAMA5_FLEXCOM2_TWI
|
config SAMA5_FLEXCOM2_TWI
|
||||||
bool "TWI"
|
bool "TWI"
|
||||||
select SAMA5_FLEXCOM_TWI
|
select SAMA5_FLEXCOM_TWI
|
||||||
|
select SAMA5_FLEXCOM_TWI2
|
||||||
|
|
||||||
endchoice # FLEXCOM2 Configuration
|
endchoice # FLEXCOM2 Configuration
|
||||||
|
|
||||||
@ -927,6 +950,7 @@ config SAMA5_FLEXCOM3_SPI
|
|||||||
config SAMA5_FLEXCOM3_TWI
|
config SAMA5_FLEXCOM3_TWI
|
||||||
bool "TWI"
|
bool "TWI"
|
||||||
select SAMA5_FLEXCOM_TWI
|
select SAMA5_FLEXCOM_TWI
|
||||||
|
select SAMA5_FLEXCOM_TWI3
|
||||||
|
|
||||||
endchoice # FLEXCOM3 Configuration
|
endchoice # FLEXCOM3 Configuration
|
||||||
|
|
||||||
@ -948,6 +972,7 @@ config SAMA5_FLEXCOM4_SPI
|
|||||||
config SAMA5_FLEXCOM4_TWI
|
config SAMA5_FLEXCOM4_TWI
|
||||||
bool "TWI"
|
bool "TWI"
|
||||||
select SAMA5_FLEXCOM_TWI
|
select SAMA5_FLEXCOM_TWI
|
||||||
|
select SAMA5_FLEXCOM_TWI4
|
||||||
|
|
||||||
endchoice # FLEXCOM4 Configuration
|
endchoice # FLEXCOM4 Configuration
|
||||||
endmenu # Flexcom Configuration
|
endmenu # Flexcom Configuration
|
||||||
@ -3172,7 +3197,7 @@ config SAMA5_FLEXCOM_SPI_DMADEBUG
|
|||||||
endmenu # Flexcom SPI device driver options
|
endmenu # Flexcom SPI device driver options
|
||||||
endif # SAMA5_FLEXCOM0_SPI || SAMA5_FLEXCOM1_SPI || SAMA5_FLEXCOM2_SPI || SAMA5_FLEXCOM3_SPI || SAMA5_FLEXCOM4_SPI
|
endif # SAMA5_FLEXCOM0_SPI || SAMA5_FLEXCOM1_SPI || SAMA5_FLEXCOM2_SPI || SAMA5_FLEXCOM3_SPI || SAMA5_FLEXCOM4_SPI
|
||||||
|
|
||||||
if SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3
|
if SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3 || SAMA5_FLEXCOM_TWI
|
||||||
|
|
||||||
menu "TWI device driver options"
|
menu "TWI device driver options"
|
||||||
|
|
||||||
@ -3196,6 +3221,32 @@ config SAMA5_TWI3_FREQUENCY
|
|||||||
default 100000
|
default 100000
|
||||||
depends on SAMA5_TWI3
|
depends on SAMA5_TWI3
|
||||||
|
|
||||||
|
config SAMA5_TWI_FC0_FREQUENCY
|
||||||
|
int "TWI4 (flexcom-0) Frequency"
|
||||||
|
default 100000
|
||||||
|
depends on SAMA5_FLEXCOM_TWI0
|
||||||
|
|
||||||
|
config SAMA5_TWI_FC1_FREQUENCY
|
||||||
|
int "TWI5 (flexcom-1) Frequency"
|
||||||
|
default 100000
|
||||||
|
depends on SAMA5_FLEXCOM_TWI1
|
||||||
|
|
||||||
|
config SAMA5_TWI_FC2_FREQUENCY
|
||||||
|
int "TWI6 (flexcom-2) Frequency"
|
||||||
|
default 100000
|
||||||
|
depends on SAMA5_FLEXCOM_TWI2
|
||||||
|
|
||||||
|
config SAMA5_TWI_FC3_FREQUENCY
|
||||||
|
int "TWI7 (flexcom-3) Frequency"
|
||||||
|
default 100000
|
||||||
|
depends on SAMA5_FLEXCOM_TWI3
|
||||||
|
|
||||||
|
config SAMA5_TWI_FC4_FREQUENCY
|
||||||
|
int "TWI8 (flexcom-4) Frequency"
|
||||||
|
default 100000
|
||||||
|
depends on SAMA5_FLEXCOM_TWI4
|
||||||
|
|
||||||
|
|
||||||
config SAMA5_TWI_REGDEBUG
|
config SAMA5_TWI_REGDEBUG
|
||||||
bool "TWI register level debug"
|
bool "TWI register level debug"
|
||||||
depends on DEBUG_I2C_INFO
|
depends on DEBUG_I2C_INFO
|
||||||
@ -3205,7 +3256,7 @@ config SAMA5_TWI_REGDEBUG
|
|||||||
Very invasive! Requires also CONFIG_DEBUG_I2C_INFO.
|
Very invasive! Requires also CONFIG_DEBUG_I2C_INFO.
|
||||||
|
|
||||||
endmenu # TWI device driver options
|
endmenu # TWI device driver options
|
||||||
endif # SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3
|
endif # SAMA5_TWI0 || SAMA5_TWI1 || SAMA5_TWI2 || SAMA5_TWI3 | SAMA5_FLEXCOM_TWI
|
||||||
|
|
||||||
if SAMA5_SSC0 || SAMA5_SSC1
|
if SAMA5_SSC0 || SAMA5_SSC1
|
||||||
menu "SSC Configuration"
|
menu "SSC Configuration"
|
||||||
|
@ -187,6 +187,9 @@ else
|
|||||||
ifeq ($(CONFIG_SAMA5_TWI2),y)
|
ifeq ($(CONFIG_SAMA5_TWI2),y)
|
||||||
CHIP_CSRCS += sam_twi.c
|
CHIP_CSRCS += sam_twi.c
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(CONFIG_SAMA5_FLEXCOM_TWI),y)
|
||||||
|
CHIP_CSRCS += sam_twi.c
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -522,6 +522,10 @@
|
|||||||
#define SAM_PIOC_VBASE SAM_PIO_IOGROUPC_VBASE
|
#define SAM_PIOC_VBASE SAM_PIO_IOGROUPC_VBASE
|
||||||
#define SAM_PIOD_VBASE SAM_PIO_IOGROUPD_VBASE
|
#define SAM_PIOD_VBASE SAM_PIO_IOGROUPD_VBASE
|
||||||
|
|
||||||
|
#define SAM_FLEXCOM_USART_OFFSET (0x200)
|
||||||
|
#define SAM_FLEXCOM_SPI_OFFSET (0x400)
|
||||||
|
#define SAM_FLEXCOM_TWI_OFFSET (0x600)
|
||||||
|
|
||||||
/* NuttX virtual base address
|
/* NuttX virtual base address
|
||||||
*
|
*
|
||||||
* The boot logic will create a temporarily mapping based on where NuttX is
|
* The boot logic will create a temporarily mapping based on where NuttX is
|
||||||
|
@ -74,9 +74,15 @@
|
|||||||
#include "sam_periphclks.h"
|
#include "sam_periphclks.h"
|
||||||
#include "sam_pio.h"
|
#include "sam_pio.h"
|
||||||
#include "sam_twi.h"
|
#include "sam_twi.h"
|
||||||
|
#include "hardware/sam_flexcom.h"
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_TWI0) || defined(CONFIG_SAMA5_TWI1) || \
|
#if defined(CONFIG_SAMA5_TWI0) || defined(CONFIG_SAMA5_TWI1) || \
|
||||||
defined(CONFIG_SAMA5_TWI2) || defined(CONFIG_SAMA5_TWI3)
|
defined(CONFIG_SAMA5_TWI2) || defined(CONFIG_SAMA5_TWI3) || \
|
||||||
|
defined(CONFIG_SAMA5_FLEXCOM0_TWI) || \
|
||||||
|
defined(CONFIG_SAMA5_FLEXCOM1_TWI) || \
|
||||||
|
defined(CONFIG_SAMA5_FLEXCOM2_TWI) || \
|
||||||
|
defined(CONFIG_SAMA5_FLEXCOM3_TWI) || \
|
||||||
|
defined(CONFIG_SAMA5_FLEXCOM4_TWI)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
@ -329,6 +335,117 @@ static struct twi_dev_s g_twi3 =
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM0_TWI
|
||||||
|
static const struct twi_attr_s g_twi4attr =
|
||||||
|
{
|
||||||
|
.twi = 4,
|
||||||
|
.pid = SAM_PID_FLEXCOM0,
|
||||||
|
.irq = SAM_IRQ_FLEXCOM0,
|
||||||
|
.sclcfg = PIO_TWI4_CK,
|
||||||
|
.sdacfg = PIO_TWI4_D,
|
||||||
|
.base = SAM_FLEXCOM0_VBASE + SAM_FLEXCOM_TWI_OFFSET
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct twi_dev_s g_twi4 =
|
||||||
|
{
|
||||||
|
.dev =
|
||||||
|
{
|
||||||
|
.ops = &g_twiops,
|
||||||
|
},
|
||||||
|
.attr = &g_twi4attr,
|
||||||
|
.lock = NXMUTEX_INITIALIZER,
|
||||||
|
.waitsem = SEM_INITIALIZER(0),
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM1_TWI
|
||||||
|
static const struct twi_attr_s g_twi5attr =
|
||||||
|
{
|
||||||
|
.twi = 5,
|
||||||
|
.pid = SAM_PID_FLEXCOM1,
|
||||||
|
.irq = SAM_IRQ_FLEXCOM1,
|
||||||
|
.sclcfg = PIO_TWI5_CK,
|
||||||
|
.sdacfg = PIO_TWI5_D,
|
||||||
|
.base = SAM_FLEXCOM1_VBASE + SAM_FLEXCOM_TWI_OFFSET
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct twi_dev_s g_twi4 =
|
||||||
|
{
|
||||||
|
.dev =
|
||||||
|
{
|
||||||
|
.ops = &g_twiops,
|
||||||
|
},
|
||||||
|
.attr = &g_twi5attr,
|
||||||
|
.lock = NXMUTEX_INITIALIZER,
|
||||||
|
.waitsem = SEM_INITIALIZER(0),
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM2_TWI
|
||||||
|
static const struct twi_attr_s g_twi6attr =
|
||||||
|
{
|
||||||
|
.twi = 6,
|
||||||
|
.pid = SAM_PID_FLEXCOM2,
|
||||||
|
.irq = SAM_IRQ_FLEXCOM2,
|
||||||
|
.sclcfg = PIO_TWI6_CK,
|
||||||
|
.sdacfg = PIO_TWI6_D,
|
||||||
|
.base = SAM_FLEXCOM2_VBASE + SAM_FLEXCOM_TWI_OFFSET
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct twi_dev_s g_twi6 =
|
||||||
|
{
|
||||||
|
.dev =
|
||||||
|
{
|
||||||
|
.ops = &g_twiops,
|
||||||
|
},
|
||||||
|
.attr = &g_twi6attr,
|
||||||
|
.lock = NXMUTEX_INITIALIZER,
|
||||||
|
.waitsem = SEM_INITIALIZER(0),
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM3_TWI
|
||||||
|
static const struct twi_attr_s g_twi7attr =
|
||||||
|
{
|
||||||
|
.twi = 7,
|
||||||
|
.pid = SAM_PID_FLEXCOM3,
|
||||||
|
.irq = SAM_IRQ_FLEXCOM3,
|
||||||
|
.sclcfg = PIO_TWI7_CK,
|
||||||
|
.sdacfg = PIO_TWI7_D,
|
||||||
|
.base = SAM_FLEXCOM3_VBASE + SAM_FLEXCOM_TWI_OFFSET
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct twi_dev_s g_twi7 =
|
||||||
|
{
|
||||||
|
.dev =
|
||||||
|
{
|
||||||
|
.ops = &g_twiops,
|
||||||
|
},
|
||||||
|
.attr = &g_twi7attr,
|
||||||
|
.lock = NXMUTEX_INITIALIZER,
|
||||||
|
.waitsem = SEM_INITIALIZER(0),
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM4_TWI
|
||||||
|
static const struct twi_attr_s g_twi8attr =
|
||||||
|
{
|
||||||
|
.twi = 8,
|
||||||
|
.pid = SAM_PID_FLEXCOM3,
|
||||||
|
.irq = SAM_IRQ_FLEXCOM3,
|
||||||
|
.sclcfg = PIO_TWI8_CK,
|
||||||
|
.sdacfg = PIO_TWI8_D,
|
||||||
|
.base = SAM_FLEXCOM4_VBASE + SAM_FLEXCOM_TWI_OFFSET
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct twi_dev_s g_twi8 =
|
||||||
|
{
|
||||||
|
.dev =
|
||||||
|
{
|
||||||
|
.ops = &g_twiops,
|
||||||
|
},
|
||||||
|
.attr = &g_twi8attr,
|
||||||
|
.lock = NXMUTEX_INITIALIZER,
|
||||||
|
.waitsem = SEM_INITIALIZER(0),
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -348,10 +465,9 @@ static struct twi_dev_s g_twi3 =
|
|||||||
* false: This is the same as the preceding register access.
|
* false: This is the same as the preceding register access.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SAMA5_TWI_REGDEBUG
|
#ifdef CONFIG_SAMA5_TWI_REGDEBUG
|
||||||
static bool twi_checkreg(struct twi_dev_s *priv, bool wr, uint32_t value,
|
static bool twi_checkreg(struct twi_dev_s *priv, bool wr, uint32_t value,
|
||||||
uint32_t address)
|
uintptr_t address)
|
||||||
{
|
{
|
||||||
if (wr == priv->wrlast && /* Same kind of access? */
|
if (wr == priv->wrlast && /* Same kind of access? */
|
||||||
value == priv->vallast && /* Same value? */
|
value == priv->vallast && /* Same value? */
|
||||||
@ -1249,6 +1365,61 @@ struct i2c_master_s *sam_i2cbus_initialize(int bus)
|
|||||||
frequency = CONFIG_SAMA5_TWI3_FREQUENCY;
|
frequency = CONFIG_SAMA5_TWI3_FREQUENCY;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM0_TWI
|
||||||
|
if (bus == 4)
|
||||||
|
{
|
||||||
|
/* Select up TWI4 (Flexcom-0) and the (initial) TWI frequency */
|
||||||
|
|
||||||
|
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX0_MR);
|
||||||
|
priv = &g_twi4;
|
||||||
|
frequency = CONFIG_SAMA5_TWI_FC0_FREQUENCY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM1_TWI
|
||||||
|
if (bus == 5)
|
||||||
|
{
|
||||||
|
/* Select up TWI5 (Flexcom-1) and the (initial) TWI frequency */
|
||||||
|
|
||||||
|
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX1_MR);
|
||||||
|
priv = &g_twi5;
|
||||||
|
frequency = CONFIG_SAMA5_TWI_FC1_FREQUENCY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM2_TWI
|
||||||
|
if (bus == 6)
|
||||||
|
{
|
||||||
|
/* Select up TWI6 (Flexcom-2) and the (initial) TWI frequency */
|
||||||
|
|
||||||
|
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX2_MR);
|
||||||
|
priv = &g_twi6;
|
||||||
|
frequency = CONFIG_SAMA5_TWI_FC2_FREQUENCY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM3_TWI
|
||||||
|
if (bus == 7)
|
||||||
|
{
|
||||||
|
/* Select up TWI7 (Flexcom-3) and the (initial) TWI frequency */
|
||||||
|
|
||||||
|
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX3_MR);
|
||||||
|
priv = &g_twi7;
|
||||||
|
frequency = CONFIG_SAMA5_TWI_FC3_FREQUENCY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_FLEXCOM4_TWI
|
||||||
|
if (bus == 8)
|
||||||
|
{
|
||||||
|
/* Select up TWI8 (Flexcom-4) and the (initial) TWI frequency */
|
||||||
|
|
||||||
|
putreg32(FLEX_MR_OPMODE_TWI, SAM_FLEX4_MR);
|
||||||
|
priv = &g_twi8;
|
||||||
|
frequency = CONFIG_SAMA5_TWI_FC4_FREQUENCY;
|
||||||
|
}
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
i2cerr("ERROR: Unsupported bus: TWI%d\n", bus);
|
i2cerr("ERROR: Unsupported bus: TWI%d\n", bus);
|
||||||
|
Loading…
Reference in New Issue
Block a user