171 lines
4.9 KiB
YAML
171 lines
4.9 KiB
YAML
# Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon company) or
|
|
# an affiliate of Cypress Semiconductor Corporation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
description: |
|
|
|
|
Infineon XMC4XXX I2C
|
|
|
|
This driver configures the USIC as an I2C device.
|
|
|
|
Example devicetree configuration with an adt7420 temperature sensor
|
|
connected on the bus:
|
|
|
|
&usic1ch1 {
|
|
compatible = "infineon,xmc4xxx-i2c";
|
|
status = "okay";
|
|
|
|
pinctrl-0 = <&i2c_scl_p0_13_u1c1 &i2c_sda_p3_15_u1c1>;
|
|
pinctrl-names = "default";
|
|
scl-src = "DX1B";
|
|
sda-src = "DX0A";
|
|
interrupts = <94 1>;
|
|
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
clock-frequency = <I2C_BITRATE_STANDARD>;
|
|
adt7420@48 {
|
|
compatible = "adi,adt7420";
|
|
reg = <0x48>;
|
|
};
|
|
};
|
|
|
|
The pinctrl nodes need to be configured as open-drain and
|
|
hwctrl should be disabled:
|
|
|
|
&i2c_scl_p0_13_u1c1 {
|
|
drive-strength = "strong-sharp-edge";
|
|
drive-open-drain;
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
&i2c_sda_p3_15_u1c1 {
|
|
drive-strength = "strong-soft-edge";
|
|
drive-open-drain;
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
compatible: "infineon,xmc4xxx-i2c"
|
|
|
|
include: [i2c-controller.yaml, pinctrl-device.yaml]
|
|
|
|
properties:
|
|
reg:
|
|
type: array
|
|
required: true
|
|
|
|
scl-src:
|
|
description: |
|
|
Connects the I2C clock line (USIC DX1 input) to a specific GPIO pin.
|
|
The USIC DX1 input is a multiplexer which connects to different GPIO pins.
|
|
Refer to the XMC4XXX reference manual for the GPIO pin/mux mappings.
|
|
type: string
|
|
required: true
|
|
enum:
|
|
- "DX1A"
|
|
- "DX1B"
|
|
- "DX1C"
|
|
- "DX1D"
|
|
- "DX1E"
|
|
- "DX1F"
|
|
- "DX1G"
|
|
|
|
sda-src:
|
|
description: |
|
|
Connects the I2C data line (USIC DX0 input) to a specific GPIO pin.
|
|
The USIC DX0 input is a multiplexer which connects to different GPIO pins.
|
|
Refer to the XMC4XXX reference manual for the GPIO pin/mux mappings.
|
|
type: string
|
|
required: true
|
|
enum:
|
|
- "DX0A"
|
|
- "DX0B"
|
|
- "DX0C"
|
|
- "DX0D"
|
|
- "DX0E"
|
|
- "DX0F"
|
|
- "DX0G"
|
|
|
|
interrupts:
|
|
required: true
|
|
description: |
|
|
IRQ number and priority to use for interrupt driven by I2C.
|
|
Each USIC must use a certain interrupt range:
|
|
USIC0 = [84, 89]
|
|
USIC1 = [90, 95]
|
|
USIC2 = [96, 101]
|
|
|
|
pinctrl-0:
|
|
description: |
|
|
PORT pin configuration for SCL, SDA signals.
|
|
We expect that the phandles will reference pinctrl nodes. These
|
|
nodes will have a nodelabel that matches the Infineon SoC Pinctrl
|
|
defines and have following
|
|
format: i2c_<signal>_p<port>_<pin>_<peripheral inst>
|
|
|
|
Examples:
|
|
pinctrl-0 = <&i2c_scl_p5_2_u2c0 &i2c_sda_p5_0_u2c0>;
|
|
|
|
The pins should set to open-drain and hwctrl should be disabled.
|
|
|
|
&i2c_scl_p5_2_u2c0 {
|
|
drive-strength = "strong-sharp-edge";
|
|
drive-open-drain;
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
In the above example, the pin is both an input and output (as is
|
|
required for I2C setup). It is internally connected to both DX0
|
|
and DOUT0 of USIC2 channel 0. (See XMC4700/4800 reference manual
|
|
page 18-110, Figure 18-50 for more details).
|
|
This limits the number of pins that can be used for the I2C module.
|
|
|
|
To get around this pin limitation, it is possible to use pins
|
|
that do not have this internal connection, and instead connect the
|
|
pins externally on the board.
|
|
For example, for the SDA line on USIC2 channel 0, P3.8 may be used
|
|
for DOUT0 and P6.5 for DX0. These type of pinctrl nodes will have
|
|
labels:
|
|
i2c_sda_dout0_p3_8_u2c0 and i2c_sda_dx0_p6_5_u2c0.
|
|
The generalized format is: i2c_<signal>_<type>_p<port>_<pin>_<peripheral inst>
|
|
|
|
An example for SCL and SDA signals on the xmc4700:
|
|
pinctrl-0 = <&i2c_sda_dout0_p3_8_u2c0 &i2c_sda_dx0_p6_5_u2c0
|
|
&i2c_scl_dout1_p3_9_u2c0 &i2c_scl_p5_2_u2c0>;
|
|
|
|
Externally P3.8 should be connected to P6.5; P3.9 should be connected
|
|
to P5.2.
|
|
|
|
Note that any pins that do not have dout0/dx0 or dout1/dx1 can have either
|
|
function. Thus node i2c_scl_p5_0_u2c0 can be both dout1 and dx1.
|
|
|
|
For the pin configurations, the output pins (dout0 and dout1) should be set
|
|
to open-drain while the input pins (dx0 and dx1) should not include this setting.
|
|
|
|
&i2c_sda_dout0_p3_8_u2c0 {
|
|
drive-strength = "strong-sharp-edge";
|
|
drive-open-drain;
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
&i2c_scl_dout1_p3_9_u2c0 {
|
|
drive-strength = "strong-sharp-edge";
|
|
drive-open-drain;
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
&i2c_sda_dx0_p6_5_u2c0 { /* will require USIC setting sda-src = DX0D */
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
&i2c_scl_p5_2_u2c0 { /* will require USIC scl-src = DX1A */
|
|
hwctrl = "disabled";
|
|
};
|
|
|
|
required: true
|
|
|
|
pinctrl-names:
|
|
required: true
|