動作環境
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の定義を足すとビルドできるのかもしれない(未調査)。