Registered User mNo edit summary |
Registered User mNo edit summary Tag: 2017 source edit |
||
Line 226: | Line 226: | ||
* '''Linux<sup>®</sup>''': [[I2C overview|I2C framework]] | * '''Linux<sup>®</sup>''': [[I2C overview|I2C framework]] | ||
* '''OP-TEE''': [[OP-TEE_overview|I2C driver]] and {{CodeSource | OP-TEE_OS | core/include/drivers/stm32_i2c.h | header file of I2C OP-TEE driver}} | * '''OP-TEE''': [[STM32 MPU OP-TEE_overview|I2C driver]] and {{CodeSource | OP-TEE_OS | core/include/drivers/stm32_i2c.h | header file of I2C OP-TEE driver}} | ||
* '''STM32Cube''': [[STM32CubeMP15 Package architecture|I2C HAL driver]] and {{CodeSource | STM32CubeMP1 | Drivers/STM32MP1xx_HAL_Driver/Inc/stm32mp1xx_hal_i2c.h | header file of I2C HAL module}} | * '''STM32Cube''': [[STM32CubeMP15 Package architecture|I2C HAL driver]] and {{CodeSource | STM32CubeMP1 | Drivers/STM32MP1xx_HAL_Driver/Inc/stm32mp1xx_hal_i2c.h | header file of I2C HAL module}} | ||
* '''TF-A BL2''': {{CodeSource | TF-A | drivers/st/i2c/stm32_i2c.c | I2C driver}} | * '''TF-A BL2''': {{CodeSource | TF-A | drivers/st/i2c/stm32_i2c.c | I2C driver}} |
Revision as of 14:38, 25 July 2024
1. Article purpose[edit | edit source]
The purpose of this article is to:
- briefly introduce the I2C peripheral and its main features,
- indicate the peripheral instances assignment at boot time and their assignment at runtime (including whether instances can be allocated to secure contexts),
- list the software frameworks and drivers managing the peripheral,
- explain how to configure the peripheral.
2. Peripheral overview[edit | edit source]
The I2C bus interface serves as an interface between the microcontroller and the serial I2C bus.
It provides multi-master capability, and controls all I2C bus-specific sequencing, protocol, arbitration and timing.
The I2C controller allows to be a slave as well if need be.
It is also SMBus 2.0 compatible.
For more information about I2C please refer to this link: I2C wikipedia[1] or i2c-bus.org[2]
For more information about SMBus please refer to this link: SMBus wikipedia[3] or i2c-bus.org[4]
Here are the main features:
- Multi-master
- Standard (100 KHz) and fast speed modes (400 KHz and Plus 1 MHz)
- I2C 10-bit address
- I2C slave capabilities (programmable I2C address)
- DMA capabilities
- SMBus 2.0 compatible
- Standard bus protocol (quick command; byte, word, block read/write)
- Host notification
- Alert
Refer to the STM32 MPU reference manuals for the complete list of features, and to the software frameworks and drivers, introduced below, to see which features are implemented.
3. Peripheral usage[edit | edit source]
This chapter is applicable in the scope of the OpenSTLinux BSP running on the Arm® Cortex®-A processor(s), and the STM32CubeMPU Package running on the Arm® Cortex®-M processor.
3.1. Boot time assignment[edit | edit source]
3.1.1. On STM32MP1 series[edit | edit source]
The I2C peripheral is usually not used at boot time. But it may be used by the SSBL and/or FSBL (see Boot chain overview), for example, to configure a PMIC (see PMIC hardware components), or to access data stored in an external EEPROM.
Click on to expand or collapse the legend...
Domain | Peripheral | Boot time allocation | Comment | |||
---|---|---|---|---|---|---|
Instance | Cortex-A7 secure (ROM code) |
Cortex-A7 secure (TF-A BL2) |
Cortex-A7 non-secure (U-Boot) | |||
Low speed interface | I2C | Any instance | ☐ | ☐ |
3.1.2. On STM32MP2 series[edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Boot time allocation | Comment | |||
---|---|---|---|---|---|---|
Instance | Cortex-A35 secure (ROM code) |
Cortex-A35 secure (TF-A BL2) |
Cortex-A35 non-secure (U-Boot) | |||
Low speed interface | I2C | Any instance | ☐ | ☐ |
3.2. Runtime assignment[edit | edit source]
3.2.1. On STM32MP13x lines [edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Runtime allocation | Comment | ||
---|---|---|---|---|---|
Instance | Cortex-A7 secure (OP-TEE) |
Cortex-A7 non-secure (Linux) | |||
Low speed interface | I2C | I2C1 | ☐ | ||
I2C2 | ☐ | ||||
I2C3 | ☐ | ☐ | Assignment (single choice) | ||
I2C4 | ☐ | ☐ | Assignment (single choice). Used for PMIC control on ST boards. | ||
I2C5 | ☐ | ☐ | Assignment (single choice) |
3.2.2. On STM32MP15x lines [edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Runtime allocation | Comment | |||
---|---|---|---|---|---|---|
Instance | Cortex-A7 secure (OP-TEE) |
Cortex-A7 non-secure (Linux) |
Cortex-M4 (STM32Cube) | |||
Low speed interface | I2C | I2C1 | ☐ | ☐ | Assignment (single choice) | |
I2C2 | ☐ | ☐ | Assignment (single choice) | |||
I2C3 | ☐ | ☐ | Assignment (single choice) | |||
I2C4 | ☐ | ☐ | Assignment (single choice). Used for PMIC control on ST boards. | |||
I2C5 | ☐ | ☐ | Assignment (single choice) | |||
I2C6 | ☐ | ☐ | Assignment (single choice) |
3.2.3. On STM32MP25x lines [edit | edit source]
Click on to expand or collapse the legend...
Domain | Peripheral | Runtime allocation | Comment | |||||
---|---|---|---|---|---|---|---|---|
Instance | Cortex-A35 secure (OP-TEE / TF-A BL31) |
Cortex-A35 non-secure (Linux) |
Cortex-M33 secure (TF-M) |
Cortex-M33 non-secure (STM32Cube) |
Cortex-M0+ (STM32Cube) | |||
Low speed interface | I2C | I2C1 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||
I2C2 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||||
I2C3 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||||
I2C4 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||||
I2C5 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||||
I2C6 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||||
I2C7 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ||||
I2C8 | ☐OP-TEE ⬚TF-A BL31 |
☐ | ☐ | ☐ | ☐ |
4. Software frameworks and drivers[edit | edit source]
Below are listed the software frameworks and drivers managing the I2C peripheral for the embedded software components listed in the above tables.
- Linux®: I2C framework
- OP-TEE: I2C driver and header file of I2C OP-TEE driver
- STM32Cube: I2C HAL driver and header file of I2C HAL module
- TF-A BL2: I2C driver
- U-Boot: I2C driver
5. How to assign and configure the peripheral[edit | edit source]
The peripheral assignment can be done via the STM32CubeMX graphical tool (and manually completed if needed).
This tool also helps to configure the peripheral:
- partial device trees (pin control and clock tree) generation for the OpenSTLinux software components,
- HAL initialization code generation for the STM32CubeMPU Package.
The configuration is applied by the firmware running in the context in which the peripheral is assigned.
For Linux® kernel configuration, please refer to I2C configuration.
Please refer to I2C device tree configuration for detailed information on how to configure I2C peripherals.
6. References[edit | edit source]