MCUBoot: adding custom serial flash driver as secondary partition

We use spi flash with custom driver and goal is to set it to act as secondary partition for MCUBoot.

The question is how to adapt driver to be accepted by MCUBoot, maybe there is an example on how driver should look like?

As far as I understand Nordic supports mx25r64, what files have to be produced and where to place them to enable custom driver to be accepted by MCUBoot?

Parents Reply Children
  • mesh777 said:
    Maybe you can also provide a hint on how to debug the bootloader?

    Ah, yes. Of course. If you debug through VS Code GDB it should be quite straightforward. See the following video: https://youtu.be/MGsZJpdLtco?list=PLx_tBuQ_KSqEt7NK-H7Lu78lT2OijwIMl&t=30 

    Then set a break point in <ncs location>/bootloader/mcuboot/boot/zephyr/main.c-->main() and you can start to debug.

    Let me know if you don't get it to work.

  • I use VS Code and GDB.

    Can you share working launch.json, as I am not able to manage to reach that breakpoint.

    EDIT: I enabled debugging by unchecking Debug Options in build configuration.

    Now I have problem with device_get_binding, it returns Null for my driver. Although MCUBoot uses the same dts file when building. What else could be possibly wrong?

  • mesh777 said:
    Now I have problem with device_get_binding, it returns Null for my driver. Although MCUBoot uses the same dts file when building. What else could be possibly wrong?

    There may be different reasons for the failure of device_get_binding(). I can see in the overlay you provider earlier that label="AT25XE081", so maybe you could start by putting a break point in mcuboot when device_get_binding() is called and check that it evaluates to device_get_binding("AT25XE081").

    Maybe also check the file build/mcuboot/zephyr/zephyr.dts (notice that this is a different path than build/zephyr/zephyr.dts), and check if you find the at25x node, and that it is enabled. If not, you probably need to enable it following the approaches explained in https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.9.1/nrf/ug_multi_image.html#image-specific-variables.

    If the init function of you driver fails (the function that is passed into DEVICE_DT_INST_DEFINE, like done here), the call to device_get_binding will also fail.

    In this reply I give some detailed explanations about why init function need to be successful for device_get_binding() to succeed, if you're interested. It may be a bit outdated due to an older NCS version.

    Best regards,

    Simon

  • I checked build/mcuboot/zephyr/zephyr.dts, at25x appears in spi2 node. Also device_get_binding is called with correct label.

    However init function is not called. In driver file the following macro is added at the end of file:

    DEVICE_DT_INST_DEFINE(0, &spi_flash_init, NULL,
             &spi_flash_data_0, &spi_flash_config_0,
             POST_KERNEL, 80,
             &spi_flash_api);
    And spi_flash_init is not called. What I am still missing?
  • mesh777 said:
    However init function is not called. In driver file the following macro is added at the end of file:

    If your custom init function is not called, maybe it is because the custom driver file is not seen by the build system and added to the executable? Have you modified the CMakeLists.txt to include the source file? Like done for spi_nor.c for example here: https://github.com/nrfconnect/sdk-zephyr/blob/v2.7.0-ncs1/drivers/flash/CMakeLists.txt#L6 (try adding your driver in-tree first, just to make sure it works). You can check that the source file is included by looking in /<sample>/build/mcuboot/zephyr/drivers/flash/CMakeFiles/drivers__flash.dir I think (or just open build folder in vscode, click ctrl+P and search for the source (.c) file).

    Again, I do think the spi_nor.c driver might support the at25x, at least it's worth checking out.

    mesh777 said:
    And spi_flash_init is not called. What I am still missing?

    Where did you find this function? I search through the whole NCS v1.8.0 (based on earlier logs, it seems like you're using this version).

Related