From 1bc2fdc7045dee8417b151464b7cedb0c9129ac1 Mon Sep 17 00:00:00 2001 From: Yannis Damigos Date: Thu, 29 Jun 2017 17:26:38 +0300 Subject: [PATCH] dts: arm: STM32 boards use DT to configure I2C Configure I2C using DT for the following STM32 boards: disco_l475_iot1 nucleo_f401re 96b_carbon olimexino_stm32 Signed-off-by: Yannis Damigos --- boards/arm/96b_carbon/Kconfig.defconfig | 3 --- boards/arm/disco_l475_iot1/Kconfig.defconfig | 6 ----- boards/arm/nucleo_f401re/Kconfig.defconfig | 3 --- boards/arm/olimexino_stm32/Kconfig.defconfig | 3 --- drivers/i2c/Kconfig | 14 +++++----- drivers/i2c/i2c_ll_stm32.c | 24 ++++++++--------- dts/arm/96b_carbon.dts | 4 +++ dts/arm/96b_carbon.fixup | 7 +++++ dts/arm/disco_l475_iot1.dts | 9 +++++++ dts/arm/disco_l475_iot1.fixup | 14 ++++++++++ dts/arm/nucleo_f401re.dts | 4 +++ dts/arm/nucleo_f401re.fixup | 7 +++++ dts/arm/olimexino_stm32.dts | 4 +++ dts/arm/olimexino_stm32.fixup | 7 +++++ dts/arm/st/stm32f103Xb.dtsi | 18 +++++++++++++ dts/arm/st/stm32f4.dtsi | 27 ++++++++++++++++++++ dts/arm/st/stm32l475.dtsi | 27 ++++++++++++++++++++ kernel/Kconfig | 7 +++++ 18 files changed, 155 insertions(+), 33 deletions(-) diff --git a/boards/arm/96b_carbon/Kconfig.defconfig b/boards/arm/96b_carbon/Kconfig.defconfig index 16abeb290c3..5c056007e12 100644 --- a/boards/arm/96b_carbon/Kconfig.defconfig +++ b/boards/arm/96b_carbon/Kconfig.defconfig @@ -15,9 +15,6 @@ if I2C_1 config I2C_1_DEFAULT_CFG default 0x14 -config I2C_1_IRQ_PRI - default 0 - endif # I2C_1 endif # BOARD_96B_CARBON diff --git a/boards/arm/disco_l475_iot1/Kconfig.defconfig b/boards/arm/disco_l475_iot1/Kconfig.defconfig index 7f3f660a48c..467536a585b 100644 --- a/boards/arm/disco_l475_iot1/Kconfig.defconfig +++ b/boards/arm/disco_l475_iot1/Kconfig.defconfig @@ -52,9 +52,6 @@ if I2C_1 config I2C_1_DEFAULT_CFG default 0x14 -config I2C_1_IRQ_PRI - default 0 - endif # I2C_1 if I2C_2 @@ -62,9 +59,6 @@ if I2C_2 config I2C_2_DEFAULT_CFG default 0x14 -config I2C_2_IRQ_PRI - default 0 - endif # I2C_2 diff --git a/boards/arm/nucleo_f401re/Kconfig.defconfig b/boards/arm/nucleo_f401re/Kconfig.defconfig index b15d37c6268..186a7ea1383 100644 --- a/boards/arm/nucleo_f401re/Kconfig.defconfig +++ b/boards/arm/nucleo_f401re/Kconfig.defconfig @@ -15,9 +15,6 @@ if I2C_1 config I2C_1_DEFAULT_CFG default 0x14 -config I2C_1_IRQ_PRI - default 0 - endif # I2C_1 endif # BOARD_NUCLEO_F401RE diff --git a/boards/arm/olimexino_stm32/Kconfig.defconfig b/boards/arm/olimexino_stm32/Kconfig.defconfig index db3da5e32f9..2745c6bec66 100644 --- a/boards/arm/olimexino_stm32/Kconfig.defconfig +++ b/boards/arm/olimexino_stm32/Kconfig.defconfig @@ -15,9 +15,6 @@ if I2C_2 config I2C_2_DEFAULT_CFG default 0x14 -config I2C_2_IRQ_PRI - default 0 - endif # I2C_2 endif # BOARD_OLIMEXINO_STM32 diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index 804ab847146..07a887d9203 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig @@ -94,6 +94,7 @@ config I2C_STM32_V1 bool "STM32 V1 Driver (F1/F4X)" depends on SOC_FAMILY_STM32 depends on SOC_SERIES_STM32F1X || SOC_SERIES_STM32F4X + select HAS_DTS_I2C default n help Enable I2C support on the STM32 F1 and F4X family of processors. This @@ -103,6 +104,7 @@ config I2C_STM32_V2 bool "STM32 V2 Driver (F3/L4X)" depends on SOC_FAMILY_STM32 depends on SOC_SERIES_STM32F3X || SOC_SERIES_STM32L4X + select HAS_DTS_I2C default n help Enable I2C support on the STM32 F3 and L4X family of processors. This @@ -218,7 +220,7 @@ config I2C_1 config I2C_1_NAME string "Port 1 device name" default "I2C_1" - depends on I2C_1 + depends on I2C_1 && !HAS_DTS_I2C config I2C_1_DEFAULT_CFG hex "Port 1 default configuration" @@ -233,7 +235,7 @@ config I2C_1_DEFAULT_CFG config I2C_1_IRQ_PRI int "Port 1 interrupt priority" - depends on I2C_1 + depends on I2C_1 && !HAS_DTS_I2C help IRQ priority. @@ -244,7 +246,7 @@ config I2C_2 config I2C_2_NAME string "Port 2 device name" default "I2C_2" - depends on I2C_2 + depends on I2C_2 && !HAS_DTS_I2C config I2C_2_DEFAULT_CFG hex "Port 2 default configuration" @@ -259,7 +261,7 @@ config I2C_2_DEFAULT_CFG config I2C_2_IRQ_PRI int "Port 2 interrupt priority" - depends on I2C_2 + depends on I2C_2 && !HAS_DTS_I2C help IRQ priority. @@ -269,7 +271,7 @@ config I2C_3 config I2C_3_NAME string "Port 3 device name" - depends on I2C_3 + depends on I2C_3 && !HAS_DTS_I2C default "I2C_3" config I2C_3_DEFAULT_CFG @@ -285,7 +287,7 @@ config I2C_3_DEFAULT_CFG config I2C_3_IRQ_PRI int "Port 3 interrupt priority" - depends on I2C_3 + depends on I2C_3 && !HAS_DTS_I2C help IRQ priority. diff --git a/drivers/i2c/i2c_ll_stm32.c b/drivers/i2c/i2c_ll_stm32.c index 3ded62983ed..f4217618a4d 100644 --- a/drivers/i2c/i2c_ll_stm32.c +++ b/drivers/i2c/i2c_ll_stm32.c @@ -137,13 +137,13 @@ DEVICE_AND_API_INIT(i2c_stm32_1, CONFIG_I2C_1_NAME, &i2c_stm32_init, #ifdef CONFIG_I2C_STM32_INTERRUPT static void i2c_stm32_irq_config_func_1(struct device *dev) { - IRQ_CONNECT(I2C1_EV_IRQn, CONFIG_I2C_1_IRQ_PRI, + IRQ_CONNECT(CONFIG_I2C_1_EVENT_IRQ, CONFIG_I2C_1_EVENT_IRQ_PRI, stm32_i2c_event_isr, DEVICE_GET(i2c_stm32_1), 0); - irq_enable(I2C1_EV_IRQn); + irq_enable(CONFIG_I2C_1_EVENT_IRQ); - IRQ_CONNECT(I2C1_ER_IRQn, CONFIG_I2C_1_IRQ_PRI, + IRQ_CONNECT(CONFIG_I2C_1_ERROR_IRQ, CONFIG_I2C_1_ERROR_IRQ_PRI, stm32_i2c_error_isr, DEVICE_GET(i2c_stm32_1), 0); - irq_enable(I2C1_ER_IRQn); + irq_enable(CONFIG_I2C_1_ERROR_IRQ); } #endif @@ -178,13 +178,13 @@ DEVICE_AND_API_INIT(i2c_stm32_2, CONFIG_I2C_2_NAME, &i2c_stm32_init, #ifdef CONFIG_I2C_STM32_INTERRUPT static void i2c_stm32_irq_config_func_2(struct device *dev) { - IRQ_CONNECT(I2C2_EV_IRQn, CONFIG_I2C_2_IRQ_PRI, + IRQ_CONNECT(CONFIG_I2C_2_EVENT_IRQ, CONFIG_I2C_2_EVENT_IRQ_PRI, stm32_i2c_event_isr, DEVICE_GET(i2c_stm32_2), 0); - irq_enable(I2C2_EV_IRQn); + irq_enable(CONFIG_I2C_2_EVENT_IRQ); - IRQ_CONNECT(I2C2_ER_IRQn, CONFIG_I2C_2_IRQ_PRI, + IRQ_CONNECT(CONFIG_I2C_2_ERROR_IRQ, CONFIG_I2C_2_ERROR_IRQ_PRI, stm32_i2c_error_isr, DEVICE_GET(i2c_stm32_2), 0); - irq_enable(I2C2_ER_IRQn); + irq_enable(CONFIG_I2C_2_ERROR_IRQ); } #endif @@ -223,13 +223,13 @@ DEVICE_AND_API_INIT(i2c_stm32_3, CONFIG_I2C_3_NAME, &i2c_stm32_init, #ifdef CONFIG_I2C_STM32_INTERRUPT static void i2c_stm32_irq_config_func_3(struct device *dev) { - IRQ_CONNECT(I2C3_EV_IRQn, CONFIG_I2C_3_IRQ_PRI, + IRQ_CONNECT(CONFIG_I2C_3_EVENT_IRQ, CONFIG_I2C_3_EVENT_IRQ_PRI, stm32_i2c_event_isr, DEVICE_GET(i2c_stm32_3), 0); - irq_enable(I2C3_EV_IRQn); + irq_enable(CONFIG_I2C_3_EVENT_IRQ); - IRQ_CONNECT(I2C3_ER_IRQn, CONFIG_I2C_3_IRQ_PRI, + IRQ_CONNECT(CONFIG_I2C_3_ERROR_IRQ, CONFIG_I2C_3_ERROR_IRQ_PRI, stm32_i2c_error_isr, DEVICE_GET(i2c_stm32_3), 0); - irq_enable(I2C3_ER_IRQn); + irq_enable(CONFIG_I2C_3_ERROR_IRQ); } #endif diff --git a/dts/arm/96b_carbon.dts b/dts/arm/96b_carbon.dts index 1199e852a70..56540018f39 100644 --- a/dts/arm/96b_carbon.dts +++ b/dts/arm/96b_carbon.dts @@ -27,3 +27,7 @@ current-speed = <115200>; status = "ok"; }; + +&i2c1 { + status = "ok"; +}; diff --git a/dts/arm/96b_carbon.fixup b/dts/arm/96b_carbon.fixup index e563eb52942..2edfa2ebc02 100644 --- a/dts/arm/96b_carbon.fixup +++ b/dts/arm/96b_carbon.fixup @@ -18,3 +18,10 @@ #define CONFIG_UART_STM32_PORT_2_IRQ_PRI ST_STM32_USART_40004400_IRQ_0_PRIORITY #define CONFIG_UART_STM32_PORT_2_NAME ST_STM32_USART_40004400_LABEL #define PORT_2_IRQ ST_STM32_USART_40004400_IRQ_0 + +#define CONFIG_I2C_1_BASE_ADDRESS ST_STM32_I2C_V1_40005400_BASE_ADDRESS +#define CONFIG_I2C_1_EVENT_IRQ_PRI ST_STM32_I2C_V1_40005400_EVENT_PRIORITY +#define CONFIG_I2C_1_ERROR_IRQ_PRI ST_STM32_I2C_V1_40005400_ERROR_PRIORITY +#define CONFIG_I2C_1_NAME ST_STM32_I2C_V1_40005400_LABEL +#define CONFIG_I2C_1_EVENT_IRQ ST_STM32_I2C_V1_40005400_EVENT +#define CONFIG_I2C_1_ERROR_IRQ ST_STM32_I2C_V1_40005400_ERROR diff --git a/dts/arm/disco_l475_iot1.dts b/dts/arm/disco_l475_iot1.dts index f700889bb6e..0b2612b2b31 100644 --- a/dts/arm/disco_l475_iot1.dts +++ b/dts/arm/disco_l475_iot1.dts @@ -22,6 +22,15 @@ current-speed = <115200>; status = "ok"; }; + +&i2c1 { + status = "ok"; +}; + +&i2c2 { + status = "ok"; +}; + &flash0 { partitions { /* diff --git a/dts/arm/disco_l475_iot1.fixup b/dts/arm/disco_l475_iot1.fixup index 36a5e2c7924..ba197dacfa5 100644 --- a/dts/arm/disco_l475_iot1.fixup +++ b/dts/arm/disco_l475_iot1.fixup @@ -35,3 +35,17 @@ #define CONFIG_UART_STM32_PORT_5_IRQ_PRI ST_STM32_UART_40005000_IRQ_0_PRIORITY #define CONFIG_UART_STM32_PORT_5_NAME ST_STM32_UART_40005000_LABEL #define PORT_5_IRQ ST_STM32_UART_40005000_IRQ_0 + +#define CONFIG_I2C_1_BASE_ADDRESS ST_STM32_I2C_V2_40005400_BASE_ADDRESS +#define CONFIG_I2C_1_EVENT_IRQ_PRI ST_STM32_I2C_V2_40005400_EVENT_PRIORITY +#define CONFIG_I2C_1_ERROR_IRQ_PRI ST_STM32_I2C_V2_40005400_ERROR_PRIORITY +#define CONFIG_I2C_1_NAME ST_STM32_I2C_V2_40005400_LABEL +#define CONFIG_I2C_1_EVENT_IRQ ST_STM32_I2C_V2_40005400_EVENT +#define CONFIG_I2C_1_ERROR_IRQ ST_STM32_I2C_V2_40005400_ERROR + +#define CONFIG_I2C_2_BASE_ADDRESS ST_STM32_I2C_V2_40005800_BASE_ADDRESS +#define CONFIG_I2C_2_EVENT_IRQ_PRI ST_STM32_I2C_V2_40005800_EVENT_PRIORITY +#define CONFIG_I2C_2_ERROR_IRQ_PRI ST_STM32_I2C_V2_40005800_ERROR_PRIORITY +#define CONFIG_I2C_2_NAME ST_STM32_I2C_V2_40005800_LABEL +#define CONFIG_I2C_2_EVENT_IRQ ST_STM32_I2C_V2_40005800_EVENT +#define CONFIG_I2C_2_ERROR_IRQ ST_STM32_I2C_V2_40005800_ERROR diff --git a/dts/arm/nucleo_f401re.dts b/dts/arm/nucleo_f401re.dts index 8a924eef704..3131697c446 100644 --- a/dts/arm/nucleo_f401re.dts +++ b/dts/arm/nucleo_f401re.dts @@ -28,6 +28,10 @@ status = "ok"; }; +&i2c1 { + status = "ok"; +}; + &flash0 { partitions { /* diff --git a/dts/arm/nucleo_f401re.fixup b/dts/arm/nucleo_f401re.fixup index e563eb52942..71aa28849ed 100644 --- a/dts/arm/nucleo_f401re.fixup +++ b/dts/arm/nucleo_f401re.fixup @@ -18,3 +18,10 @@ #define CONFIG_UART_STM32_PORT_2_IRQ_PRI ST_STM32_USART_40004400_IRQ_0_PRIORITY #define CONFIG_UART_STM32_PORT_2_NAME ST_STM32_USART_40004400_LABEL #define PORT_2_IRQ ST_STM32_USART_40004400_IRQ_0 + +#define CONFIG_I2C_1_BASE_ADDRESS ST_STM32_I2C_V1_40005400_BASE_ADDRESS +#define CONFIG_I2C_1_EVENT_IRQ_PRI ST_STM32_I2C_V1_40005400_EVENT_PRIORITY +#define CONFIG_I2C_1_ERROR_IRQ_PRI ST_STM32_I2C_V1_40005400_EVENT_PRIORITY +#define CONFIG_I2C_1_NAME ST_STM32_I2C_V1_40005400_LABEL +#define CONFIG_I2C_1_EVENT_IRQ ST_STM32_I2C_V1_40005400_EVENT +#define CONFIG_I2C_1_ERROR_IRQ ST_STM32_I2C_V1_40005400_ERROR diff --git a/dts/arm/olimexino_stm32.dts b/dts/arm/olimexino_stm32.dts index ce819f91f53..40918c985c2 100644 --- a/dts/arm/olimexino_stm32.dts +++ b/dts/arm/olimexino_stm32.dts @@ -22,3 +22,7 @@ current-speed = <115200>; status = "ok"; }; + +&i2c2 { + status = "ok"; +}; diff --git a/dts/arm/olimexino_stm32.fixup b/dts/arm/olimexino_stm32.fixup index 376eaaf9ee7..c892ea9dfb7 100644 --- a/dts/arm/olimexino_stm32.fixup +++ b/dts/arm/olimexino_stm32.fixup @@ -24,3 +24,10 @@ #define CONFIG_UART_STM32_PORT_3_IRQ_PRI ST_STM32_USART_40004800_IRQ_0_PRIORITY #define CONFIG_UART_STM32_PORT_3_NAME ST_STM32_USART_40004800_LABEL #define PORT_3_IRQ ST_STM32_USART_40004800_IRQ_0 + +#define CONFIG_I2C_2_BASE_ADDRESS ST_STM32_I2C_V1_40005800_BASE_ADDRESS +#define CONFIG_I2C_2_EVENT_IRQ_PRI ST_STM32_I2C_V1_40005800_EVENT_PRIORITY +#define CONFIG_I2C_2_ERROR_IRQ_PRI ST_STM32_I2C_V1_40005800_ERROR_PRIORITY +#define CONFIG_I2C_2_NAME ST_STM32_I2C_V1_40005800_LABEL +#define CONFIG_I2C_2_EVENT_IRQ ST_STM32_I2C_V1_40005800_EVENT +#define CONFIG_I2C_2_ERROR_IRQ ST_STM32_I2C_V1_40005800_ERROR diff --git a/dts/arm/st/stm32f103Xb.dtsi b/dts/arm/st/stm32f103Xb.dtsi index 1e7706eb5d3..9471bafe754 100644 --- a/dts/arm/st/stm32f103Xb.dtsi +++ b/dts/arm/st/stm32f103Xb.dtsi @@ -43,6 +43,24 @@ status = "disabled"; label = "UART_3"; }; + + i2c1: i2c@40005400 { + compatible = "st,stm32-i2c-v1"; + reg = <0x40005400 0x400>; + interrupts = <31 0>, <32 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_1"; + }; + + i2c2: i2c@40005800 { + compatible = "st,stm32-i2c-v1"; + reg = <0x40005800 0x400>; + interrupts = <33 0>, <34 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_2"; + }; }; }; diff --git a/dts/arm/st/stm32f4.dtsi b/dts/arm/st/stm32f4.dtsi index afc7a6c519d..d269a481c9b 100644 --- a/dts/arm/st/stm32f4.dtsi +++ b/dts/arm/st/stm32f4.dtsi @@ -40,6 +40,33 @@ status = "disabled"; label = "UART_6"; }; + + i2c1: i2c@40005400 { + compatible = "st,stm32-i2c-v1"; + reg = <0x40005400 0x400>; + interrupts = <31 0>, <32 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_1"; + }; + + i2c2: i2c@40005800 { + compatible = "st,stm32-i2c-v1"; + reg = <0x40005800 0x400>; + interrupts = <33 0>, <34 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_2"; + }; + + i2c3: i2c@40005C00 { + compatible = "st,stm32-i2c-v1"; + reg = <0x40005C00 0x400>; + interrupts = <72 0>, <73 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_3"; + }; }; }; diff --git a/dts/arm/st/stm32l475.dtsi b/dts/arm/st/stm32l475.dtsi index 5bb2c70b98e..de9eb754012 100644 --- a/dts/arm/st/stm32l475.dtsi +++ b/dts/arm/st/stm32l475.dtsi @@ -56,6 +56,33 @@ status = "disabled"; label = "UART_5"; }; + + i2c1: i2c@40005400 { + compatible = "st,stm32-i2c-v2"; + reg = <0x40005400 0x400>; + interrupts = <31 0>, <32 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_1"; + }; + + i2c2: i2c@40005800 { + compatible = "st,stm32-i2c-v2"; + reg = <0x40005800 0x400>; + interrupts = <33 0>, <34 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_2"; + }; + + i2c3: i2c@40005C00 { + compatible = "st,stm32-i2c-v2"; + reg = <0x40005C00 0x400>; + interrupts = <72 0>, <73 0>; + interrupt-names = "event", "error"; + status = "disabled"; + label= "I2C_3"; + }; }; }; diff --git a/kernel/Kconfig b/kernel/Kconfig index 5c661963af7..c3c6f35e186 100644 --- a/kernel/Kconfig +++ b/kernel/Kconfig @@ -15,6 +15,13 @@ config HAS_DTS This option specifies that the target platform supports device tree configuration. +config HAS_DTS_I2C + bool "I2C uses Device Tree" + depends on HAS_DTS + help + This option specifies that the target platform supports device tree + configuration for I2c. + config MULTITHREADING bool prompt "Multi-threading"