Compile error when using PWM on nRF54L15 (_P_pwms_IDX_0_VAL_channel undeclared)

Hi,

I'm trying to get the PWM to work to operate a vibrator connected to the nRF54L15 PDK. I'm basing my activity on lesson4 - pwm as I'm also new to Zephyr (but experienced with nrf52).

The configuration part succeeds, but then the compilation fails with the following error:

main.c:26:64: error: 'vibrator_P_pwms_IDX_0_VAL_channel' undeclared here (not in a function)
   26 | static const struct pwm_dt_spec pwm_vibrator = PWM_DT_SPEC_GET(vibrator);
/home/me/ncs/zephyr/include/zephyr/devicetree.h:4888:9: note: in definition of macro 'DT_CAT7'
 4888 |         a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
      |         ^~
/home/me/ncs/zephyr/include/zephyr/devicetree/pwms.h:136:9: note: in expansion of macro 'DT_PHA_BY_IDX'
  136 |         DT_PHA_BY_IDX(node_id, pwms, idx, cell)
      |         ^~~~~~~~~~~~~
/home/me/ncs/zephyr/include/zephyr/devicetree/pwms.h:208:9: note: in expansion of macro 'DT_PWMS_CELL_BY_IDX'
  208 |         DT_PWMS_CELL_BY_IDX(node_id, idx, channel)
      |         ^~~~~~~~~~~~~~~~~~~
/home/me/ncs/zephyr/include/zephyr/drivers/pwm.h:261:28: note: in expansion of macro 'DT_PWMS_CHANNEL_BY_IDX'
  261 |                 .channel = DT_PWMS_CHANNEL_BY_IDX(node_id, idx),               \
      |                            ^~~~~~~~~~~~~~~~~~~~~~
/home/me/ncs/zephyr/include/zephyr/drivers/pwm.h:328:34: note: in expansion of macro 'PWM_DT_SPEC_GET_BY_IDX'
  328 | #define PWM_DT_SPEC_GET(node_id) PWM_DT_SPEC_GET_BY_IDX(node_id, 0)
      |                                  ^~~~~~~~~~~~~~~~~~~~~~
/home/me/srcs/main.c:26:48: note: in expansion of macro 'PWM_DT_SPEC_GET'
   26 | static const struct pwm_dt_spec pwm_vibrator = PWM_DT_SPEC_GET(vibrator);
      |                                                ^~~~~~~~~~~~~~~
/home/me/srcs/main.c:26:64: error: 'vibrator_P_pwms_IDX_0_VAL_period' undeclared here (not in a function)
   26 | static const struct pwm_dt_spec pwm_vibrator = PWM_DT_SPEC_GET(vibrator);
      |                                                                ^~~~~~~~
/home/me/ncs/zephyr/include/zephyr/devicetree.h:4888:9: note: in definition of macro 'DT_CAT7'
 4888 |         a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
      |         ^~
/home/me/ncs/zephyr/include/zephyr/devicetree/pwms.h:136:9: note: in expansion of macro 'DT_PHA_BY_IDX'
  136 |         DT_PHA_BY_IDX(node_id, pwms, idx, cell)
      |         ^~~~~~~~~~~~~
/home/me/ncs/zephyr/include/zephyr/devicetree/pwms.h:249:9: note: in expansion of macro 'DT_PWMS_CELL_BY_IDX'
  249 |         DT_PWMS_CELL_BY_IDX(node_id, idx, period)
      |         ^~~~~~~~~~~~~~~~~~~
/home/me/ncs/zephyr/include/zephyr/drivers/pwm.h:262:27: note: in expansion of macro 'DT_PWMS_PERIOD_BY_IDX'
  262 |                 .period = DT_PWMS_PERIOD_BY_IDX(node_id, idx),                 \
      |                           ^~~~~~~~~~~~~~~~~~~~~
/home/me/ncs/zephyr/include/zephyr/drivers/pwm.h:328:34: note: in expansion of macro 'PWM_DT_SPEC_GET_BY_IDX'
  328 | #define PWM_DT_SPEC_GET(node_id) PWM_DT_SPEC_GET_BY_IDX(node_id, 0)
      |                                  ^~~~~~~~~~~~~~~~~~~~~~
/home/me/srcs/main.c:26:48: note: in expansion of macro 'PWM_DT_SPEC_GET'
   26 | static const struct pwm_dt_spec pwm_vibrator = PWM_DT_SPEC_GET(vibrator);

This is my overlay:

/ {
    vibrator: vibrator {
        compatible = "pwm-servo";
        pwms = <&pwm20 0 PWM_USEC(5) PWM_POLARITY_NORMAL>;
		min-pulse = <PWM_USEC(1)>;
		max-pulse = <PWM_USEC(5)>;
		status = "okay";
    };
};


&pinctrl {
	pwm20_default_custom: pwm20_default_custom {
		group1 {
			psels = <NRF_PSEL(PWM_OUT0, 0, 13)>;
			nordic,invert;
		};
	};
};

&pwm20 {
	status = "okay";
	pinctrl-0 = <&pwm20_default_custom>;
	pinctrl-names = "default";
	/delete-property/ pinctrl-1;
};

This is my basic prj.conf:

CONFIG_PWM=y
CONFIG_LED=y
CONFIG_LED_PWM=y

And this is my basic main.c (I removed some unrelated parts so don't mind line numbers in the error messages):

#include <stdint.h>
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/pwm.h>

#define PWM_VIB     DT_ALIAS(vibrator)

#define PWM_PERIOD_NS   100000000
#define PWM_DUTY_CYCLE  1400000

static const struct pwm_dt_spec pwm_vibrator = PWM_DT_SPEC_GET(PWM_VIB);

void main(void) {

}

If I remove the line where I declare `pwm_vibrator` there's no more compilation error.

How can I make this work ?

All is built with `west build -b [email protected]/nrf54l15/cpuapp`

I'm using the toolchain 2.8.0 and nRF Connect SDK 2.8.0 on a Debian system.

Edit: I'd like to add that I tried to run the example's solution itself and ended up with the same issue.

I've cloned ncs-inter on commit 0b2e2e2, built in ncs-inter/v2.8.x-v2.7.0/l4/l4_e2_sol with 'west build -b [email protected]/nrf54l15/cpuapp' on SDK+toolchain 2.8.0 and obtained the same kind of error, i.e.:

/workdir/zephyr/include/zephyr/device.h:92:41: error: '__device_dts_ord_DT_N_NODELABEL_servo_P_pwms_IDX_0_PH_ORD' undeclared here (not in a function)

This was on my own variation of nrf-docker where I built the image for toolchain/SDK 2.8.0, so it's quite reproducible.

Parents Reply Children
  • Thanks for your reply!

    With help from a colleague, we identified a few issues on my end, hope this can help whoever ends up here in the future, me included:

    - The board chosen does not exist for this exercise, i.e. doesn't have an overlay. It's because I was using the **p**dk instead of the **dk**. After changing to `-b nrf54l15dk`, I finally have all the proper definitions for the PWM module.

    - As the example has parts about pwm-leds and others about pwm-servo, I thought they were interchangeable. They're not, the dts definition of a pwm-led compatible node or a pwm-servo compatible node are different.

    Using this, at least this time the build works:

        pwmleds {
            compatible = "pwm-leds";
    		vibrator: vibrator {
    			pwms = <&pwm20 0 PWM_USEC(5) PWM_POLARITY_NORMAL>;
    			status = "okay";
    		};
    	};

    I managed to get a successful build with these changes, so it's already something. I don't see any signal on the pin, but I think I'll figure this out.

    I wish Zepyhr devicetree config errors or overlays not found would be a bit more obvious than some obscure missing definitions in generated code, that makes it hard to progress.

  • Great! Glad you got it solved, and shared your solution in case anyone else runs into the same thing.

    Let us know if there is anything else.

    Regards,

    Elfving

Related