| # 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 |