Zephyr > west build時 > STM32F769:SPI2で成功, STM32L476:SPI2で失敗 > device treeファイルの定義に違いがある


動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1

状況

  • STM32F769ではSPI2を指定してビルドできる
  • STM32L476ではSPI2を指定してビルドできない
    • 以下のようなエラーが出る
zephyr/include/generated/generated_dts_board_fixups.h:199:27: error: 'DT_ST_STM32_SPI_FIFO_40003800_IRQ_0_PRIORITY' undeclared (first use in this function); did you mean 'DT_ST_STM32_SPI_FIFO_40013000_IRQ_0_PRIORITY'?
 #define DT_SPI_2_IRQ_PRI  DT_ST_STM32_SPI_FIFO_40003800_IRQ_0_PRIORITY

https://docs.zephyrproject.org/latest/boards/arm/nucleo_l476rg/doc/index.html
にはSPI1, SPI2, SPI3の定義はある。

なぜSPI2がビルドエラーになるか調べた。

./build/zephyr/include/generated/generated_dts_board_fixups.h

west buildした結果に違いがある。

STM32F769の場合、以下のような定義がある。

#define DT_SPI_2_BASE_ADDRESS       DT_ST_STM32_SPI_40003800_BASE_ADDRESS
#define DT_SPI_2_IRQ_PRI        DT_ST_STM32_SPI_40003800_IRQ_0_PRIORITY
#define DT_SPI_2_NAME           DT_ST_STM32_SPI_40003800_LABEL
...

STM32L476の場合は上記のような定義がない。
この差はdevice treeの定義によるものと考えられる。

device treeの差異

stm32f7.dtsi
        spi2: spi@40003800 {
            compatible = "st,stm32-spi";
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <0x40003800 0x400>;
            clocks = <&rcc STM32_CLOCK_BUS_APB1 0x00004000>;
            interrupts = <36 5>;
            status = "disabled";
            label = "SPI_2";
        };

上記の定義がstm32l4.dtsiにはない。

STM32L476の場合、SPI2のMemory Mappingの定義がなく、上記のエラーが出ているようだ。
同じことがSPI3でも発生する。

<BOARD>.overlayにspi2の定義を足すとビルドできるのかもしれない(未調査)。