Hi there,
I've been developing nicely with the nrf52840SDK board for a while now.
I am trying to create a custom board now for our development PCB using nRf52840 micro.
I created a new board with nrf52840 as the SoC and then created an overlay file with all my peripherals.
Seems to build ok, but when I try to get a pointer to a device node, GPIO, SPI etc I get errors such as...
FAILED: zephyr/drivers/spi/CMakeFiles/drivers__spi.dir/spi_nrfx_spim.c.obj
c:\Temp\Wearable\Code\SB_wearableFW\build\zephyr\include\generated\devicetree_unfixed.h:11437:38: errorC:\ncs\v2.1.0\zephyr\include\zephyr\toolchain\gcc.h:77:36: error: static assertion failed: "/soc/spi@40004000 defined without required pin configuration"
'DT_N_S_soc_S_spi_40004000_P_sck_pin' undeclared here (not in a function); did you mean 'DT_N_S_soc_S_spi_40004000_P_status'?
C:\ncs\v2.1.0\zephyr\include\zephyr\toolchain\gcc.h:77:36: error: static assertion failed: "/soc/spi@40023000 defined without required pin configuration"
The devices seem to be picked up as shown here..
and they are included in the compiled device tree output file...
/dts-v1/; / { #address-cells = <1>; #size-cells = <1>; model = "SB_Wearable"; compatible = "cubik-innovation-,sb-wearable01"; chosen { zephyr,entropy = &cryptocell; zephyr,flash-controller = &flash_controller; zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; }; aliases { key1 = &button0; key2 = &button1; backlightpwm = &pwm0; hapticpwm = &pwm1; buzzerpwm = &pwm2; }; soc { #address-cells = <1>; #size-cells = <1>; compatible = "nordic,nRF52840-QIAA", "nordic,nRF52840", "nordic,nRF52", "simple-bus"; interrupt-parent = <&nvic>; ranges; nvic: interrupt-controller@e000e100 { #address-cells = <1>; compatible = "arm,v7m-nvic"; reg = <0xe000e100 0xc00>; interrupt-controller; #interrupt-cells = <2>; arm,num-irq-priority-bits = <3>; }; systick: timer@e000e010 { compatible = "arm,armv7m-systick"; reg = <0xe000e010 0x10>; status = "disabled"; }; ficr: ficr@10000000 { compatible = "nordic,nrf-ficr"; reg = <0x10000000 0x1000>; status = "okay"; }; uicr: uicr@10001000 { compatible = "nordic,nrf-uicr"; reg = <0x10001000 0x1000>; status = "okay"; }; sram0: memory@20000000 { compatible = "mmio-sram"; reg = <0x20000000 DT_SIZE_K(256)>; }; clock: clock@40000000 { compatible = "nordic,nrf-clock"; reg = <0x40000000 0x1000>; interrupts = <0 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; power: power@40000000 { compatible = "nordic,nrf-power"; reg = <0x40000000 0x1000>; interrupts = <0 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; radio: radio@40001000 { compatible = "nordic,nrf-radio"; reg = <0x40001000 0x1000>; interrupts = <1 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; ieee802154-supported; ble-2mbps-supported; ble-coded-phy-supported; tx-high-power-supported; }; uart0: uart@40002000 { compatible = "nordic,nrf-uarte"; reg = <0x40002000 0x1000>; interrupts = <2 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; i2c0: i2c@40003000 { compatible = "nordic,nrf-twim"; #address-cells = <1>; #size-cells = <0>; reg = <0x40003000 0x1000>; clock-frequency = <I2C_BITRATE_STANDARD>; interrupts = <3 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; batt_I2C: batt_chg@3c { compatible = "i2c-device"; reg = <0x3c>; label = "Battery charger I2C"; }; }; spi0: spi@40003000 { compatible = "nordic,nrf-spim"; #address-cells = <1>; #size-cells = <0>; reg = <0x40003000 0x1000>; interrupts = <3 NRF_DEFAULT_IRQ_PRIORITY>; max-frequency = <DT_FREQ_M(8)>; status = "disabled"; }; i2c1: i2c@40004000 { compatible = "nordic,nrf-twim"; #address-cells = <1>; #size-cells = <0>; reg = <0x40004000 0x1000>; clock-frequency = <I2C_BITRATE_STANDARD>; interrupts = <4 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; spi1: my_spi_master: spi@40004000 { compatible = "nordic,nrf-spim"; #address-cells = <1>; #size-cells = <0>; reg = <0x40004000 0x1000>; interrupts = <4 NRF_DEFAULT_IRQ_PRIORITY>; max-frequency = <DT_FREQ_M(8)>; status = "okay"; pinctrl-0 = <&spi1_default>; pinctrl-1 = <&spi1_sleep>; cs-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; display_spi: display@0 { reg = <0>; }; }; nfct: nfct@40005000 { compatible = "nordic,nrf-nfct"; reg = <0x40005000 0x1000>; interrupts = <5 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; gpiote: gpiote@40006000 { compatible = "nordic,nrf-gpiote"; reg = <0x40006000 0x1000>; interrupts = <6 5>; status = "disabled"; }; adc: adc@40007000 { compatible = "nordic,nrf-saadc"; reg = <0x40007000 0x1000>; interrupts = <7 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; }; timer0: timer@40008000 { compatible = "nordic,nrf-timer"; status = "okay"; reg = <0x40008000 0x1000>; cc-num = <4>; interrupts = <8 NRF_DEFAULT_IRQ_PRIORITY>; prescaler = <0>; }; timer1: timer@40009000 { compatible = "nordic,nrf-timer"; status = "okay"; reg = <0x40009000 0x1000>; cc-num = <4>; interrupts = <9 NRF_DEFAULT_IRQ_PRIORITY>; prescaler = <0>; }; timer2: timer@4000a000 { compatible = "nordic,nrf-timer"; status = "okay"; reg = <0x4000a000 0x1000>; cc-num = <4>; interrupts = <10 NRF_DEFAULT_IRQ_PRIORITY>; prescaler = <0>; }; rtc0: rtc@4000b000 { compatible = "nordic,nrf-rtc"; reg = <0x4000b000 0x1000>; cc-num = <3>; interrupts = <11 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; clock-frequency = <32768>; prescaler = <1>; }; temp: temp@4000c000 { compatible = "nordic,nrf-temp"; reg = <0x4000c000 0x1000>; interrupts = <12 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; rng: random@4000d000 { compatible = "nordic,nrf-rng"; reg = <0x4000d000 0x1000>; interrupts = <13 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; ecb: ecb@4000e000 { compatible = "nordic,nrf-ecb"; reg = <0x4000e000 0x1000>; interrupts = <14 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; ccm: ccm@4000f000 { compatible = "nordic,nrf-ccm"; reg = <0x4000f000 0x1000>; interrupts = <15 NRF_DEFAULT_IRQ_PRIORITY>; length-field-length-8-bits; status = "okay"; }; wdt: wdt0: watchdog@40010000 { compatible = "nordic,nrf-wdt"; reg = <0x40010000 0x1000>; interrupts = <16 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; rtc1: rtc@40011000 { compatible = "nordic,nrf-rtc"; reg = <0x40011000 0x1000>; cc-num = <4>; interrupts = <17 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; clock-frequency = <32768>; prescaler = <1>; }; qdec: qdec0: qdec@40012000 { compatible = "nordic,nrf-qdec"; reg = <0x40012000 0x1000>; interrupts = <18 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; comp: comparator@40013000 { compatible = "nordic,nrf-comp"; reg = <0x40013000 0x1000>; interrupts = <19 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #io-channel-cells = <1>; }; egu0: swi0: egu@40014000 { compatible = "nordic,nrf-egu", "nordic,nrf-swi"; reg = <0x40014000 0x1000>; interrupts = <20 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; egu1: swi1: egu@40015000 { compatible = "nordic,nrf-egu", "nordic,nrf-swi"; reg = <0x40015000 0x1000>; interrupts = <21 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; egu2: swi2: egu@40016000 { compatible = "nordic,nrf-egu", "nordic,nrf-swi"; reg = <0x40016000 0x1000>; interrupts = <22 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; egu3: swi3: egu@40017000 { compatible = "nordic,nrf-egu", "nordic,nrf-swi"; reg = <0x40017000 0x1000>; interrupts = <23 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; egu4: swi4: egu@40018000 { compatible = "nordic,nrf-egu", "nordic,nrf-swi"; reg = <0x40018000 0x1000>; interrupts = <24 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; egu5: swi5: egu@40019000 { compatible = "nordic,nrf-egu", "nordic,nrf-swi"; reg = <0x40019000 0x1000>; interrupts = <25 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; }; timer3: timer@4001a000 { compatible = "nordic,nrf-timer"; status = "okay"; reg = <0x4001a000 0x1000>; cc-num = <6>; interrupts = <26 NRF_DEFAULT_IRQ_PRIORITY>; prescaler = <0>; }; timer4: timer@4001b000 { compatible = "nordic,nrf-timer"; status = "okay"; reg = <0x4001b000 0x1000>; cc-num = <6>; interrupts = <27 NRF_DEFAULT_IRQ_PRIORITY>; prescaler = <0>; }; pwm0: pwm@4001c000 { compatible = "nordic,nrf-pwm"; reg = <0x4001c000 0x1000>; interrupts = <28 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; #pwm-cells = <3>; pinctrl-0 = <&pwm0_default>; pinctrl-1 = <&pwm0_sleep>; pinctrl-names = "default", "sleep"; }; pdm0: dmic_dev: pdm@4001d000 { compatible = "nordic,nrf-pdm"; reg = <0x4001d000 0x1000>; interrupts = <29 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; pinctrl-0 = <&pdm0_default_alt>; pinctrl-names = "default"; clock-source = "PCLK32M_HFXO"; }; acl: acl@4001e000 { compatible = "nordic,nrf-acl"; reg = <0x4001e000 0x1000>; status = "okay"; }; flash_controller: flash-controller@4001e000 { compatible = "nordic,nrf52-flash-controller"; reg = <0x4001e000 0x1000>; partial-erase; #address-cells = <1>; #size-cells = <1>; flash0: flash@0 { compatible = "soc-nv-flash"; erase-block-size = <4096>; write-block-size = <4>; reg = <0x00000000 DT_SIZE_K(1024)>; partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; boot_partition: partition@0 { label = "mcuboot"; reg = <0x0 0xc000>; }; slot0_partition: partition@c000 { label = "image-0"; reg = <0xc000 0x72000>; }; slot1_partition: partition@7e000 { label = "image-1"; reg = <0x7e000 0x72000>; }; scratch_partition: partition@f0000 { label = "image-scratch"; reg = <0xf0000 0xa000>; }; storage_partition: partition@fa000 { label = "storage"; reg = <0xfa000 0x6000>; }; }; }; }; ppi: ppi@4001f000 { compatible = "nordic,nrf-ppi"; reg = <0x4001f000 0x1000>; status = "okay"; }; mwu: mwu@40020000 { compatible = "nordic,nrf-mwu"; reg = <0x40020000 0x1000>; status = "okay"; }; pwm1: pwm@40021000 { compatible = "nordic,nrf-pwm"; reg = <0x40021000 0x1000>; interrupts = <33 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; #pwm-cells = <3>; pinctrl-0 = <&pwm1_default>; pinctrl-1 = <&pwm1_sleep>; pinctrl-names = "default", "sleep"; }; pwm2: pwm@40022000 { compatible = "nordic,nrf-pwm"; reg = <0x40022000 0x1000>; interrupts = <34 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; #pwm-cells = <3>; pinctrl-0 = <&pwm2_default>; pinctrl-1 = <&pwm2_sleep>; pinctrl-names = "default", "sleep"; }; spi2: my_spi_master_2: spi@40023000 { compatible = "nordic,nrf-spim"; #address-cells = <1>; #size-cells = <0>; reg = <0x40023000 0x1000>; interrupts = <35 NRF_DEFAULT_IRQ_PRIORITY>; max-frequency = <DT_FREQ_M(8)>; status = "okay"; pinctrl-0 = <&spi2_default>; pinctrl-1 = <&spi2_sleep>; cs-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>, <&gpio0 20 GPIO_ACTIVE_LOW>; acc_gyro_spi: acc_gyro@0 { reg = <0>; }; flash_spi: flash_ic@1 { reg = <1>; }; }; rtc2: rtc@40024000 { compatible = "nordic,nrf-rtc"; reg = <0x40024000 0x1000>; cc-num = <4>; interrupts = <36 NRF_DEFAULT_IRQ_PRIORITY>; status = "okay"; clock-frequency = <32768>; prescaler = <1>; }; i2s0: i2s@40025000 { compatible = "nordic,nrf-i2s"; #address-cells = <1>; #size-cells = <0>; reg = <0x40025000 0x1000>; interrupts = <37 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; usbd: usbd@40027000 { compatible = "nordic,nrf-usbd"; reg = <0x40027000 0x1000>; interrupts = <39 NRF_DEFAULT_IRQ_PRIORITY>; num-bidir-endpoints = <1>; num-in-endpoints = <7>; num-out-endpoints = <7>; num-isoin-endpoints = <1>; num-isoout-endpoints = <1>; status = "disabled"; }; uart1: uart@40028000 { compatible = "nordic,nrf-uarte"; reg = <0x40028000 0x1000>; interrupts = <40 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; qspi: qspi@40029000 { compatible = "nordic,nrf-qspi"; #address-cells = <1>; #size-cells = <0>; reg = <0x40029000 0x1000>, <0x12000000 0x8000000>; reg-names = "qspi", "qspi_mm"; interrupts = <41 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; }; pwm3: pwm@4002d000 { compatible = "nordic,nrf-pwm"; reg = <0x4002d000 0x1000>; interrupts = <45 NRF_DEFAULT_IRQ_PRIORITY>; status = "disabled"; #pwm-cells = <3>; }; spi3: spi@4002f000 { compatible = "nordic,nrf-spim"; #address-cells = <1>; #size-cells = <0>; reg = <0x4002f000 0x1000>; interrupts = <47 NRF_DEFAULT_IRQ_PRIORITY>; max-frequency = <DT_FREQ_M(32)>; rx-delay-supported; rx-delay = <2>; status = "disabled"; }; gpio0: gpio@50000000 { compatible = "nordic,nrf-gpio"; gpio-controller; reg = <0x50000000 0x200 0x50000500 0x300>; #gpio-cells = <2>; status = "okay"; port = <0>; }; gpio1: gpio@50000300 { compatible = "nordic,nrf-gpio"; gpio-controller; reg = <0x50000300 0x200 0x50000800 0x300>; #gpio-cells = <2>; ngpios = <16>; status = "okay"; port = <1>; }; cryptocell: crypto@5002a000 { compatible = "nordic,nrf-cc310"; reg = <0x5002A000 0x1000>; status = "okay"; #address-cells = <1>; #size-cells = <1>; cryptocell310: crypto@5002b000 { compatible = "arm,cryptocell-310"; reg = <0x5002B000 0x1000>; interrupts = <42 NRF_DEFAULT_IRQ_PRIORITY>; }; }; }; pinctrl: pin-controller { compatible = "nordic,nrf-pinctrl"; spi1_default: spi1_default { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 13)>, <NRF_PSEL(SPIM_MOSI, 0, 14)>, <NRF_PSEL(SPIM_MISO, 0, 16)>; }; }; spi1_sleep: spi1_sleep { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 13)>, <NRF_PSEL(SPIM_MOSI, 0, 14)>, <NRF_PSEL(SPIM_MISO, 0, 16)>; low-power-enable; }; }; spi2_default: spi2_default { group1 { psels = <NRF_PSEL(SPIS_SCK, 0, 6)>, <NRF_PSEL(SPIS_MOSI, 0, 8)>, <NRF_PSEL(SPIS_MISO, 0, 9)>; }; }; spi2_sleep: spi2_sleep { group1 { psels = <NRF_PSEL(SPIS_SCK, 0, 6)>, <NRF_PSEL(SPIS_MOSI, 0, 8)>, <NRF_PSEL(SPIS_MISO, 0, 9)>; low-power-enable; }; }; i2c0_default: i2c0_default { group1 { psels = <NRF_PSEL(TWIM_SDA, 0, 4)>, <NRF_PSEL(TWIM_SCL, 0, 26)>; }; }; i2c0_sleep: i2c0_sleep { group1 { psels = <NRF_PSEL(TWIM_SDA, 0, 4)>, <NRF_PSEL(TWIM_SCL, 0, 26)>; low-power-enable; }; }; pwm0_default: pwm0_default { group1 { psels = <NRF_PSEL(PWM_OUT0, 1, 0)>; nordic,invert; }; }; pwm0_sleep: pwm0_sleep { group1 { psels = <NRF_PSEL(PWM_OUT0, 1, 0)>; low-power-enable; }; }; pwm1_default: pwm1_default { group1 { psels = <NRF_PSEL(PWM_OUT1, 0, 24)>; nordic,invert; }; }; pwm1_sleep: pwm1_sleep { group1 { psels = <NRF_PSEL(PWM_OUT1, 0, 24)>; low-power-enable; }; }; pwm2_default: pwm2_default { group1 { psels = <NRF_PSEL(PWM_OUT2, 0, 25)>; nordic,invert; }; }; pwm2_sleep: pwm2_sleep { group1 { psels = <NRF_PSEL(PWM_OUT2, 0, 25)>; low-power-enable; }; }; pdm0_default_alt: pdm0_default_alt { group1 { psels = <NRF_PSEL(PDM_CLK, 0, 12)>, <NRF_PSEL(PDM_DIN, 0, 11)>; }; }; }; rng_hci: entropy_bt_hci { compatible = "zephyr,bt-hci-entropy"; status = "okay"; }; cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { device_type = "cpu"; compatible = "arm,cortex-m4f"; reg = <0>; #address-cells = <1>; #size-cells = <1>; itm: itm@e0000000 { compatible = "arm,armv7m-itm"; reg = <0xe0000000 0x1000>; swo-ref-frequency = <32000000>; }; }; }; sw_pwm: sw-pwm { compatible = "nordic,nrf-sw-pwm"; status = "disabled"; generator = <&timer2>; clock-prescaler = <0>; #pwm-cells = <3>; }; buttons { compatible = "gpio-keys"; button0: button_0 { gpios = <&gpio1 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "Wearable key 1"; }; button1: button_1 { gpios = <&gpio1 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "Wearable key 2"; }; }; acc_ints { compatible = "gpio-keys"; acc_int1: acc_int_1 { gpios = <&gpio1 11 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "ACC_GYRO INT1 pin"; }; acc_int2: acc_int_2 { gpios = <&gpio1 10 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "ACC_GYRO INT2 pin"; }; }; batt_chg_int { compatible = "gpio-keys"; batt_int: batt_int { gpios = <&gpio0 31 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "Battery charger interrupt"; }; }; outputs { compatible = "gpio-leds"; ledreset: ledreset { gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; label = "OLED reset pin ctl"; }; leddc: leddc { gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>; label = "LED Display data/command select"; }; poweren: poweren { gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>; label = "Logic power supply assert pin1"; }; flashichold: flashichold { gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; label = "Flash IC hold pin"; }; flashwp: flashwp { gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>; label = "Flash Write protect"; }; hapticen: hapticen { gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; label = "Haptic motor enable line"; }; }; };
in main.c I am trying to get pointers to device nodes..
#include <zephyr/zephyr.h> #include <zephyr/kernel.h> #include <drivers/gpio.h> #define DISPLAY_NODE DT_ALIAS(flashrst) #define MYSPI_NODE DT_NODELABEL(spi1) struct gpio_dt_spec display_reset = GPIO_DT_SPEC_GET(DISPLAY_NODE, gpios); void main(void) { const struct device *spiDev; /* SPI device pointer*/ /* Get the SPI device handle*/ spiDev = DEVICE_DT_GET(MYSPI_NODE); if(!device_is_ready(spiDev)) { return; } //else //{ /// printk("Device is ready %s\n"); //} //printk("Hello World! %s\n", CONFIG_BOARD); /* check devices are ready: Could make this a function?*/ }
but getting build errors.
When I look at the .dts file
it seems to have none of the nodes defined and gives me warnings for compatible property like so..
the file is below and has nothing after &flash0 node
I'm sure it should!!
/dts-v1/; #include <nordic/nrf52840_qiaa.dtsi> / { model = "SB_Wearable"; compatible = "cubik-innovation-,sb-wearable01"; chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; }; }; &flash0 { partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; boot_partition: partition@0 { label = "mcuboot"; reg = <0x0 0xc000>; }; slot0_partition: partition@c000 { label = "image-0"; reg = <0xc000 0x72000>; }; slot1_partition: partition@7e000 { label = "image-1"; reg = <0x7e000 0x72000>; }; scratch_partition: partition@f0000 { label = "image-scratch"; reg = <0xf0000 0xa000>; }; storage_partition: partition@fa000 { label = "storage"; reg = <0xfa000 0x6000>; }; }; };
What am I doing wrong please?
Many thanks
Duncan