127 lines
4.2 KiB
YAML
127 lines
4.2 KiB
YAML
# Copyright (c) 2023 SLB
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
description: |
|
|
Infineon XMC4XXX PWM Capture Compare Unit 8 (CCU8) module
|
|
|
|
The PWM CCU8 module can automatically generate a high-side
|
|
and a low-side PWM signal, where the two signals are complementary
|
|
to each other.
|
|
|
|
The module supports adding a dead time between the high-side and
|
|
low-side PWM signals.
|
|
|
|
The dead time ensures that there is a delay before the PWM state
|
|
transitions from 0 to 1, preventing the high-side and low-side
|
|
switches from being on simultaneously.
|
|
|
|
There are two CCU8 modules with DTS node labels: pwm_ccu80 and
|
|
pwm_ccu81. Each module has four slices, and each slice has
|
|
two channels. A channel consists of a corresponding high-side
|
|
and low-side PWM signal.
|
|
|
|
The CCU8 modules use the CCU clock source. Each slice applies
|
|
a separate prescaler to divide the clock. The clock divider is
|
|
defined by the 'slice-prescaler' property. Additionally, each
|
|
slice has a dead time prescaler, which divides the slice clock
|
|
for the dead time counter.
|
|
|
|
Device tree example:
|
|
A node can define a 'pwm' field, usually referenced in a 'pwms'
|
|
property, where the entries include the PWM module phandle,
|
|
channel number, pulse period (in nanoseconds or set using
|
|
PWM_XX() macros), and a channel
|
|
flag (PWM_POLARITY_NORMAL/PWM_POLARITY_INVERTED).
|
|
|
|
The 'pwm_ccu8' node must define the following fields:
|
|
&pwm_ccu80 {
|
|
slice-prescaler = <15 15 15 15>;
|
|
slice-deadtime-prescaler = <3 3 3 3>;
|
|
channel-deadtime-high = <0 0 0 0 PWM_MSEC(100) 0 0 0>;
|
|
channel-deadtime-low = <0 0 0 0 PWM_MSEC(100) 0 0 0>;
|
|
pinctrl-0 = <&pwm_out_p5_9_ccu80_ch4_high &pwm_out_p0_0_ccu80_ch4_low>;
|
|
pinctrl-names = "default";
|
|
};
|
|
|
|
This will configure channel 4 with a 100msec deadtime on the high
|
|
and low side PWM signals.
|
|
|
|
Another node can reference the PWM as follows:
|
|
&test_node {
|
|
...
|
|
pwms = <&pwm_ccu80 0 PWM_SEC(1) PWM_POLARITY_NORMAL>;
|
|
...
|
|
};
|
|
|
|
The 'pwm_out_p{PORT}_{PIN}_ccu8{MODULE_IDX}_ch{CHANNEL_IDX}_{HIGH_LOW}'
|
|
format is used for CCU8 pinctrl nodes. 'MODULE_IDX' and 'CHANNEL_IDX'
|
|
refer to a specific 'pwm_ccu8x' module and channel, respectively.
|
|
'PORT/PIN' defines the GPIO that the channel connects to.
|
|
'HIGH_LOW' indicates whether the pin is for the high or low-side signal.
|
|
|
|
It's not necessary to specify both the high and low pinctrls. Only the low-side
|
|
signal can, for example, be used as PWM, but note that the duty cycle of the
|
|
low signal will be (1 - duty) as set via the API.
|
|
|
|
Note that a slice has two channels. Channels 0/1 are in slice 0,
|
|
channels 2/3 are in slice 1, and so on. Each channel can have its own
|
|
duty cycle and high/low dead times. But the pulse duration applies to
|
|
both channels. Thus, when using the PWM control api to modify the pulse width
|
|
on a channel 0, it will also be updated for channel 1 since they are
|
|
in the same slice.
|
|
|
|
compatible: "infineon,xmc4xxx-ccu8-pwm"
|
|
|
|
include:
|
|
- name: base.yaml
|
|
- name: pwm-controller.yaml
|
|
- name: pinctrl-device.yaml
|
|
|
|
properties:
|
|
reg:
|
|
required: true
|
|
|
|
pinctrl-0:
|
|
required: true
|
|
|
|
pinctrl-names:
|
|
required: true
|
|
|
|
slice-prescaler:
|
|
type: array
|
|
required: true
|
|
description: |
|
|
Defines the clock divider for each slice.
|
|
The entry in the array will divide CCU clock by (2 << value).
|
|
The range for the prescaler values is [0, 15].
|
|
Reducing prescaler value will improve resolution but decrease the maximum period.
|
|
|
|
slice-deadtime-prescaler:
|
|
type: array
|
|
required: true
|
|
description: |
|
|
Defines the clock divider for dead time counter for each slice.
|
|
The range for the values is [0, 3].
|
|
Reducing prescaler value will improve dead time resolution but decrease the
|
|
maximum dead time.
|
|
|
|
channel-deadtime-high:
|
|
type: array
|
|
required: true
|
|
description: |
|
|
Defines the dead time in nanoseconds for the high-side PWM signal for each channel.
|
|
|
|
channel-deadtime-low:
|
|
type: array
|
|
required: true
|
|
description: |
|
|
Defines the dead time in nanoseconds for the low-side PWM signal for each channel.
|
|
|
|
"#pwm-cells":
|
|
const: 3
|
|
|
|
pwm-cells:
|
|
- channel
|
|
- period
|
|
- flags
|