Error in configuring UART pins in SDK2.3.0

Hi there,

I have recently switched my complete "Bluetooth Peripheral" Project from the SDK version 1.9.1 to 2.3.0 

I have been facing some of the pin control issue for the UART, as I have observe you have change the way the UART is working and added the pinctrl functionality.

Previously on the 1.9.1, I was using the UART pins shown under.

&uart0 {
	rts-pin = < 0xff >;
	cts-pin = < 0xff >;
};

&uart2 {
	current-speed = <9600>;
	status = "okay";
	tx-pin = <4>;  
	rx-pin = <5>;
	rts-pin = < 0xff >;
	cts-pin = < 0xff >;
	rx-pull-up;
};

I am using this UART2 for communicating with the BMS(Battery management system), but now in the new SDK when using the same pin configuration, I am getting the error 

"d:\v2.3.0\zephyr\include\zephyr\toolchain\gcc.h:78:36: error: static assertion failed: "/soc/peripheral@50000000/uart@b000 defined without required pin configuration""

"d:\v2.3.0\zephyr\include\zephyr\toolchain\gcc.h:78:36: error: static assertion failed: "/soc/peripheral@50000000/uart@b000 has legacy *-pin properties defined although PINCTRL is enabled"

I am using SDK 2.3.0, and my board is the Nordic Thingy53.

Could you please advise on how to resolve this error and properly configure the UART on my SoC?

Regards 
Sachin

Parents
  • Hi Sachin,

    If pinctrl is enabled (as it is in your case) then you must define the UART pins under the &pinctrl node of the devicetree. The pins defined directly in the uart devices are not used and are the cause of your second error.

    Take a look at the board for Thingy53 (ncs\v2.3.0\zephyr\boards\arm\thingy53_nrf5340). Specifically, look at thingy53_nrf5340_common-pinctrl.dtsi which defines the pins for many of the devices on Thingy53. This dtsi file is included by thingy53_nrf5340_common.dts. Also note how the pinctrl nodes are tied back into the &uart node.

    Good luck.

    /Ross

  • I have figure out something and change the code accordingly, look at the changes that I have done and compare it with the old UART config and tell me if this is the correct way?

    &uart2 {
    	current-speed = <9600>;
    	status = "okay";	
    	rx-pull-up;
    	pinctrl-0 = <&uart2_default>;
    	pinctrl-1 = <&uart2_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    &pinctrl {
    	uart2_default: uart2_default {
    		group1 {
    			psels = <NRF_PSEL(UART_TX, 0, 4)>,
    				<NRF_PSEL(UART_RX, 0, 5)>;
    		};
    	};
    
    	uart2_sleep: uart2_sleep {
    		group1 {
    			psels = <NRF_PSEL(UART_TX, 0, 4)>,
    				<NRF_PSEL(UART_RX, 0, 5)>;
    			low-power-enable;
    		};
    	};
    };

  • That mostly looks okay. However, the rx-pull-up is related to the rx-pin and should also be done using pinctrl. You can see this mentioned in the bindings file ncs\v2.3.0\zephyr\dts\bindings\serial\nordic,nrf-uart-common.yaml which marks it as deprecated.

    &uart2 {
        current-speed = <9600>;
        status = "okay";    
        pinctrl-0 = <&uart2_default>;
        pinctrl-1 = <&uart2_sleep>;
        pinctrl-names = "default", "sleep";
    };
    &pinctrl {
        uart2_default: uart2_default {
            group1 {
                psels = <NRF_PSEL(UART_TX, 0, 4)>;
            };
            group2 {
                psels = <NRF_PSEL(UART_RX, 0, 5)>;
                bias-pull-up;
            };
        };

        uart2_sleep: uart2_sleep {
            group1 {
                psels = <NRF_PSEL(UART_TX, 0, 4)>,
                    <NRF_PSEL(UART_RX, 0, 5)>;
                low-power-enable;
            };
        };
    };

  • Wow great,
    I replace the old code with the code you provided.

    I am using 

    static const struct device *bms_uart;

    bms_uart = device_get_binding("UART_2");

    if (bms_uart == NULL) {
        printk("Failed to get UART2 binding\n");    
        return;        
      }

    In order to bind the device, but this is not working and always printing failed.

Reply
  • Wow great,
    I replace the old code with the code you provided.

    I am using 

    static const struct device *bms_uart;

    bms_uart = device_get_binding("UART_2");

    if (bms_uart == NULL) {
        printk("Failed to get UART2 binding\n");    
        return;        
      }

    In order to bind the device, but this is not working and always printing failed.

Children
  • I've not used device_get_binding() in my own code. Instead I use the device tree macros. So something like this...

    static const struct device *bms_uart = DEVICE_DT_GET(DT_NODELABEL(uart2));

    Note that uart2 is the node label defined in the devicetree fragment above. I'm not certain where the 'name' comes from which is the argument to device_get_bindings(). There are several ways to obtain the device pointer.

  • After changing the code to this

    static const struct device *bms_uart;

    bms_uart = DEVICE_DT_GET(DT_NODELABEL(uart2)); 

    if (bms_uart == NULL) {
        printk("Failed to get UART2 binding\n");    
        return;        
      }
    I am getting the USAGE FAULT
    *** Booting Zephyr OS build v3.2.99-ncs2 ***
    00> [00:00:17.360,290] <inf> fs_nvs: nvs_mount: 8 Sectors of 4096 bytes
    00> [00:00:17.360,931] <inf> fs_nvs: nvs_mount: alloc wra: 0, fd0
    00> [00:00:17.361,572] <inf> fs_nvs: nvs_mount: data wra: 0, 1a
    00> Bluetooth initialized as slave
    00> [00:00:17.380,798] <err> os: usage_fault: ***** USAGE FAULT *****
    00> [00:00:17.381,408] <err> os: usage_fault:   Illegal use of the EPSR
    00> [00:00:17.382,019] <err> os: esf_dump: r0/a1:  0x00046bf4  r1/a2:  0x20006ecc  r2/a3:  0x0000000d
    00> [00:00:17.382,873] <err> os: esf_dump: r3/a4:  0x000003e8 r12/ip:  0x00000000 r14/lr:  0x0001aab5
    00> [00:00:17.383,697] <err> os: esf_dump:  xpsr:  0x00000000
    00> [00:00:17.384,307] <err> os: esf_dump: s[ 0]:  0x00000000  s[ 1]:  0x00000000  s[ 2]:  0x00000000  s[ 3]:  0x00000000
    00> [00:00:17.385,314] <err> os: esf_dump: s[ 4]:  0x00000000  s[ 5]:  0x00000000  s[ 6]:  0x00000000  s[ 7]:  0x00000000
    00> [00:00:17.386,322] <err> os: esf_dump: s[ 8]:  0x00000000  s[ 9]:  0x00000000  s[10]:  0x00000000  s[11]:  0x00000000
    00> [00:00:17.387,329] <err> os: esf_dump: s[12]:  0x00000000  s[13]:  0x00000000  s[14]:  0x00000000  s[15]:  0x00000000
    00> [00:00:17.388,336] <err> os: esf_dump: fpscr:  0x00000000
    00> [00:00:17.388,916] <err> os: esf_dump: Faulting instruction address (r15/pc): 0x00000000
    00> [00:00:17.389,617] <err> os: z_fatal_error: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
    00> [00:00:17.390,380] <err> os: z_fatal_error: Current thread: 0x20003ea0 (unknown)
    00> [00:00:17.396,118] <err> fatal_error: k_sys_fatal_error_handler: Resetting system
Related