diff --git a/boards.txt b/boards.txt index 2ee6ea55..da1c82c2 100644 --- a/boards.txt +++ b/boards.txt @@ -295,6 +295,69 @@ portentah7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd ############################################################################################################## +nicla_vision.name=Arduino Nicla Vision +nicla_vision.build.core=arduino +nicla_vision.build.crossprefix=arm-zephyr-eabi- +nicla_vision.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/ + +nicla_vision.menu.debug.false=Standard +nicla_vision.menu.debug.true=Debug +nicla_vision.menu.debug.true.build.zsk_args.debug=-debug + +nicla_vision.build.zephyr_target=arduino_nicla_vision//m7 +nicla_vision.build.zephyr_args= +nicla_vision.build.zephyr_hals=hal_stm32 hal_infineon +nicla_vision.build.artifact=zephyr_main +nicla_vision.build.variant=arduino_nicla_vision_stm32h747xx_m7 +nicla_vision.build.mcu=cortex-m7 +nicla_vision.build.fpu=-mfpu=fpv5-d16 +nicla_vision.build.architecture=cortex-m7 + +nicla_vision.build.float-abi=-mfloat-abi=softfp +nicla_vision.build.extra_flags= +nicla_vision.build.postbuild.cmd="{tools.imgtool.path}/{tools.imgtool.cmd}" exit +nicla_vision.build.architecture=cortex-m7 +nicla_vision.build.board=NICLA_VISION_H7_M7 +nicla_vision.vid.0=0x2341 +nicla_vision.pid.0=0x005b +nicla_vision.upload_port.0.vid=0x2341 +nicla_vision.upload_port.0.pid=0x025f + +nicla_vision.upload.tool=dfu-util +nicla_vision.upload.tool.default=dfu-util +nicla_vision.upload.protocol= +nicla_vision.upload.transport= +nicla_vision.upload.vid=0x2341 +nicla_vision.upload.pid=0x035f +nicla_vision.upload.interface=0 +nicla_vision.upload.use_1200bps_touch=true +nicla_vision.upload.wait_for_upload_port=true +nicla_vision.upload.native_usb=true +nicla_vision.upload.maximum_size=1966080 +nicla_vision.upload.maximum_data_size=523624 + +nicla_vision.upload.address=0x080E0000 + +nicla_vision.upload.maximum_size=786432 +nicla_vision.upload.maximum_data_size=523624 + +nicla_vision.bootloader.tool=dfu-util +nicla_vision.bootloader.tool.default=dfu-util +nicla_vision.bootloader.vid=0x2341 +nicla_vision.bootloader.pid=0x035f +nicla_vision.bootloader.interface=0 +nicla_vision.bootloader.file=zephyr-{build.variant}.bin +nicla_vision.bootloader.address=0x08040000 + +nicla_vision.debug.tool=gdb +nicla_vision.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg +nicla_vision.debug.server.openocd.scripts.1={programmer.transport_script} +nicla_vision.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg +nicla_vision.debug.cortex-debug.custom.request=attach +nicla_vision.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd + +############################################################################################################## + frdm_rw612.name=NXP FRDM RW612 frdm_rw612.build.core=arduino frdm_rw612.build.crossprefix=arm-zephyr-eabi- diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf b/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf new file mode 100644 index 00000000..356e5cc9 --- /dev/null +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf @@ -0,0 +1,94 @@ +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_DEVICE_PRODUCT="Arduino Nicla Vision" +CONFIG_USB_DEVICE_MANUFACTURER="Arduino" +CONFIG_USB_DEVICE_VID=0x2341 +CONFIG_USB_DEVICE_PID=0x005b + +CONFIG_USB_CDC_ACM=y +CONFIG_USB_CDC_ACM_RINGBUF_SIZE=512 +CONFIG_UART_LINE_CTRL=y +CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT=y + +CONFIG_LLEXT_STORAGE_WRITABLE=n + +#CONFIG_SHARED_MULTI_HEAP=y +CONFIG_HEAP_MEM_POOL_SIZE=65536 + +CONFIG_FPU=y +CONFIG_ICACHE=y +CONFIG_DCACHE=y +CONFIG_CACHE_MANAGEMENT=y + +CONFIG_USERSPACE=n +CONFIG_ARM_MPU=y +CONFIG_MAX_THREAD_BYTES=4 + +CONFIG_SHELL_STACK_SIZE=32768 +CONFIG_MAIN_STACK_SIZE=32768 +CONFIG_LLEXT_HEAP_SIZE=128 + +CONFIG_ADC=y +CONFIG_PWM=y +CONFIG_DMA=y +CONFIG_MEMC=y +CONFIG_SPI_ASYNC=y +CONFIG_SPI_STM32_INTERRUPT=y +CONFIG_I2C_TARGET=y +#CONFIG_I2S=y + + +#CONFIG_SDHC=y +#CONFIG_SDHC_INIT_PRIORITY=75 +#CONFIG_SDIO_STACK=y +#CONFIG_CYW4343W=y +#CONFIG_WIFI=y +#CONFIG_NET_L2_WIFI_SHELL=y + +#CONFIG_AIROC_WIFI_CUSTOM=y +CONFIG_STM32_MEMMAP=y + +CONFIG_NET_CORE_LOG_LEVEL_DBG=y + +#CONFIG_NETWORKING=y +#CONFIG_NET_IPV6=n +#CONFIG_NET_IPV4=y +#CONFIG_NET_ARP=y +#CONFIG_NET_UDP=y +#CONFIG_NET_DHCPV4=y +#CONFIG_NET_DHCPV4_OPTION_CALLBACKS=y +#CONFIG_DNS_RESOLVER=y +#CONFIG_DNS_SERVER_IP_ADDRESSES=y +#CONFIG_DNS_SERVER1="8.8.8.8" + +CONFIG_INIT_STACKS=y + +#CONFIG_NET_SOCKETS=y +#CONFIG_NET_SOCKETS_NET_MGMT=y +#CONFIG_NET_SOCKETS_SOCKOPT_TLS=y +#CONFIG_NET_MGMT=y +#CONFIG_NET_MGMT_EVENT=y +#CONFIG_NET_L2_ETHERNET=y +#CONFIG_NET_L2_ETHERNET_MGMT=y +#CONFIG_NET_TX_STACK_SIZE=8192 +#CONFIG_NET_RX_STACK_SIZE=8192 +#CONFIG_NET_TCP_WORKQ_STACK_SIZE=8192 +#CONFIG_NET_MGMT_EVENT_STACK_SIZE=8192 +#CONFIG_NET_TCP=y +#CONFIG_NET_SOCKETS=y +#CONFIG_POSIX_API=y + + +CONFIG_ENTROPY_GENERATOR=y +CONFIG_TEST_RANDOM_GENERATOR=y + +#CONFIG_VIDEO=y +#CONFIG_VIDEO_LOG_LEVEL_DBG=y +#CONFIG_VIDEO_STM32_DCMI=y +#CONFIG_VIDEO_BUFFER_POOL_NUM_MAX=3 +#CONFIG_VIDEO_BUFFER_POOL_SZ_MAX=614400 +#CONFIG_VIDEO_BUFFER_POOL_ALIGN=32 +#CONFIG_VIDEO_BUFFER_USE_SHARED_MULTI_HEAP=y +#CONFIG_VIDEO_BUFFER_SMH_ATTRIBUTE=2 +#CONFIG_FLASH=y + +CONFIG_STM32H7_BOOT_M4_AT_INIT=n diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.overlay b/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.overlay new file mode 100644 index 00000000..1f4900d3 --- /dev/null +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.overlay @@ -0,0 +1,267 @@ +&zephyr_udc0 { + board_cdc_acm_uart: board_cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + status = "okay"; + }; +}; + +&usart1 { + status = "okay"; + pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; + pinctrl-names = "default"; + current-speed = <115200>; +}; + +&i2c1 { + status = "okay"; + pinctrl-0 = <&i2c1_scl_pb8 &i2c1_sda_pb9>; + pinctrl-names = "default"; + clock-frequency = ; +}; + +&i2c2 { + status = "okay"; + pinctrl-0 = <&i2c2_scl_pf1 &i2c2_sda_pf0>; + pinctrl-names = "default"; + clock-frequency = ; +}; + +&i2c3 { + status = "okay"; + pinctrl-0 = <&i2c3_scl_pa8 &i2c3_sda_pc9>; + pinctrl-names = "default"; + clock-frequency = ; +}; + +&spi4 { + status = "okay"; + pinctrl-0 = <&spi4_sck_pe12 &spi4_miso_pe13 &spi4_mosi_pe14 &spi4_nss_pe11>; + pinctrl-names = "default"; +}; + +&spi5 { + status = "okay"; + pinctrl-0 = <&spi5_sck_pf7 &spi5_miso_pf8 &spi5_mosi_pf11 &spi5_nss_pf6>; + pinctrl-names = "default"; +}; + +/* +&i2s3 { + status = "okay"; + clocks = <&rcc 0xe8 0x8000>, + <&rcc 0x9 0x1cc0050>; + dma-names = "tx", "rx"; + interrupts = <0x33 0x0>; + + pinctrl-0 = <&i2s3_pins>; + + pinctrl-names = "default"; + + i2s3_pins: i2s3-pins { + pinmux = <0x07>, // Replace with the actual pinmux number for PA15 at some point (I2S3_WS) + <0x08>, // Replace with the actual pinmux number for PB2 at some point(I2S3_SD0) + <0x09>, // Replace with the actual pinmux number for PC10 at some point(I2S3_CK) + <0x0A>; // Replace with the actual pinmux number for PC11 at some point(I2S3_SD1) + }; +}; +*/ + +&timers1 { + status = "okay"; + st,prescaler = <0>; + + pwm1: pwm { + status = "okay"; + pinctrl-0 = <&tim1_ch3_pj9 &tim1_ch1_pk1>; + pinctrl-names = "default"; + }; +}; + +&timers3 { + status = "okay"; + st,prescaler = <100>; + + pwm3: pwm { + status = "okay"; + pinctrl-0 = <&tim3_ch1_pc6 &tim3_ch2_pc7>; + pinctrl-names = "default"; + }; +}; + +&timers8 { + status = "okay"; + st,prescaler = <100>; + + pwm8: pwm { + status = "okay"; + pinctrl-0 = <&tim8_ch3n_ph15 &tim8_ch2_pj10 &tim8_ch2n_pj7>; + pinctrl-names = "default"; + }; +}; + +&timers12 { + status = "okay"; + st,prescaler = <100>; + + pwm12: pwm { + status = "okay"; + pinctrl-0 = <&tim12_ch1_ph6>; + pinctrl-names = "default"; + }; +}; + +&adc1 { + pinctrl-0 = <&adc1_inp4_pc4 &adc1_inp5_pb1 &adc1_inp12_pc2 &adc1_inp13_pc3>; + pinctrl-names = "default"; + st,adc-clock-source = "SYNC"; + st,adc-prescaler = <4>; + status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + + channel@4 { + reg = <4>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <16>; + }; + + channel@12 { + reg = <12>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <16>; + }; +}; + +&adc3 { + pinctrl-0 = <&adc3_inp0_pc2_c &adc3_inp1_pc3_c>; + pinctrl-names = "default"; + st,adc-clock-source = "SYNC"; + st,adc-prescaler = <4>; + status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <16>; + }; + channel@1 { + reg = <1>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <16>; + }; +}; + +/ { + chosen { + zephyr,console = &board_cdc_acm_uart; + /*zephyr,console = &usart1;*/ + zephyr,shell-uart = &usart1; + /*zephyr,cdc-acm-uart0 = &usart1;*/ + }; + + + gpioz: gpio@deadbeef { + compatible = "vnd,gpio"; + gpio-controller; + reg = <0xdeadbeef 0x1000>; + #gpio-cells = <0x2>; + status = "okay"; + }; +}; + +/ { + soc { + flash-controller@52002000 { + flash0: flash@8000000 { + /delete-node/ partitions; + compatible = "st,stm32-nv-flash", "soc-nv-flash"; + write-block-size = <32>; + erase-block-size = ; + /* maximum erase time for a 128K sector */ + max-erase-time = <4000>; + + reg = <0x08000000 DT_SIZE_K(1024)>; + status = "okay"; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00040000>; + read-only; + }; + + slot0_partition: partition@40000 { + label = "image-0"; + reg = <0x00040000 0x000A0000>; + }; + + user_sketch: partition@e0000 { + reg = <0x0E0000 0x20000>; + }; + }; + }; + }; + + ram@20000000 { + reg = <0x20000000 0x20000>; /* SRAM1, 128KB */ + compatible = "st,stm32h747-sram"; + status = "okay"; + }; + }; + + + zephyr,user { + digital-pin-gpios = <&gpiof 4 0>, /* Blue LED PF_4 */ + <&gpioc 13 0>, /* Green LED PC_13 */ + <&gpioe 3 0>; /* Red LED PE_3 */ + + adc-pin-gpios = <&gpioc 4 0>, /* A0 PC_4 */ + <&gpiof 13 0>, /* A1 PF_13 */ + <&gpiof 3 0>; /* A2 PF_3 */ + + pwm-pin-gpios = <&gpioa 8 0>, + <&gpioc 6 0>, + <&gpioc 7 0>, + <&gpioh 15 0>, + <&gpioj 7 0>, + <&gpioj 10 0>, + <&gpioh 6 0>; + + serials = <&board_cdc_acm_uart>, <&usart1>; + cdc-acm = <&board_cdc_acm_uart>; + + i2cs = <&i2c3>, <&i2c1>; + + io-channels = <&adc1 0>, + <&adc3 0>, + <&adc1 6>; + + builtin-led-gpios = <&gpiof 4 0>, + <&gpioc 13 0>, + <&gpioe 3 0>; + + pwms = <&pwm1 3 PWM_HZ(12000000) PWM_POLARITY_NORMAL>, + <&pwm3 3 PWM_HZ(12000000) PWM_POLARITY_NORMAL>, + <&pwm8 3 PWM_HZ(12000000) PWM_POLARITY_NORMAL>; + }; +}; + +/* Include common flash filesystem configuration */ +qspi_flash: &n25q128a1 {}; +#include "../common/arduino_flash_fs.dtsi" \ No newline at end of file diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/pure_analog_pins.cpp b/variants/arduino_nicla_vision_stm32h747xx_m7/pure_analog_pins.cpp new file mode 100644 index 00000000..a6ba41b2 --- /dev/null +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/pure_analog_pins.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024 Arduino SA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "pure_analog_pins.h" + +#undef A0 +#undef A1 +#undef A2 +#undef A3 + +PureAnalogPin A0_PURE(0); +PureAnalogPin A1_PURE(1); +PureAnalogPin A2_PURE(2); +PureAnalogPin A3_PURE(3); + +int getAnalogReadResolution(); + +int analogRead(PureAnalogPin pin) { + return ::analogRead(A0 + pin.get()); +} diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/pure_analog_pins.h b/variants/arduino_nicla_vision_stm32h747xx_m7/pure_analog_pins.h new file mode 100644 index 00000000..dbed40b7 --- /dev/null +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/pure_analog_pins.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 Arduino SA + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _PURE_ANALOG_PINS_ +#define _PURE_ANALOG_PINS_ +#ifdef __cplusplus + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + +#include "Arduino.h" + +/****************************************************************************** + * PREPROCESSOR-MAGIC + ******************************************************************************/ + +#define PURE_ANALOG_AS_DIGITAL_ATTRIBUTE __attribute__ ((error("Can't use pins A0-A3 as digital"))) + +/****************************************************************************** + * TYPEDEF + ******************************************************************************/ + +class PureAnalogPin { +public: + PureAnalogPin(int _pin) : pin(_pin) {}; + int get() { + return pin; + }; + bool operator== (PureAnalogPin const & other) const { + return pin == other.pin; + } + //operator int() = delete; + __attribute__ ((error("Change me to a #define"))) operator int(); +private: + int pin; +}; + +extern PureAnalogPin A0_PURE; +extern PureAnalogPin A1_PURE; +extern PureAnalogPin A2_PURE; +extern PureAnalogPin A3_PURE; + +#define A0 A0_PURE +#define A1 A1_PURE +#define A2 A2_PURE +#define A3 A3_PURE + +/****************************************************************************** + * FUNCTION DECLARATION + ******************************************************************************/ + +void PURE_ANALOG_AS_DIGITAL_ATTRIBUTE pinMode (PureAnalogPin pin, PinMode mode); +PinStatus PURE_ANALOG_AS_DIGITAL_ATTRIBUTE digitalRead (PureAnalogPin pin); +void PURE_ANALOG_AS_DIGITAL_ATTRIBUTE digitalWrite(PureAnalogPin pin, PinStatus value); +int analogRead (PureAnalogPin pin); +void PURE_ANALOG_AS_DIGITAL_ATTRIBUTE analogWrite (PureAnalogPin pin, int value); + +#undef PURE_ANALOG_AS_DIGITAL_ATTRIBUTE + +#endif /* __cplusplus */ + +#endif /* _PURE_ANALOG_PINS_ */ diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/variant.cpp b/variants/arduino_nicla_vision_stm32h747xx_m7/variant.cpp new file mode 100644 index 00000000..20bde355 --- /dev/null +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/variant.cpp @@ -0,0 +1,20 @@ +#include +#include + +void _on_1200_bps() { + uint32_t tmp = (uint32_t) & (RTC->BKP0R); + tmp += (RTC_BKP_DR0 * 4U); + *(__IO uint32_t *)tmp = (uint32_t)0xDF59; + NVIC_SystemReset(); +} + +void initVariant(void) { + // check the BLUE LED + /* Set led1 inactive since the Arduino bootloader leaves it active */ + const struct gpio_dt_spec led2 = GPIO_DT_SPEC_GET(DT_ALIAS(led2), gpios); + if (!gpio_is_ready_dt(&led2)) { + return; + } + + gpio_pin_configure_dt(&led2, GPIO_OUTPUT_INACTIVE); +} diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/variant.h b/variants/arduino_nicla_vision_stm32h747xx_m7/variant.h new file mode 100644 index 00000000..9c1abf2e --- /dev/null +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/variant.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2022 Dhruva Gole + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "pure_analog_pins.h" + +// TODO: correctly handle these legacy defines +#define MOSI 0 +#define MISO 0 +#define SCK 0 +#define SS 0 +#define SDA 0 +#define SCL 0