platformio / platform-atmelsam

Atmel SAM: development platform for PlatformIO
https://registry.platformio.org/platforms/platformio/atmelsam
Apache License 2.0
82 stars 108 forks source link

Add support for Adafruit Metro M7 (SD and Airlift) #231

Open alkavan opened 2 months ago

alkavan commented 2 months ago

I just got couple of Metro M7 both SD and Airlift models. Since the Metro M4 boards already added, perhaps adding the M7 boards shouldn't be much of an issue? I can provide any information that is required for the configuration file, would have done myself if I knew how.

alkavan commented 2 months ago

I tried adding the board to PlatformIO myself with some help from the AI. Platform IO was able to recognize the board, however I have no manage to make Zephyr to recognize it.

I think this should work for the most part, yet, I get this error when pio run:

No board named 'adafruit_metro_m7' found.

Please choose one of the following boards:

CMake Error at C:/Users/fish/.platformio/packages/framework-zephyr/cmake/modules/boards.cmake:167 (message):
  Invalid BOARD; see above.
Call Stack (most recent call first):
  C:/Users/fish/.platformio/packages/framework-zephyr/cmake/modules/zephyr_default.cmake:129 (include)
  C:/Users/fish/.platformio/packages/framework-zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:66 (include)
  C:/Users/fish/.platformio/packages/framework-zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:92 (include_boilerplate)
  C:/Users/fish/.platformio/packages/framework-zephyr/cmake/app/boilerplate.cmake:25 (find_package)
  CMakeLists.txt:2 (include)

platformio.ini

[env:adafruit_metro_m7]
platform = nxpimxrt
board = adafruit_metro_m7
framework = zephyr

board_build.mcu = imxrt1011
board_build.f_cpu = 500000000L

upload_protocol = jlink
debug_tool = jlink

; Zephyr-specific configurations
zephyr_board = adafruit_metro_m7
zephyr_extra_board_dirs = ${PROJECT_DIR}/zephyr/boards/arm

extra_scripts = pre:extra_script.py

adafruit_metro_m7.json

{
  "build": {
    "core": "nxp",
    "cpu": "cortex-m7",
    "f_cpu": "500000000L",
    "mcu": "MIMXRT1011DAE5A",
    "variant": "MIMXRT1011"
  },
  "debug": {
    "jlink_device": "MIMXRT1011DAE5A",
    "openocd_target": "imxrt1010.cfg"
  },
  "frameworks": [
    "zephyr"
  ],
  "name": "Adafruit Metro M7",
  "upload": {
    "maximum_ram_size": 131072,
    "maximum_size": 8388608,
    "protocol": "jlink"
  },
  "url": "https://www.adafruit.com/product/4950",
  "vendor": "Adafruit"
}

Kconfig.defconfig

if BOARD_ADAFRUIT_METRO_M7

config BOARD
    default "adafruit_metro_m7"

config SOC
    default "mimxrt1011dae5a"

config SYS_CLOCK_HW_CYCLES_PER_SEC
    default 500000000

endif # BOARD_ADAFRUIT_METRO_M7

Kconfig.board

config BOARD_ADAFRUIT_METRO_M7
    bool "Adafruit Metro M7"
    depends on SOC_SERIES_IMX_RT1010

if BOARD_ADAFRUIT_METRO_M7

config FLASH_SIZE
    default 8192

config FLASH_BASE_ADDRESS
    default 0x60000000

endif # BOARD_ADAFRUIT_METRO_M7

adafruit_metro_m7_defconfig

# Configuration for Adafruit Metro M7 board

if BOARD_ADAFRUIT_METRO_M7

config BOARD
    default "adafruit_metro_m7"

endif # BOARD_ADAFRUIT_METRO_M7

CONFIG_SOC_SERIES_IMX_RT1010=y
CONFIG_SOC_MIMXRT1011=y
CONFIG_BOARD_ADAFRUIT_METRO_M7=y

# Enable GPIO
CONFIG_GPIO=y

# Enable UART
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y

# Enable console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y

# Enable MPU
CONFIG_ARM_MPU=y

# Enable hardware stack protection
CONFIG_HW_STACK_PROTECTION=y

# Clock configuration
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=500000000

# Enable pinmux
CONFIG_PINMUX=y

# Enable LED
CONFIG_LED=y

# Enable I2C (if your board uses it)
CONFIG_I2C=y

# Enable SPI (if your board uses it)
CONFIG_SPI=y

# Enable USB device stack (if your board supports USB)
CONFIG_USB_DEVICE_STACK=y

# Enable flash
CONFIG_FLASH=y

# Enable PWM (if your board supports it)
CONFIG_PWM=y

# Enable ADC (if your board has ADC capabilities)
CONFIG_ADC=y

# Enable DMA (if needed)
CONFIG_DMA=y

# Enable power management features (optional)
CONFIG_PM=y

# Enable FPU for Cortex-M7
CONFIG_FPU=y
CONFIG_FP_HARDABI=y

adafruit_metro_m7.dts

/dts-v1/;
#include <nxp/nxp_rt1010.dtsi>

/ {
    model = "Adafruit Metro M7";
    compatible = "adafruit,metro-m7", "nxp,mimxrt1011";

    chosen {
        zephyr,sram = &ocram;
        zephyr,itcm = &itcm;
        zephyr,console = &lpuart1;
        zephyr,shell-uart = &lpuart1;
    };

    aliases {
        led0 = &led_red;
        led1 = &led_green;
        led2 = &led_blue;
    };

    leds {
        compatible = "gpio-leds";
        led_red: led_0 {
            gpios = <&gpio1 11 GPIO_ACTIVE_LOW>;
            label = "Red LED";
        };
        led_green: led_1 {
            gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
            label = "Green LED";
        };
        led_blue: led_2 {
            gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
            label = "Blue LED";
        };
    };
};

&flexspi {
    status = "okay";
    flash0: flash@60000000 {
        compatible = "soc-nv-flash";
        reg = <0x60000000 DT_SIZE_M(8)>;
    };
};

&lpuart1 {
    status = "okay";
    current-speed = <115200>;
};

&lpspi1 {
    status = "okay";
    #address-cells = <1>;
    #size-cells = <0>;
    /* Add your SPI devices here, for example:
    spi_device0: spi_device@0 {
        compatible = "manufacturer,device";
        reg = <0>;
        spi-max-frequency = <10000000>;
    };
    */
};

&lpi2c1 {
    status = "okay";
};

&usb1 {
    status = "okay";
};

&gpio1 {
    status = "okay";
};

&gpio5 {
    status = "okay";
};

&adc1 {
    status = "okay";
};

&edma0 {
    status = "okay";
};

&gpt1 {
    status = "okay";
};

&gpt2 {
    status = "okay";
};

&flexpwm1 {
    status = "okay";
};