Skip to main content
Graduate
July 11, 2024
Question

Problem configuring duty cycle in devicetree

  • July 11, 2024
  • 1 reply
  • 970 views

Hello,
I am trying to configure a PWM in the boot process. I followed the steps in the documentation https://wiki.st.com/stm32mpu/wiki/TIM_device_tree_configuration .

I configured the pwmleds node

pwmleds {
		compatible = "pwm-leds";
		example {
			label = "stm32-pwm-leds-example";
			/* Use pwm1 channel 0 (e.g. TIM1_CH1) */
			/* period in nanoseconds (500000), normal polarity (0) */
			pwms = <&pwm1 0 30518 0>;
			max-brightness = <255>;
		};
	};
/* PWM DT provider on TIM1: "pwm1" */
&timers1 {
	status = "okay";
	/* spare all DMA channels since they are not needed for PWM output */
	/delete-property/dmas;
	/delete-property/dma-names;
	/* define pwm1 label */
	pwm1: pwm {
		/* configure PWM pins on TIM1_CH1 */
		pinctrl-0 = <&pwm1_pins_a>;
		pinctrl-1 = <&pwm1_sleep_pins_a>;
		pinctrl-names = "default", "sleep";
		/* enable PWM on TIM1 */
		status = "okay";
	};
};

I run the command cat /sys/kernel/debug/pwm
I see the next line
pwm-0   (example             :( requested enabled period: 30518 ns duty: 0 ns polarity: normal


The period is OK, but the  duty cycle is 0, so  basically the signal is always low.

How can I configure the duty cycle in the devicetree if I want to have the pwm working well in  the boot process?

I am in the 6.1 kernel version in the mickledore branch.

 

Regards, @obedPH 

    This topic has been closed for replies.

    1 reply

    Technical Moderator
    July 12, 2024

    Hi @obedPH 

    I fear PWM cannot put in 'run' only by Device Tree settings, which is mostly HW configuration.

    You need to use it thru the framework.

    https://wiki.st.com/stm32mpu/wiki/PWM_overview

    Regards.

    obedPHAuthor
    Graduate
    July 15, 2024

    Hi, @PatrickF , thank you for your response.

    I see. I'm trying something different. I'll give you more context. I am using a MuRata module for the wifi in a custom PCB with a STM32MP15, for several reasons I have to use a timer for the LPO pin, since I don't have more lsco available sources. I need to use a pwm timer before the brcmfmac starts in order to make the wifi module work properly. I modified the leds-pwm.c file and the PWM was working, bit it didn't work as I wanted,  because, apparently, it needs to start way before if I want my wifi module to bring on correctly. Now I am trying to modify the u-boot, I added this lines in the stm32mp157f-dk2.dts.

     

    pwmleds {
     compatible = "pwm-leds";
     example {
     //label = "stm32-pwm-leds-example";
     /* Use pwm1 channel 0 (e.g. TIM1_CH1) */
     /* period in nanoseconds (500000), normal polarity (0) */
     pwms = <&pwm1 2 30518>;
     max-brightness = <255>;
     u-boot,default-brightness = <127>;
     };
    	};

     

     I saw the /drivers/led/led_pwm.c and this file reads the u-boot,default-brightness attribute. The problem is, in the u-boot process, the pwm is not active.

     

    Searching in the configuration files, I noticed that the configs/stm32mp15_defconfig does not have the LED_PWM = y line

     

    CONFIG_SYS_I2C_STM32F7=y
    CONFIG_LED=y
    CONFIG_LED_GPIO=y
    CONFIG_STM32_FMC2_EBI=y

     

    It just has the LED_GPIO configured, so I suspect that this is the reason why the driver is not working, since I added some logs in the driver and I don't see those log messages during the boot process.

    How should I configure the devicetree if I want to load that driver in the u-boot? I suspect that I have to edit the config node in the stm32mp157f-dk2-u-boot.dtsi file, because I can see some leds configurations there, but I don't know how:

     

    // SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-3-Clause)
    /*
     * Copyright (C) 2024, STMicroelectronics - All Rights Reserved
     * Author: STM32CubeMX code generation for STMicroelectronics.
     */
    
    /* For more information on Device Tree configuration, please refer to
     * https://wiki.st.com/stm32mpu/wiki/Category:Device_tree_configuration
     */
    
    /* USER CODE BEGIN includes */
    #include "stm32mp15-scmi-u-boot.dtsi"
    /* USER CODE END includes */
    
    / {
    
     /* USER CODE BEGIN root */
    
     aliases{
     i2c3 = &i2c4;
     usb0 = &usbotg_hs;
     };
    
     config{
     u-boot,boot-led = "heartbeat";
     u-boot,error-led = "error";
     u-boot,mmc-env-partition = "u-boot-env";
     //st,adc_usb_pd = <&adc1 18>, <&adc1 19>;
     st,fastboot-gpios = <&gpioa 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
     st,stm32prog-gpios = <&gpioa 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
     };
    
     led{
    
     led-red{
     label = "error";
     gpios = <&gpioa 13 GPIO_ACTIVE_LOW>;
     default-state = "off";
     status = "okay";
     };
     };
     /* USER CODE END root */
    
    }; /*root*/
    
    /* USER CODE BEGIN addons */
    
    &pmic {
     u-boot,dm-pre-reloc;
    };
    
    &uart4{
     u-boot,dm-pre-reloc;
    };
    
    &usbotg_hs{
     u-boot,force-b-session-valid;
    };
    
    &uart4_pins_mx {
     u-boot,dm-pre-reloc;
     pins1 { /* UART4_RX */
     u-boot,dm-pre-reloc;
     /* pull-up on rx to avoid floating level */
     bias-pull-up;
     };
     pins2 {
     u-boot,dm-pre-reloc;
     };
    };

     

     

    Regards, @obedPH