From 52daa75ea038d93078656603e71d9c55e1f2ec12 Mon Sep 17 00:00:00 2001 From: Manivannan Sadhasivam Date: Fri, 6 Oct 2017 14:32:38 +0530 Subject: [PATCH] boards: arm: Add support for 96Boards Neonkey Board This patch adds support for 96Boards Neonkey Mezzanine board. Signed-off-by: Manivannan Sadhasivam --- CODEOWNERS | 1 + boards/arm/96b_neonkey/96b_neonkey.yaml | 7 + boards/arm/96b_neonkey/96b_neonkey_defconfig | 53 ++++ boards/arm/96b_neonkey/Kconfig.board | 9 + boards/arm/96b_neonkey/Kconfig.defconfig | 13 + boards/arm/96b_neonkey/Makefile | 8 + boards/arm/96b_neonkey/board.h | 44 ++++ boards/arm/96b_neonkey/doc/96b_neonkey.rst | 228 ++++++++++++++++++ .../96b_neonkey/doc/img/96b-neonkey-front.jpg | Bin 0 -> 39819 bytes boards/arm/96b_neonkey/pinmux.c | 51 ++++ dts/arm/96b_neonkey.dts | 39 +++ dts/arm/96b_neonkey.fixup | 38 +++ dts/arm/Makefile | 1 + 13 files changed, 492 insertions(+) create mode 100644 boards/arm/96b_neonkey/96b_neonkey.yaml create mode 100644 boards/arm/96b_neonkey/96b_neonkey_defconfig create mode 100644 boards/arm/96b_neonkey/Kconfig.board create mode 100644 boards/arm/96b_neonkey/Kconfig.defconfig create mode 100644 boards/arm/96b_neonkey/Makefile create mode 100644 boards/arm/96b_neonkey/board.h create mode 100644 boards/arm/96b_neonkey/doc/96b_neonkey.rst create mode 100644 boards/arm/96b_neonkey/doc/img/96b-neonkey-front.jpg create mode 100644 boards/arm/96b_neonkey/pinmux.c create mode 100644 dts/arm/96b_neonkey.dts create mode 100644 dts/arm/96b_neonkey.fixup diff --git a/CODEOWNERS b/CODEOWNERS index cc935e068ed..25ee6e1695f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -32,6 +32,7 @@ boards/arc/quark_se_c1000_ss_devboard/* @nashif boards/arm/* @MaureenHelm @galak boards/arm/96b_carbon/* @rsalveti @idlethread boards/arm/96b_nitrogen/* @idlethread +boards/arm/96b_neonkey/* @Mani-Sadhasivam boards/arm/arduino_101_ble/* @jhedberg boards/arm/cc3220sf_launchxl/* @GAnthony boards/arm/disco_l475_iot1/* @erwango diff --git a/boards/arm/96b_neonkey/96b_neonkey.yaml b/boards/arm/96b_neonkey/96b_neonkey.yaml new file mode 100644 index 00000000000..f8a3eb2e323 --- /dev/null +++ b/boards/arm/96b_neonkey/96b_neonkey.yaml @@ -0,0 +1,7 @@ +identifier: 96b_neonkey +name: 96Boards Neonkey +type: mcu +arch: arm +toolchain: + - zephyr + - gccarmemb diff --git a/boards/arm/96b_neonkey/96b_neonkey_defconfig b/boards/arm/96b_neonkey/96b_neonkey_defconfig new file mode 100644 index 00000000000..a471b907e9d --- /dev/null +++ b/boards/arm/96b_neonkey/96b_neonkey_defconfig @@ -0,0 +1,53 @@ +CONFIG_ARM=y +CONFIG_BOARD_96B_NEONKEY=y +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F4X=y +CONFIG_SOC_STM32F411XE=y +CONFIG_CORTEX_M_SYSTICK=y + +# 84MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=84000000 +CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 + +# enable uart driver +CONFIG_SERIAL=y +CONFIG_UART_STM32=y + +# enable USART1 +CONFIG_UART_STM32_PORT_1=y + +# enable pinmux +CONFIG_PINMUX=y +CONFIG_PINMUX_STM32=y + +# enable GPIOs +CONFIG_GPIO=y +CONFIG_GPIO_STM32=y +CONFIG_GPIO_STM32_PORTA=y +CONFIG_GPIO_STM32_PORTB=y +CONFIG_GPIO_STM32_PORTC=y +CONFIG_GPIO_STM32_PORTD=y +CONFIG_GPIO_STM32_PORTE=y + +# clock configuration +CONFIG_CLOCK_CONTROL=y + +# SYSCLK selection +CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y + +# PLL configuration +CONFIG_CLOCK_STM32_PLL_SRC_HSI=y + +# produce 84MHz clock at PLL output +CONFIG_CLOCK_STM32_PLL_M_DIVISOR=16 +CONFIG_CLOCK_STM32_PLL_N_MULTIPLIER=336 +CONFIG_CLOCK_STM32_PLL_P_DIVISOR=4 +CONFIG_CLOCK_STM32_AHB_PRESCALER=1 + +# APB1 clock must not exceed 50MHz limit +CONFIG_CLOCK_STM32_APB1_PRESCALER=2 +CONFIG_CLOCK_STM32_APB2_PRESCALER=1 + +# console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y diff --git a/boards/arm/96b_neonkey/Kconfig.board b/boards/arm/96b_neonkey/Kconfig.board new file mode 100644 index 00000000000..0b8fb789e24 --- /dev/null +++ b/boards/arm/96b_neonkey/Kconfig.board @@ -0,0 +1,9 @@ +# Kconfig - 96Boards Neonkey Board Configuration +# +# Copyright (c) 2017 Linaro Limited +# +# SPDX-License-Identifier: Apache-2.0 +# +config BOARD_96B_NEONKEY + bool "96Boards Neonkey" + depends on SOC_STM32F411XE diff --git a/boards/arm/96b_neonkey/Kconfig.defconfig b/boards/arm/96b_neonkey/Kconfig.defconfig new file mode 100644 index 00000000000..276effeb7ed --- /dev/null +++ b/boards/arm/96b_neonkey/Kconfig.defconfig @@ -0,0 +1,13 @@ +# Kconfig - 96Boards Neonkey Board Configuration +# +# Copyright (c) 2017 Linaro Limited +# +# SPDX-License-Identifier: Apache-2.0 +# + +if BOARD_96B_NEONKEY + +config BOARD + default 96b_neonkey + +endif # BOARD_96B_NEONKEY diff --git a/boards/arm/96b_neonkey/Makefile b/boards/arm/96b_neonkey/Makefile new file mode 100644 index 00000000000..abf24a3ddf8 --- /dev/null +++ b/boards/arm/96b_neonkey/Makefile @@ -0,0 +1,8 @@ +# Copyright (c) 2017 Linaro Limited +# +# SPDX-License-Identifier: Apache-2.0 +# + +ccflags-y +=-I$(srctree)/drivers + +obj-y += pinmux.o diff --git a/boards/arm/96b_neonkey/board.h b/boards/arm/96b_neonkey/board.h new file mode 100644 index 00000000000..18c69af657c --- /dev/null +++ b/boards/arm/96b_neonkey/board.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __INC_BOARD_H +#define __INC_BOARD_H + +#include + +/* USER push button */ +#define USER_PB_GPIO_PORT "GPIOB" +#define USER_PB_GPIO_PIN 2 + +/* Onboard USR0 GREEN LED */ +#define USR0_GPIO_PIN 12 +#define USR0_GPIO_PORT "GPIOB" + +/* Onboard USR1 GREEN LED */ +#define USR1_GPIO_PIN 13 +#define USR1_GPIO_PORT "GPIOB" + +/* Onboard USR2 GREEN LED */ +#define USR2_GPIO_PIN 14 +#define USR2_GPIO_PORT "GPIOB" + +/* Onboard USR3 GREEN LED */ +#define USR3_GPIO_PIN 15 +#define USR3_GPIO_PORT "GPIOB" + +/* Aliases to make the basic LED samples work */ +#define SW0_GPIO_NAME USER_PB_GPIO_PORT +#define SW0_GPIO_PIN USER_PB_GPIO_PIN +#define LED0_GPIO_PIN USR0_GPIO_PIN +#define LED0_GPIO_PORT USR0_GPIO_PORT +#define LED1_GPIO_PIN USR1_GPIO_PIN +#define LED1_GPIO_PORT USR1_GPIO_PORT +#define LED2_GPIO_PIN USR2_GPIO_PIN +#define LED2_GPIO_PORT USR2_GPIO_PORT +#define LED3_GPIO_PIN USR3_GPIO_PIN +#define LED3_GPIO_PORT USR3_GPIO_PORT + +#endif /* __INC_BOARD_H */ diff --git a/boards/arm/96b_neonkey/doc/96b_neonkey.rst b/boards/arm/96b_neonkey/doc/96b_neonkey.rst new file mode 100644 index 00000000000..e25a156ebd6 --- /dev/null +++ b/boards/arm/96b_neonkey/doc/96b_neonkey.rst @@ -0,0 +1,228 @@ +.. _96b_neonkey: + +96Boards Neonkey +################ + +Overview +******** + +96Boards Neonkey board is based on the STMicroelectronics STM32F411CE +Cortex M4 CPU. Zephyr applications use the 96b_neonkey configuration +to run on these boards. + +.. figure:: img/96b-neonkey-front.jpg + :width: 500px + :align: center + :height: 330px + :alt: 96Boards Neonkey + + 96Boards Neonkey + +This board acts as a sensor hub platform for all 96Boards compliant +family products. It can also be used as a standalone board. + +Hardware +******** + +96Boards Neonkey provides the following hardware components: + +- STM32F411CE in UFQFPN48 package +- ARM |reg| 32-bit Cortex |reg|-M4 CPU with FPU +- 84 MHz max CPU frequency +- 1.8V work voltage +- 512 KB Flash +- 128 KB SRAM +- On board sensors: + + - Temperature/Humidity: SI7034-A10 + - Pressure: BMP280 + - ALS/Proximity: RPR-0521RS + - Geomagnetic: BMM150 + - Acclerometer/Gyroscope: BMI160 + - AMR Hall sensor: MRMS501A + - Microphone: SPK0415HM4H-B + +- 4 User LEDs +- 15 General purpose LEDs +- GPIO with external interrupt capability +- I2C (3) +- SPI (1) +- I2S (1) + +Supported Features +================== + +The Zephyr 96b_neonkey board configuration supports the following hardware +features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| SYSTICK | on-chip | system clock | ++-----------+------------+-------------------------------------+ +| UART | on-chip | serial port | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++-----------+------------+-------------------------------------+ +| FLASH | on-chip | flash | ++-----------+------------+-------------------------------------+ +| SPI | on-chip | spi | ++-----------+------------+-------------------------------------+ +| I2C | on-chip | i2c | ++-----------+------------+-------------------------------------+ + +More details about the board can be found at `96Boards website`_. + +The default board configuration can be found in the defconfig file: + + ``boards/arm/96b_neonkey/96b_neonkey_defconfig`` + +Connections and IOs +=================== + +LED +--- + +- LED1 / User1 LED = PB12 +- LED2 / User2 LED = PB13 +- LED3 / User3 LED = PB14 +- LED4 / User4 LED = PB15 + +Push buttons +------------ + +- BUTTON = RST (SW1) +- BUTTON = USR (SW2) + +System Clock +============ + +96Boards Neonkey can be driven by an internal oscillator as well as the main +PLL clock. By default System clock is sourced by PLL clock at 84MHz, driven +by internal oscillator. + +Serial Port +=========== + +On 96Boards Neonkey Zephyr console output is assigned to USART1. +Default settings are 115200 8N1. + +I2C +--- + +96Boards Neonkey board has up to 3 I2Cs. The default I2C mapping for Zephyr is: + +- I2C1_SCL : PB6 +- I2C1_SDA : PB7 +- I2C2_SCL : PB10 +- I2C2_SDA : PB3 +- I2C3_SCL : PA8 +- I2C3_SCL : PB4 + +Programming and Debugging +************************* + +Building +======== + +Build the Zephyr kernel and application with: + +.. code-block:: console + + $ cd + $ source zephyr-env.sh + $ cd $ZEPHYR_BASE/samples/hello_world/ + $ make BOARD=96b_neonkey + +Flashing +======== + +96Boards Neonkey can be flashed by two methods, one using the ROM +bootloader and another using the SWD debug port (which requires additional +hardware). + +Using ROM bootloader: +--------------------- + +ROM bootloader can be triggered by the following pattern: + +1. Connect BOOT0 to VDD (link JTAG pins 1 and 5 on P4 header) +2. Press and hold the USR button +3. Press and release the RST button + +More detailed information on activating the ROM bootloder can be found in +Chapter 29 of Application note `AN2606`_. The ROM bootloader supports flashing +via UART, I2C and SPI protocols. + +For flashing, `stm32flash`_ command line utility can be used. The following +command will flash the ``zephyr.bin`` binary to the Neonkey board using UART +and starts its execution: + +.. code-block:: console + + $ stm32flash -w zephyr.bin -v -g 0x08000000 /dev/ttyS0 + +.. note:: + The above command assumes that Neonkey board is connected to + serial port ``/dev/ttyS0``. + +Using SWD debugger: +------------------- + +For flashing via SWD debug port, 0.1" male header must be soldered at P4 +header available at the bottom of the board, near RST button. + +Use the `Black Magic Debug Probe`_ as an SWD programmer, which can +be connected to the P4 header using its flying leads and its 20 Pin +JTAG Adapter Board Kit. When plugged into your host PC, the Black +Magic Debug Probe enumerates as a USB serial device as documented on +its `Getting started page`_. + +It also uses the GDB binary provided with the Zephyr SDK, +``arm-zephyr-eabi-gdb``. Other GDB binaries, such as the GDB from GCC +ARM Embedded, can be used as well. + +.. code-block:: console + + $ arm-zephyr-eabi-gdb -q zephyr.elf + (gdb) target extended-remote /dev/ttyACM0 + Remote debugging using /dev/ttyACM0 + (gdb) monitor swdp_scan + Target voltage: 1.8V + Available Targets: + No. Att Driver + 1 STM32F4xx + (gdb) attach 1 + Attaching to Remote target + 0x080005d0 in ?? () + (gdb) load + +Debugging +========= + +After flashing 96Boards Neonkey, it can be debugged using the same +GDB instance. To reattach, just follow the same steps above, till +"attach 1". You can then debug as usual with GDB. In particular, type +"run" at the GDB prompt to restart the program you've flashed. + +References +********** + +.. _96Boards website: + https://www.96boards.org/product/neonkey/ + +.. _AN2606: + https://www.st.com/resource/en/application_note/cd00167594.pdf + +.. _stm32flash: + https://sourceforge.net/p/stm32flash/wiki/Home/ + +.. _Black Magic Debug Probe: + https://github.com/blacksphere/blackmagic/wiki + +.. _Getting started page: + https://github.com/blacksphere/blackmagic/wiki/Getting-Started diff --git a/boards/arm/96b_neonkey/doc/img/96b-neonkey-front.jpg b/boards/arm/96b_neonkey/doc/img/96b-neonkey-front.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a91baaaeb6e1bab0a1a75669264ad5838376a06b GIT binary patch literal 39819 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 literal 0 HcmV?d00001 diff --git a/boards/arm/96b_neonkey/pinmux.c b/boards/arm/96b_neonkey/pinmux.c new file mode 100644 index 00000000000..4ef096e48f6 --- /dev/null +++ b/boards/arm/96b_neonkey/pinmux.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017 Linaro Limited. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include + +#include + +/* pin assignments for 96boards Neonkey board */ +static const struct pin_config pinconf[] = { +#ifdef CONFIG_UART_STM32_PORT_1 + {STM32_PIN_PA9, STM32F4_PINMUX_FUNC_PA9_USART1_TX}, + {STM32_PIN_PA10, STM32F4_PINMUX_FUNC_PA10_USART1_RX}, +#endif /* CONFIG_UART_STM32_PORT_1 */ +#ifdef CONFIG_I2C_1 + {STM32_PIN_PB6, STM32F4_PINMUX_FUNC_PB6_I2C1_SCL}, + {STM32_PIN_PB7, STM32F4_PINMUX_FUNC_PB7_I2C1_SDA}, +#endif /* CONFIG_I2C_1 */ +#ifdef CONFIG_I2C_2 + {STM32_PIN_PB10, STM32F4_PINMUX_FUNC_PB10_I2C2_SCL}, + {STM32_PIN_PB3, STM32F4_PINMUX_FUNC_PB3_I2C2_SDA}, +#endif /* CONFIG_I2C_2 */ +#ifdef CONFIG_I2C_3 + {STM32_PIN_PA8, STM32F4_PINMUX_FUNC_PA8_I2C3_SCL}, + {STM32_PIN_PB4, STM32F4_PINMUX_FUNC_PB4_I2C3_SDA}, +#endif /* CONFIG_I2C_3 */ +#ifdef CONFIG_SPI_1 + {STM32_PIN_PA4, STM32F4_PINMUX_FUNC_PA4_SPI1_NSS}, + {STM32_PIN_PA5, STM32F4_PINMUX_FUNC_PA5_SPI1_SCK}, + {STM32_PIN_PA6, STM32F4_PINMUX_FUNC_PA6_SPI1_MISO}, + {STM32_PIN_PA7, STM32F4_PINMUX_FUNC_PA7_SPI1_MOSI}, +#endif /* CONFIG_SPI_1 */ +}; + +static int pinmux_stm32_init(struct device *port) +{ + ARG_UNUSED(port); + + stm32_setup_pins(pinconf, ARRAY_SIZE(pinconf)); + + return 0; +} + +SYS_INIT(pinmux_stm32_init, PRE_KERNEL_1, + CONFIG_PINMUX_STM32_DEVICE_INITIALIZATION_PRIORITY); diff --git a/dts/arm/96b_neonkey.dts b/dts/arm/96b_neonkey.dts new file mode 100644 index 00000000000..2945d503a18 --- /dev/null +++ b/dts/arm/96b_neonkey.dts @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include + +/ { + model = "Tocoding Neonkey 96boards"; + compatible = "tocoding,neonkey", "st,stm32f411"; + + chosen { + zephyr,console = &usart1; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; +}; + +&usart1 { + current-speed = <115200>; + pinctrl-0 = <&usart1_pins_b>; + pinctrl-names = "default"; + status = "ok"; +}; + +&i2c1 { + status = "ok"; + clock-frequency = ; +}; + +&i2c2 { + clock-frequency = ; +}; + +&i2c3 { + clock-frequency = ; +}; diff --git a/dts/arm/96b_neonkey.fixup b/dts/arm/96b_neonkey.fixup new file mode 100644 index 00000000000..10bb3628cc6 --- /dev/null +++ b/dts/arm/96b_neonkey.fixup @@ -0,0 +1,38 @@ +/* This file is a temporary workaround for mapping of the generated information + * to the current driver definitions. This will be removed when the drivers + * are modified to handle the generated information, or the mapping of + * generated data matches the driver definitions. + */ + + +#define CONFIG_NUM_IRQ_PRIO_BITS ARM_V7M_NVIC_E000E100_ARM_NUM_IRQ_PRIORITY_BITS + +#define CONFIG_UART_STM32_PORT_1_BASE_ADDRESS ST_STM32_USART_40011000_BASE_ADDRESS +#define CONFIG_UART_STM32_PORT_1_BAUD_RATE ST_STM32_USART_40011000_CURRENT_SPEED +#define CONFIG_UART_STM32_PORT_1_IRQ_PRI ST_STM32_USART_40011000_IRQ_0_PRIORITY +#define CONFIG_UART_STM32_PORT_1_NAME ST_STM32_USART_40011000_LABEL +#define PORT_1_IRQ ST_STM32_USART_40011000_IRQ_0 + +#define CONFIG_I2C_1_BASE_ADDRESS ST_STM32_I2C_V1_40005400_BASE_ADDRESS +#define CONFIG_I2C_1_EVENT_IRQ_PRI ST_STM32_I2C_V1_40005400_IRQ_EVENT_PRIORITY +#define CONFIG_I2C_1_ERROR_IRQ_PRI ST_STM32_I2C_V1_40005400_IRQ_ERROR_PRIORITY +#define CONFIG_I2C_1_NAME ST_STM32_I2C_V1_40005400_LABEL +#define CONFIG_I2C_1_EVENT_IRQ ST_STM32_I2C_V1_40005400_IRQ_EVENT +#define CONFIG_I2C_1_ERROR_IRQ ST_STM32_I2C_V1_40005400_IRQ_ERROR +#define CONFIG_I2C_1_BITRATE ST_STM32_I2C_V1_40005400_CLOCK_FREQUENCY + +#define CONFIG_I2C_2_BASE_ADDRESS ST_STM32_I2C_V1_40005800_BASE_ADDRESS +#define CONFIG_I2C_2_EVENT_IRQ_PRI ST_STM32_I2C_V1_40005800_IRQ_EVENT_PRIORITY +#define CONFIG_I2C_2_ERROR_IRQ_PRI ST_STM32_I2C_V1_40005800_IRQ_ERROR_PRIORITY +#define CONFIG_I2C_2_NAME ST_STM32_I2C_V1_40005800_LABEL +#define CONFIG_I2C_2_EVENT_IRQ ST_STM32_I2C_V1_40005800_IRQ_EVENT +#define CONFIG_I2C_2_ERROR_IRQ ST_STM32_I2C_V1_40005800_IRQ_ERROR +#define CONFIG_I2C_2_BITRATE ST_STM32_I2C_V1_40005800_CLOCK_FREQUENCY + +#define CONFIG_I2C_3_BASE_ADDRESS ST_STM32_I2C_V1_40005C00_BASE_ADDRESS +#define CONFIG_I2C_3_EVENT_IRQ_PRI ST_STM32_I2C_V1_40005C00_IRQ_EVENT_PRIORITY +#define CONFIG_I2C_3_ERROR_IRQ_PRI ST_STM32_I2C_V1_40005C00_IRQ_ERROR_PRIORITY +#define CONFIG_I2C_3_NAME ST_STM32_I2C_V1_40005C00_LABEL +#define CONFIG_I2C_3_EVENT_IRQ ST_STM32_I2C_V1_40005C00_IRQ_EVENT +#define CONFIG_I2C_3_ERROR_IRQ ST_STM32_I2C_V1_40005C00_IRQ_ERROR +#define CONFIG_I2C_3_BITRATE ST_STM32_I2C_V1_40005C00_CLOCK_FREQUENCY diff --git a/dts/arm/Makefile b/dts/arm/Makefile index 56c17cfe9e6..7ba6df3bf13 100644 --- a/dts/arm/Makefile +++ b/dts/arm/Makefile @@ -50,6 +50,7 @@ dtb-$(CONFIG_BOARD_STM32F3_DISCO) = stm32f3_disco.dts_compiled dtb-$(CONFIG_BOARD_OLIMEX_STM32_P405) = olimex_stm32_p405.dts_compiled dtb-$(CONFIG_BOARD_STM32F429I_DISC1) = stm32f429i_disc1.dts_compiled dtb-$(CONFIG_BOARD_EFM32WG_STK3800) = efm32wg_stk3800.dts_compiled +dtb-$(CONFIG_BOARD_96B_NEONKEY) = 96b_neonkey.dts_compiled always := $(dtb-y) endif