hello Nordic
i am working with nrf52832, ncs 1.7.1
we have to turn on the power before trying to read jedec and to avooide changing ncs spi_nor or using SYS_INIT we decided to take the spi_nor driver and copy it and create our own flash driver based on the spi_nor driver.. however after inserting the pin change to the init function we again fall on assertions of spinlock and i do need some help with understanding this issue please
there is my .dts
// Copyright (c) 2022 Nordic Semiconductor ASA // SPDX-License-Identifier: Apache-2.0 /dts-v1/; #include <nordic/nrf52832_qfaa.dtsi> / { model = "halo_ep2"; compatible = "halo-ep2"; chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; // nordic,pm-ext-flash = &augu_flash_is25lp128; }; sensors_on: sensors_on_node { compatible = "augury,gpio-power"; power_gpios = <&gpio0 22 GPIO_ACTIVE_LOW>; label = "SENSORS_ON"; status = "okay"; #power_resource-cells = <0>; }; flash_on: flash_on_node { compatible = "augury,gpio-power"; power_gpios = <&gpio0 23 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; label = "FLASH_ON"; status = "okay"; #power_resource-cells = <0>; }; leds { compatible = "gpio-leds"; led0_red: led_0 { gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; label = "RED_LED_0"; }; led1_orange: led_1 { gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; label = "ORANGE_LED_1"; }; led2_green: led_2 { gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>; label = "GREEN_LED_2"; }; }; aliases { led0-red = &led0_red; led1-orange = &led1_orange; led2-green = &led2_green; }; }; &adc { status ="okay"; }; &gpiote { status ="okay"; }; &gpio0 { status ="okay"; }; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; sck-pin = <20>; mosi-pin = <14>; // p0.14 miso-pin = <16>; // p0.16 cs-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; iis3dwb@0 { compatible = "st,iis3dwb"; reg = <0>; int1_gpios = <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; int2_gpios = <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; label = "IIS3DWB"; power_resources = <&sensors_on>; spi-max-frequency = <8000000>; }; }; &spi2 { status = "okay"; sck-pin = <5>; // gpio 0 pin 5 mosi-pin = <4>; // gpio 0 pin 4 miso-pin = <2>; // gpio 0 pin 2 compatible = "nordic,nrf-spi"; cs-gpios = <&gpio0 3 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; augu_flash_is25lp128: augu_flash_is25lp128@0 { compatible = "issi,augu_flash_is25lp128"; reg = <0>; label = "AUGU_FLASH_IS25LP128"; power_resources = <&flash_on>; jedec_id = [9d 60 18]; spi-max-frequency = <8000000>; //<133000000>; page_size = <2048>; block_size = <131072>; size = <0x8000000>; }; }; &flash0 { partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; mbr_partition: partition@0 { label = "mbr"; reg = <0x00000000 0x00001000>; }; boot_partition: partition@1000 { label = "mcuboot"; reg = <0x1000 0xc000>; }; slot0_partition: partition@d000 { label = "image-0"; reg = <0xd000 0x6c800>; }; slot1_partition: partition@79800 { label = "image-1"; reg = <0x79800 0x800>; }; storage_partition: partition@7a000 { label = "storage"; reg = <0x7a000 0x6000>; }; }; };
there is myboard.conf
# SPI Flash CONFIG_SPI=y # Enable flash operations. CONFIG_FLASH_MAP=y CONFIG_FLASH_TESTS=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_AUGU_FLASH_IS25LP128=y CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_BT_RX_STACK_SIZE=1024 # CONFIG_MAIN_STACK_SIZE=1024 CONFIG_MPSL_SIGNAL_STACK_SIZE=640 CONFIG_IDLE_STACK_SIZE=128 CONFIG_ISR_STACK_SIZE=1024 # keep CONFIG_HEAP_MEM_POOL_SIZE=16384 because this is needed by usb /nrfx modules # CONFIG_HEAP_MEM_POOL_SIZE=16384 # CONFIG_HEAP_MEM_POOL_SIZE=10240 # CONFIG_HEAP_MEM_POOL_SIZE=8192 # CONFIG_HEAP_MEM_POOL_SIZE=4096 # CONFIG_HEAP_MEM_POOL_SIZE=3600 # CONFIG_HEAP_MEM_POOL_SIZE=2048 CONFIG_HEAP_MEM_POOL_SIZE=1024 CONFIG_NRFX_SPIM=y CONFIG_NRFX_SPIM1=y # CONFIG_SPI_0_NRF_SPIM CONFIG_SOC_NRF52832_ALLOW_SPIM_DESPITE_PAN_58=y # CONFIG_SERIAL=n # Configurations set based on thread analyzer output. # CONFIG_SDC_RX_STACK_SIZE=324 CONFIG_BT_HCI_TX_STACK_SIZE_WITH_PROMPT=y CONFIG_BT_HCI_TX_STACK_SIZE=640 # Disable features not needed # CONFIG_TIMESLICING=n # CONFIG_MINIMAL_LIBC_MALLOC=n # Disable Bluetooth features not needed # CONFIG_BT_DEBUG_NONE=y # CONFIG_BT_ASSERT=n # CONFIG_BT_DATA_LEN_UPDATE=n CONFIG_BT_PHY_UPDATE=n # CONFIG_BT_GATT_CACHING=n # CONFIG_BT_GATT_SERVICE_CHANGED=n # CONFIG_BT_GAP_PERIPHERAL_PREF_PARAMS=n # CONFIG_BT_SETTINGS_CCC_LAZY_LOADING=y # CONFIG_BT_HCI_VS_EXT=n # Disable Bluetooth controller features not needed CONFIG_BT_CTLR_PRIVACY=n CONFIG_BT_CTLR_PHY_2M=n # Reduce Bluetooth buffers CONFIG_BT_BUF_EVT_DISCARDABLE_COUNT=1 CONFIG_BT_BUF_EVT_DISCARDABLE_SIZE=43 CONFIG_BT_BUF_EVT_RX_COUNT=2 CONFIG_BT_CONN_TX_MAX=2 CONFIG_BT_L2CAP_TX_BUF_COUNT=2 CONFIG_BT_CTLR_RX_BUFFERS=1 CONFIG_BT_BUF_ACL_TX_COUNT=3 CONFIG_BT_BUF_ACL_TX_SIZE=27
there is my prj.conf
CONFIG_NUM_COOP_PRIORITIES=5 CONFIG_NUM_PREEMPT_PRIORITIES=10 CONFIG_NEWLIB_LIBC=y CONFIG_CMSIS_DSP=y CONFIG_CMSIS_DSP_FASTMATH=y CONFIG_CMSIS_DSP_TRANSFORM=y CONFIG_CMSIS_DSP_FILTERING=y CONFIG_CMSIS_DSP_SUPPORT=y CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y CONFIG_CBPRINTF_FP_SUPPORT=y #Allow use of legacy devicetree macros # CONFIG_LEGACY_DEVICETREE_MACROS=y CONFIG_NO_OPTIMIZATIONS=n #Compiler optimizations will be set to -O0 independently of other options. CONFIG_SIZE_OPTIMIZATIONS=y #Compiler optimizations will be set to -Os independently of other options. CONFIG_SPEED_OPTIMIZATIONS=n #Compiler optimizations will be set to -O2 independently of other options. CONFIG_DEBUG_OPTIMIZATIONS=n #Compiler optimizations will be set to -Og independently of other options. CONFIG_TINYCBOR=y CONFIG_CBOR_FLOATING_POINT=y # BLE Related Configs CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DEVICE_NAME_DYNAMIC=y CONFIG_BT_TPS=y CONFIG_BT_DIS=y CONFIG_BT_DIS_PNP=n CONFIG_BT_DIS_SERIAL_NUMBER=y CONFIG_BT_DIS_FW_REV=y CONFIG_BT_DIS_HW_REV=y CONFIG_BT_DIS_SW_REV=n CONFIG_BT_CTLR_TX_PWR_PLUS_8=y # Below is setup to let DIS information be read from settings CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS=y CONFIG_SETTINGS_NONE=y CONFIG_BT_SETTINGS=y CONFIG_BT_DIS_SETTINGS=y CONFIG_BT_DIS_STR_MAX=50 CONFIG_BT_GATT_CACHING=n CONFIG_BT_HCI_VS_EXT=n CONFIG_BT_LL_SW_SPLIT=y # I2C Related Configs CONFIG_I2C=y CONFIG_I2C_0=n CONFIG_I2C_GPIO=y # ADC Related Configs CONFIG_ADC=y CONFIG_ADC_ASYNC=y # Enable mcumgr. CONFIG_MCUMGR=y CONFIG_ASSERT=y CONFIG_WATCHDOG=y # Ensure an MCUboot-compatible binary is generated. CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="root-rsa-2048.pem" #mcuboot key CONFIG_MCUBOOT_IMAGE_VERSION="1.1.3" CONFIG_MCUBOOT_IMG_MANAGER=y # Allow for large Bluetooth data packets. CONFIG_BT_L2CAP_TX_MTU=252 CONFIG_BT_BUF_ACL_RX_SIZE=256 CONFIG_BT_BUF_ACL_TX_SIZE=251 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 CONFIG_BT_USER_DATA_LEN_UPDATE=y # Enable the Bluetooth (unauthenticated) and shell mcumgr transports. CONFIG_MCUMGR_SMP_BT=y CONFIG_MCUMGR_SMP_BT_AUTHEN=n # Enable flash operations. CONFIG_FLASH=y CONFIG_FLASH_JESD216_API=n CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=n # Enable the LittleFS file system. CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=y # Required by the `taskstat` command. CONFIG_THREAD_MONITOR=y # Enable statistics and statistic names. CONFIG_STATS=y CONFIG_STATS_NAMES=y # Enable all core commands. CONFIG_MCUMGR_CMD_FS_MGMT=y CONFIG_MCUMGR_CMD_IMG_MGMT=y CONFIG_MCUMGR_CMD_OS_MGMT=y CONFIG_MCUMGR_CMD_STAT_MGMT=y # sensors CONFIG_NRFX_GPIOTE=y CONFIG_NRFX_PPI=y CONFIG_NRFX_TIMER0=y CONFIG_NRFX_TIMER1=y CONFIG_NRFX_TIMER2=y CONFIG_NRFX_TIMER3=y CONFIG_NRFX_TIMER4=y CONFIG_SPI=y CONFIG_SPI_ASYNC=y CONFIG_GPIO=y # LOG CONFIG_LOG=y CONFIG_LOG_PRINTK=y CONFIG_LOG_BUFFER_SIZE=2048 CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP=n # enable console over SEGGER RTT CONFIG_CONSOLE=y CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=8192 CONFIG_SENSOR=y CONFIG_TEMP_NRF5=y CONFIG_IIS3DWB=y CONFIG_IIS3DWB_CALC_REAL_ODR=y CONFIG_IIS3DWB_TRIGGER_OWN_THREAD=y CONFIG_IIS3DWB_FIFO_TH=36 CONFIG_IIS3DWB_TEMPERATURE_SUPPORT=y CONFIG_IIS3DWB_FIFO_DATA_READY_INT_PIN_1=y CONFIG_AUGU_GPIO_POWER=y CONFIG_FPU=y CONFIG_PM_DEVICE=y
and there is my addition to the spi_nor_configure function in the copied driver (the rest is unchanged, also copied jesd216.h and flash_priv.h to my flash driver's folder)
static int spi_nor_configure(const struct device *dev) { const struct spi_nor_config *cfg = dev->config; uint8_t jedec_id[SPI_NOR_MAX_ID_LEN]; int rc; /* Validate bus and CS is ready */ if (!spi_is_ready(&cfg->spi)) { return -ENODEV; } /* Might be in DPD if system restarted without power cycle. */ exit_dpd(dev); const struct device* power_dev = device_get_binding("FLASH_ON"); int ret = augu_power_request(power_dev); if( 0 > ret ) { LOG_ERR("failed in augu_power_request for flash"); return ret; } /* now the spi bus is configured, we can verify SPI * connectivity by reading the JEDEC ID. */ rc = spi_nor_read_jedec_id(dev, jedec_id); if (rc != 0) { LOG_ERR("JEDEC ID read failed: %d", rc); return -ENODEV; } LOG_INF("passed id test"); #ifndef CONFIG_SPI_NOR_SFDP_RUNTIME /* For minimal and devicetree we need to check the JEDEC ID * against the one from devicetree, to ensure we didn't find a * device that has different parameters. */ if (memcmp(jedec_id, cfg->jedec_id, sizeof(jedec_id)) != 0) { LOG_ERR("Device id %02x %02x %02x does not match config %02x %02x %02x", jedec_id[0], jedec_id[1], jedec_id[2], cfg->jedec_id[0], cfg->jedec_id[1], cfg->jedec_id[2]); return -EINVAL; } #endif augu_power_release(power_dev); return 0;
there is the augu_power_request function code
int augu_power_request(const struct device *dev) { struct power_resource_data *data = (struct power_resource_data *)dev->data; struct onoff_client power_client; sys_notify_init_spinwait(&power_client.notify); int err = onoff_request(&data->onoff_mgr, &power_client); if (err < 0) { LOG_ERR("failed in power resource request: err = %d\n", err); return err; } int res = 0; do { err = sys_notify_fetch_result(&power_client.notify, &res); if (!err && res) { LOG_ERR("failed in power resource request: res = %d\n", res); return res; } } while (err); return 0; }
and there is the log
ASSERTION FAIL [z_spin_lock_valid(l)] @ WEST_TOPDIR/zephyr/include/spinlock.h:129 Recursive spinlock 0x5a7 [00000026] <err> os: r0/a1: 0x00000004 r1/a2: 0x00000081 r2/a3: 0x00000000 [00000026] <err> os: r3/a4: 0x00000002 r12/ip: 0x80000000 r14/lr: 0x00013429 [00000026] <err> os: xpsr: 0x61000000 [00000027] <err> os: s[ 0]: 0x00000000 s[ 1]: 0x00000000 s[ 2]: 0x00000000 s[ 3]: 0x00000000 [00000027] <err> os: s[ 4]: 0x00000000 s[ 5]: 0x00000000 s[ 6]: 0x00000000 s[ 7]: 0x00000000 [00000028] <err> os: s[ 8]: 0x00000000 s[ 9]: 0x00000000 s[10]: 0x00000000 s[11]: 0x00000000 [00000028] <err> os: s[12]: 0x00000000 s[13]: 0x00000000 s[14]: 0x00000000 s[15]: 0x00000000 [00000028] <err> os: fpscr: 0x00000000 [00000029] <err> os: Faulting instruction address (r15/pc): 0x00038c48 [00000029] <err> os: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0 [00000029] <err> os: Current thread: 0x200030b0 (unknown) [00021409] <err> fatal_error: Resetting system ASSERTION FAIL [z_spin_lock_valid(l)] @ WEST_TOPDIR/zephyr/include/spinlock.h:129 Recursive spinlock 0x5a7 [00000026] <err> os: r0/a1: 0x00000004 r1/a2: 0x00000081 r2/a3: 0x00000000 [00000026] <err> os: r3/a4: 0x00000002 r12/ip: 0x80000000 r14/lr: 0x00013429 [00000026] <err> os: xpsr: 0x61000000 [00000026] <err> os: s[ 0]: 0x00000000 s[ 1]: 0x00000000 s[ 2]: 0x00000000 s[ 3]: 0x00000000 [00000027] <err> os: s[ 4]: 0x00000000 s[ 5]: 0x00000000 s[ 6]: 0x00000000 s[ 7]: 0x00000000 [00000027] <err> os: s[ 8]: 0x00000000 s[ 9]: 0x00000000 s[10]: 0x00000000 s[11]: 0x00000000 [00000028] <err> os: s[12]: 0x00000000 s[13]: 0x00000000 s[14]: 0x00000000 s[15]: 0x00000000 [00000028] <err> os: fpscr: 0x00000000 [00000028] <err> os: Faulting instruction address (r15/pc): 0x00038c48 [00000028] <err> os: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0 [00000029] <err> os: Current thread: 0x200030b0 (unknown) [00012501] <err> fatal_error: Resetting system ASSERTION FAIL [z_spin_lock_valid(l)] @ WEST_TOPDIR/zephyr/include/spinlock.h:129 Recursive spinlock 0x5a7
hope to read from you soon
best regards
Ziv