PWM peripheral defaults pins to 0 when I want them to invert and default to 1

Hello,

I am using the nrf5340 on some custom hardware, and I am using 3 LEDʻs and running them with the PWM0 peripheral to fade and blink and indicate states for the firmware. The LEDʻs are driven as active-low, and I am using the PWM flag PWM_POLARITY_INVERTED in the device tree to make sure this works.

After initialization, the PWM peripheral works very well, and using the zephyr driver is very easy to use. However, I am finding that before initialization, there is a function called in the pwm_nrfx.c that will reset the LEDʻs pin states to 0. This, of course, turns the LEDʻs on, and I have to set the PWM peripheral to 0% duty cycle when I initialize in my own code in order to make sure they start in the OFF state.

This results in a brief flash of white at the start of the firmware, of which I found no way to control. I am trying to debug and step through to figure out why this is not working but what I am arriving at is the PWM_POLARITY_INVERTED is not actually taken into account when the pins get initialized. Is this correct? Is there a way I can configure this and make sure the pins initialize to digital 1 because they should be ACTIVE_LOW?

Here is my device tree file configuring PWM0:

/ {
    pwmleds {
        compatible = "pwm-leds";
        pwm_led0: pwm_led_0 {
            pwms = <&pwm0 0 PWM_MSEC(10) PWM_POLARITY_INVERTED>;
        };
        pwm_led1: pwm_led_1 {
			pwms = <&pwm0 1 PWM_MSEC(10) PWM_POLARITY_INVERTED>;
		};
        pwm_led2: pwm_led_2 {
			pwms = <&pwm0 2 PWM_MSEC(10) PWM_POLARITY_INVERTED>;
		};
	};
};

&pwm0 {
	status = "okay";
	pinctrl-0 = <&pwm0_default>;
	pinctrl-1 = <&pwm0_sleep>;
	pinctrl-names = "default", "sleep";
};

pwm0_default: pwm0_default {
	group1 {
		psels = <NRF_PSEL(PWM_OUT0, 0, 28)>,
		        <NRF_PSEL(PWM_OUT1, 0, 29)>,
		        <NRF_PSEL(PWM_OUT2, 0, 30)>;
        };
};

Here is my code that initializes the PWM LEDs:

static const struct pwm_dt_spec _ledr       = PWM_DT_SPEC_GET(DT_ALIAS(pwm_ledr));
static const struct pwm_dt_spec _ledg       = PWM_DT_SPEC_GET(DT_ALIAS(pwm_ledg));
static const struct pwm_dt_spec _ledb       = PWM_DT_SPEC_GET(DT_ALIAS(pwm_ledb));

// These identifiers match up to the DT node identifiers
static const struct pwm_dt_spec *_leds[3] = {
    &_ledr,
    &_ledg,
    &_ledb,
};

if (!device_is_ready(_ledr.dev)) {
	LOG_ERR("Error: PWM device %s is not ready", _ledr.dev->name);
	return -ENODEV;
} else if (!device_is_ready(_ledg.dev)) {
	LOG_ERR("Error: PWM device %s is not ready", _ledg.dev->name);
	return -ENODEV;
} else if (!device_is_ready(_ledb.dev)) {
	LOG_ERR("Error: PWM device %s is not ready", _ledb.dev->name);
	return -ENODEV;
}

int err = pwm_leds_off(LED_ALL);
LOG_ERR_AND_RETURN(err, "pwm_leds_off");

and here is the line of code (line 239 in pwm_nrfx.c) that I am referring to that results in all LEDʻs (despite the PWM_POLARITY_INVERTED)  setting to 0 and therefore turning on:

int ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);

Parents
  • Hi,

    Pin control docs:

    "nordic,invert: Invert pin polarity (set active state to low). This property is valid only for PWM channel output pins."

    Examples:

    ag "nordic,invert" -G dts
    zephyr/dts/bindings/pinctrl/nordic,nrf-pinctrl.yaml
    117:      nordic,invert:
    
    zephyr/boards/arm/o1-agg-nrf52833/o1-agg-nrf52833-pinctrl.dtsi
    76:			nordic,invert;
    
    zephyr/boards/arm/xiao_ble/xiao_ble-pinctrl.dtsi
    58:			nordic,invert;
    
    zephyr/boards/arm/nrf52840dongle_nrf52840/nrf52840dongle_nrf52840-pinctrl.dtsi
    64:			nordic,invert;
    
    zephyr/boards/arm/actinius_icarus_bee/actinius_icarus_bee_common-pinctrl.dtsi
    63:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkninab3_nrf52840/ubx_evkninab3_nrf52840-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/sparkfun_thing_plus_nrf9160/sparkfun_thing_plus_nrf9160_common-pinctrl.dtsi
    70:			nordic,invert;
    
    zephyr/boards/arm/raytac_mdbt50q_db_40_nrf52840/raytac_mdbt50q_db_40_nrf52840-pinctrl.dtsi
    82:			nordic,invert;
    
    zephyr/boards/arm/blueclover_plt_demo_v2_nrf52832/blueclover_plt_demo_v2_nrf52832-pinctrl.dtsi
    40:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkninab1_nrf52832/ubx_evkninab1_nrf52832-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/pan1780_evb/pan1780_evb-pinctrl.dtsi
    81:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd300eval_nrf52832/ubx_bmd300eval_nrf52832-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/nrf21540dk_nrf52840/nrf21540dk_nrf52840-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/nrf9160_innblue22/nrf9160_innblue22_common-pinctrl.dtsi
    72:			nordic,invert;
    89:			nordic,invert;
    
    zephyr/boards/arm/actinius_icarus/actinius_icarus_common-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/decawave_dwm1001_dev/decawave_dwm1001_dev-pinctrl.dtsi
    75:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkninab4_nrf52833/ubx_evkninab4_nrf52833-pinctrl.dtsi
    97:			nordic,invert;
    
    zephyr/boards/arm/ebyte_e73_tbb_nrf52832/ebyte_e73_tbb_nrf52832-pinctrl.dtsi
    29:			nordic,invert;
    
    zephyr/boards/arm/actinius_icarus_som_dk/actinius_icarus_som_dk_common-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd380eval_nrf52840/ubx_bmd380eval_nrf52840-pinctrl.dtsi
    44:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkannab1_nrf52832/ubx_evkannab1_nrf52832-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/pan1770_evb/pan1770_evb-pinctrl.dtsi
    82:			nordic,invert;
    
    zephyr/boards/arm/nrf52840_papyr/nrf52840_papyr-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/reel_board/dts/reel_board-pinctrl.dtsi
    64:			nordic,invert;
    
    zephyr/boards/arm/reel_board/reel_board-pinctrl.dtsi
    29:		nordic,invert;
    
    zephyr/boards/arm/nrf52832_mdk/nrf52832_mdk-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/nrf52840dk_nrf52811/nrf52840dk_nrf52811-pinctrl.dtsi
    47:			nordic,invert;
    
    zephyr/boards/arm/nrf52840_mdk/nrf52840_mdk-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/raytac_mdbt50q_db_33_nrf52833/raytac_mdbt50q_db_33_nrf52833-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd345eval_nrf52840/ubx_bmd345eval_nrf52840-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd340eval_nrf52840/ubx_bmd340eval_nrf52840-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd330eval_nrf52810/ubx_bmd330eval_nrf52810-pinctrl.dtsi
    44:			nordic,invert;
    
    zephyr/boards/arm/arduino_nano_33_ble/arduino_nano_33_ble-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/nrf52833dk_nrf52833/nrf52833dk_nrf52833-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/pan1782_evb/pan1782_evb-pinctrl.dtsi
    66:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd360eval_nrf52811/ubx_bmd360eval_nrf52811-pinctrl.dtsi
    44:			nordic,invert;
    
    zephyr/boards/arm/nrf9160_innblue21/nrf9160_innblue21_common-pinctrl.dtsi
    72:			nordic,invert;
    89:			nordic,invert;
    
    nrf/boards/arm/nrf52kbd_nrf52832/nrf52kbd_nrf52832-pinctrl.dtsi
    28:			nordic,invert;
    

    Regards,
    Sigurd Hellesvik

Reply
  • Hi,

    Pin control docs:

    "nordic,invert: Invert pin polarity (set active state to low). This property is valid only for PWM channel output pins."

    Examples:

    ag "nordic,invert" -G dts
    zephyr/dts/bindings/pinctrl/nordic,nrf-pinctrl.yaml
    117:      nordic,invert:
    
    zephyr/boards/arm/o1-agg-nrf52833/o1-agg-nrf52833-pinctrl.dtsi
    76:			nordic,invert;
    
    zephyr/boards/arm/xiao_ble/xiao_ble-pinctrl.dtsi
    58:			nordic,invert;
    
    zephyr/boards/arm/nrf52840dongle_nrf52840/nrf52840dongle_nrf52840-pinctrl.dtsi
    64:			nordic,invert;
    
    zephyr/boards/arm/actinius_icarus_bee/actinius_icarus_bee_common-pinctrl.dtsi
    63:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkninab3_nrf52840/ubx_evkninab3_nrf52840-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/sparkfun_thing_plus_nrf9160/sparkfun_thing_plus_nrf9160_common-pinctrl.dtsi
    70:			nordic,invert;
    
    zephyr/boards/arm/raytac_mdbt50q_db_40_nrf52840/raytac_mdbt50q_db_40_nrf52840-pinctrl.dtsi
    82:			nordic,invert;
    
    zephyr/boards/arm/blueclover_plt_demo_v2_nrf52832/blueclover_plt_demo_v2_nrf52832-pinctrl.dtsi
    40:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkninab1_nrf52832/ubx_evkninab1_nrf52832-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/pan1780_evb/pan1780_evb-pinctrl.dtsi
    81:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd300eval_nrf52832/ubx_bmd300eval_nrf52832-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/nrf21540dk_nrf52840/nrf21540dk_nrf52840-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/nrf9160_innblue22/nrf9160_innblue22_common-pinctrl.dtsi
    72:			nordic,invert;
    89:			nordic,invert;
    
    zephyr/boards/arm/actinius_icarus/actinius_icarus_common-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/decawave_dwm1001_dev/decawave_dwm1001_dev-pinctrl.dtsi
    75:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkninab4_nrf52833/ubx_evkninab4_nrf52833-pinctrl.dtsi
    97:			nordic,invert;
    
    zephyr/boards/arm/ebyte_e73_tbb_nrf52832/ebyte_e73_tbb_nrf52832-pinctrl.dtsi
    29:			nordic,invert;
    
    zephyr/boards/arm/actinius_icarus_som_dk/actinius_icarus_som_dk_common-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd380eval_nrf52840/ubx_bmd380eval_nrf52840-pinctrl.dtsi
    44:			nordic,invert;
    
    zephyr/boards/arm/ubx_evkannab1_nrf52832/ubx_evkannab1_nrf52832-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/pan1770_evb/pan1770_evb-pinctrl.dtsi
    82:			nordic,invert;
    
    zephyr/boards/arm/nrf52840_papyr/nrf52840_papyr-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/reel_board/dts/reel_board-pinctrl.dtsi
    64:			nordic,invert;
    
    zephyr/boards/arm/reel_board/reel_board-pinctrl.dtsi
    29:		nordic,invert;
    
    zephyr/boards/arm/nrf52832_mdk/nrf52832_mdk-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/nrf52840dk_nrf52811/nrf52840dk_nrf52811-pinctrl.dtsi
    47:			nordic,invert;
    
    zephyr/boards/arm/nrf52840_mdk/nrf52840_mdk-pinctrl.dtsi
    61:			nordic,invert;
    
    zephyr/boards/arm/raytac_mdbt50q_db_33_nrf52833/raytac_mdbt50q_db_33_nrf52833-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd345eval_nrf52840/ubx_bmd345eval_nrf52840-pinctrl.dtsi
    59:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd340eval_nrf52840/ubx_bmd340eval_nrf52840-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd330eval_nrf52810/ubx_bmd330eval_nrf52810-pinctrl.dtsi
    44:			nordic,invert;
    
    zephyr/boards/arm/arduino_nano_33_ble/arduino_nano_33_ble-pinctrl.dtsi
    74:			nordic,invert;
    
    zephyr/boards/arm/nrf52833dk_nrf52833/nrf52833dk_nrf52833-pinctrl.dtsi
    80:			nordic,invert;
    
    zephyr/boards/arm/pan1782_evb/pan1782_evb-pinctrl.dtsi
    66:			nordic,invert;
    
    zephyr/boards/arm/ubx_bmd360eval_nrf52811/ubx_bmd360eval_nrf52811-pinctrl.dtsi
    44:			nordic,invert;
    
    zephyr/boards/arm/nrf9160_innblue21/nrf9160_innblue21_common-pinctrl.dtsi
    72:			nordic,invert;
    89:			nordic,invert;
    
    nrf/boards/arm/nrf52kbd_nrf52832/nrf52kbd_nrf52832-pinctrl.dtsi
    28:			nordic,invert;
    

    Regards,
    Sigurd Hellesvik

Children
Related