From 45c7783b1e21b68fc877c99a7eb37c789c812e3b Mon Sep 17 00:00:00 2001 From: Tom Burdick Date: Thu, 12 Sep 2019 17:48:51 -0500 Subject: [PATCH] boards: arm: Add support for NXP FRDM-K22F board This adds support for NXP's Freedom K22 board. Co-authored-by: Sean Nyekjaer Co-authored-by: Tom Burdick Signed-off-by: Tom Burdick --- boards/arm/frdm_k22f/CMakeLists.txt | 11 + boards/arm/frdm_k22f/Kconfig.board | 11 + boards/arm/frdm_k22f/Kconfig.defconfig | 98 ++++++ boards/arm/frdm_k22f/board.cmake | 18 ++ boards/arm/frdm_k22f/doc/frdm_k22f.jpg | Bin 0 -> 67000 bytes boards/arm/frdm_k22f/doc/index.rst | 282 ++++++++++++++++++ boards/arm/frdm_k22f/frdm_k22f.dts | 180 +++++++++++ boards/arm/frdm_k22f/frdm_k22f.yaml | 16 + boards/arm/frdm_k22f/frdm_k22f_defconfig | 20 ++ boards/arm/frdm_k22f/pinmux.c | 87 ++++++ boards/arm/frdm_k22f/support/openocd.cfg | 4 + .../latency_measure/boards/frdm_k22f.conf | 4 + 12 files changed, 731 insertions(+) create mode 100644 boards/arm/frdm_k22f/CMakeLists.txt create mode 100644 boards/arm/frdm_k22f/Kconfig.board create mode 100644 boards/arm/frdm_k22f/Kconfig.defconfig create mode 100644 boards/arm/frdm_k22f/board.cmake create mode 100644 boards/arm/frdm_k22f/doc/frdm_k22f.jpg create mode 100644 boards/arm/frdm_k22f/doc/index.rst create mode 100644 boards/arm/frdm_k22f/frdm_k22f.dts create mode 100644 boards/arm/frdm_k22f/frdm_k22f.yaml create mode 100644 boards/arm/frdm_k22f/frdm_k22f_defconfig create mode 100644 boards/arm/frdm_k22f/pinmux.c create mode 100644 boards/arm/frdm_k22f/support/openocd.cfg create mode 100644 tests/benchmarks/latency_measure/boards/frdm_k22f.conf diff --git a/boards/arm/frdm_k22f/CMakeLists.txt b/boards/arm/frdm_k22f/CMakeLists.txt new file mode 100644 index 000000000000..c367dc704c18 --- /dev/null +++ b/boards/arm/frdm_k22f/CMakeLists.txt @@ -0,0 +1,11 @@ +# +# Copyright (c) 2019, Prevas A/S +# +# SPDX-License-Identifier: Apache-2.0 +# + +if(CONFIG_PINMUX_MCUX) + zephyr_library() + zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) + zephyr_library_sources(pinmux.c) +endif() diff --git a/boards/arm/frdm_k22f/Kconfig.board b/boards/arm/frdm_k22f/Kconfig.board new file mode 100644 index 000000000000..696e751f9ec6 --- /dev/null +++ b/boards/arm/frdm_k22f/Kconfig.board @@ -0,0 +1,11 @@ +# Kconfig - FRDM-K22F board +# +# Copyright (c) 2018, Prevas A/S +# +# SPDX-License-Identifier: Apache-2.0 +# + +config BOARD_FRDM_K22F + bool "NXP FRDM-K22F" + depends on SOC_SERIES_KINETIS_K2X + select SOC_PART_NUMBER_MK22FN512VLH12 diff --git a/boards/arm/frdm_k22f/Kconfig.defconfig b/boards/arm/frdm_k22f/Kconfig.defconfig new file mode 100644 index 000000000000..d5c0ae19748f --- /dev/null +++ b/boards/arm/frdm_k22f/Kconfig.defconfig @@ -0,0 +1,98 @@ +# Kconfig - FRDM-K22F board +# +# Copyright (c) 2018 Prevas A/S +# +# SPDX-License-Identifier: Apache-2.0 +# + +if BOARD_FRDM_K22F + +config BOARD + default "frdm_k22f" + +config OSC_XTAL0_FREQ + default 8000000 + +config MCG_PRDIV0 + default 0x3 + +config MCG_VDIV0 + default 0xc + +config MCG_FCRDIV + default 0 + +if UART_MCUX + +config UART_MCUX_1 + default y if UART_CONSOLE + +endif # UART_MCUX + +if PINMUX_MCUX + +config PINMUX_MCUX_PORTA + default y + +config PINMUX_MCUX_PORTB + default y + +config PINMUX_MCUX_PORTC + default y + +config PINMUX_MCUX_PORTD + default y + +config PINMUX_MCUX_PORTE + default y if UART_MCUX_1 + +endif # PINMUX_MCUX + +if GPIO_MCUX + +config GPIO_MCUX_PORTA + default y + +config GPIO_MCUX_PORTB + default y + +config GPIO_MCUX_PORTC + default y + +config GPIO_MCUX_PORTD + default y + +config GPIO_MCUX_PORTE + default y + +endif # GPIO_MCUX + +if I2C + +config I2C_0 + default y + +endif # I2C + +if ADC + +config ADC_0 + default y + +endif # ADC + +if PWM_MCUX_FTM + +config PWM_3 + default y + +endif # PWM_MCUX_FTM + +if SPI + +config SPI_0 + default y + +endif # SPI + +endif # BOARD_FRDM_K22F diff --git a/boards/arm/frdm_k22f/board.cmake b/boards/arm/frdm_k22f/board.cmake new file mode 100644 index 000000000000..5904d15768b1 --- /dev/null +++ b/boards/arm/frdm_k22f/board.cmake @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: Apache-2.0 + +set_ifndef(OPENSDA_FW daplink) + +if(OPENSDA_FW STREQUAL jlink) + set_ifndef(BOARD_DEBUG_RUNNER jlink) + set_ifndef(BOARD_FLASH_RUNNER jlink) +elseif(OPENSDA_FW STREQUAL daplink) + set_ifndef(BOARD_DEBUG_RUNNER pyocd) + set_ifndef(BOARD_FLASH_RUNNER pyocd) +endif() + +board_runner_args(jlink "--device=MK22FN512xxx12") +board_runner_args(pyocd "--target=k22f") + +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) diff --git a/boards/arm/frdm_k22f/doc/frdm_k22f.jpg b/boards/arm/frdm_k22f/doc/frdm_k22f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1561cfff4f6283d1546e244cede1b7608be4085 GIT binary patch literal 67000 zcmbrl1yEc~w=O)m1P|^oxCI>;EV#S7yStMh0fG%WI0Sbc2=4CggS#hz1QLk+sin0-o1PE?(XXOv;JoffTtvloqm4lao`k@wPOv^iBv3O=zrW zJUJ0S_R`uV6jDm=Sih%ZK6M+67 z{bS+3*#Bh)p*Vwjirrn}f6>OU%PGeMD`-MeHnzk5RiofemHi6#eMQj;nh~B8!O8j; zL3nu*Qs#0KUtT)XDcF$^td{UEgezoTu%eQ9buO54JL#))H7eF8@h?b7!+R=tek+Hc zks;hxex9Ea)3d$z-zXyU%y&PdR(muKp4&mUi8O!N+{-yzKmY&60f8eStAy`6lWODPWqj2E~w|#*dGB)nlr&91=c1RgN#5cR!p=*$d zc4Noh`@x1#s85~d=R2LODfbeU|FXpVO_EXSx|HGRyB|-M#^GxTJ^HTwkxdwj_Aol} z_N!d$qfGLDOi?Lc&HP-TmLn)SzcXXy{bsa21^>VqY`20b7oe~}Eqa|JaMAS$+WU_+ zlH-#CYODu z*e)7Dr6uQAa77T&`myB^`t6r(=Im_V%`RP^Igs8|edfYL_J7Jb?X}cK^uxP4xELUD zZw`SiaLFsbb7FVAh1Eh;9ou9=7m9Z-(okCm#|l~^Da4yQzW&3b3ptGsw=Ng>_=dc| zx;(TXK9QWW{HpHcRIc&L(dR1>-1*{FcTM+6T`hN7gCBpYXyONBc-UVm>E}NHv5JQU4lJJPFmg?!5fwOz*ju_w&SGWZRi*FrE+`EFLMccAyt8_!G*R zJPzBzJF~U|rpeipknS&)b=^a1Cbc(fW{z@nNrKgvVb4Sa zl2a3+C@&e4(4-R%8?}wzdp#|?%hA?*DwQqki`-(=d^q%x`Rf;F-=fpJnF8+k>Jy>{ z*`>c_QhR>jgBxwr%%ptV8-rsI^KzVgTFD#laIdMz@ zop#*?+sYD8(Da=DrL(>j)2F@k{r=dCRBjs7$QoUb!^7#e9 z7v(d}LtFcLtJe9mb#H9zf2n0s=!swMrU&v`k8B@~dtSXsbo*O&iuPbQq}y|7qPg|D z1Kz6gmd*RL^r_%|zHRS@Z-!G|_ms<|s_@B%{)XH(E~%b3{pd!zi=XAEEbW_n_*sSp z0D#)7A0AGQ)6G4`j`7BA#naW<6q5f_#T*n^;Yal@r#>F6^cV~Ka@#r!(h6NLu9nk> zU4rIaVw&GfH;;CieXZ+L};|m%DFOyvPazCaRvkT!DO|M-B;d8oU8?Qw$ zUeZo%H)H#S9INDX`~4^nac5Bb_@US(gz*XUR@5Pr{KDEbn{S*Qz1bp=l>*Bcg`)A9*;F7ACttv0v>2BhiS%0DWi^_053Eph? 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 F|JkCP$(sNG literal 0 HcmV?d00001 diff --git a/boards/arm/frdm_k22f/doc/index.rst b/boards/arm/frdm_k22f/doc/index.rst new file mode 100644 index 000000000000..d2ca12edad17 --- /dev/null +++ b/boards/arm/frdm_k22f/doc/index.rst @@ -0,0 +1,282 @@ +.. _frdm_k22f: + +NXP FRDM-K22F +############## + +Overview +******** + +The Freedom-K22F is an ultra-low-cost development platform for Kinetis K22 +MCUs. + +- Form-factor compatible with the Arduino R3 pin layout +- Peripherals enable rapid prototyping, including a 6-axis digital + accelerometer and magnetometer to create full eCompass capabilities, a + tri-colored LED and 2 user push-buttons for direct interaction, a optional + microSD card slot, and headers for use with Bluetooth* and 2.4 GHz radio + add-on modules +- OpenSDAv2, the NXP open source hardware embedded serial and debug adapter + running an open source bootloader, offers options for serial communication, + flash programming, and run-control debugging + +.. image:: frdm_k22f.jpg + :width: 720px + :align: center + :alt: FRDM-K22F + +Hardware +******** + +- MK22FN512VLH12 (120 MHz, 1 MB flash memory, 256 KB RAM, low-power, + crystal-less USB, and 64 pin Low profile Quad Flat Package (LQFP)) +- Dual role USB interface with micro-B USB connector +- RGB LED +- FXOS8700CQ accelerometer and magnetometer +- Two user push buttons +- Flexible power supply option - OpenSDAv2 USB, Kinetis K22 USB, and external source +- Easy access to MCU input/output through Arduino* R3 compatible I/O connectors +- Programmable OpenSDAv2 debug circuit supporting the CMSIS-DAP Interface + software that provides: + + - Mass storage device (MSD) flash programming interface + - CMSIS-DAP debug interface over a driver-less USB HID connection providing + run-control debugging and compatibility with IDE tools + - Virtual serial port interface + - Open source CMSIS-DAP software project + +- Optional SDHC + +For more information about the K22F SoC and FRDM-K22F board: + +- `K22F Website`_ +- `K22F Datasheet`_ +- `K22F Reference Manual`_ +- `FRDM-K22F Website`_ +- `FRDM-K22F User Guide`_ +- `FRDM-K22F Schematics`_ + +Supported Features +================== + +The frdm_k22f board configuration supports the following hardware features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| SYSTICK | on-chip | systick | ++-----------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| I2C | on-chip | i2c | ++-----------+------------+-------------------------------------+ +| SPI | on-chip | spi | ++-----------+------------+-------------------------------------+ +| WATCHDOG | on-chip | watchdog | ++-----------+------------+-------------------------------------+ +| ADC | on-chip | adc | ++-----------+------------+-------------------------------------+ +| PWM | on-chip | pwm | ++-----------+------------+-------------------------------------+ +| UART | on-chip | serial port-polling; | +| | | serial port-interrupt | ++-----------+------------+-------------------------------------+ +| FLASH | on-chip | soc flash | ++-----------+------------+-------------------------------------+ +| USB | on-chip | USB device | ++-----------+------------+-------------------------------------+ +| SENSOR | off-chip | fxos8700 polling; | +| | | fxos8700 trigger | ++-----------+------------+-------------------------------------+ + +The default configuration can be found in the defconfig file: + +:zephyr_file:`boards/arm/frdm_k22f/frdm_k22f_defconfig` + +Other hardware features are not currently supported by the port. + +Connections and IOs +=================== + +The K22F SoC has five pairs of pinmux/gpio controllers. + ++-------+-----------------+---------------------------+ +| Name | Function | Usage | ++=======+=================+===========================+ +| PTA1 | GPIO | Red LED | ++-------+-----------------+---------------------------+ +| PTA2 | GPIO | Green LED | ++-------+-----------------+---------------------------+ +| PTD5 | GPIO | Blue LED | ++-------+-----------------+---------------------------+ +| PTC1 | GPIO | SW2 | ++-------+-----------------+---------------------------+ +| PTD0 | GPIO | FXOS8700 INT1 | ++-------+-----------------+---------------------------+ +| PTD1 | GPIO | FXOS8700 INT2 | ++-------+-----------------+---------------------------+ +| PTB17 | GPIO | SW3 | ++-------+-----------------+---------------------------+ +| PTE1 | UART1_RX | UART Console | ++-------+-----------------+---------------------------+ +| PTE0 | UART1_TX | UART Console | ++-------+-----------------+---------------------------+ +| PTD2 | UART2_RX | UART BT HCI | ++-------+-----------------+---------------------------+ +| PTD3 | UART2_TX | UART BT HCI | ++-------+-----------------+---------------------------+ +| PTD4 | SPI0_PCS1 | SPI | ++-------+-----------------+---------------------------+ +| PTD1 | SPI0_SCK | SPI | ++-------+-----------------+---------------------------+ +| PTD2 | SPI0_SOUT | SPI | ++-------+-----------------+---------------------------+ +| PTD3 | SPI0_SIN | SPI | ++-------+-----------------+---------------------------+ +| PTB2 | I2C0_SCL | I2C / FXOS8700 | ++-------+-----------------+---------------------------+ +| PTB3 | I2C0_SDA | I2C / FXOS8700 | ++-------+-----------------+---------------------------+ + +System Clock +============ + +The K22F SoC is configured to use the 8 MHz crystal oscillator on the board +with the on-chip PLL to generate a 72 MHz system clock in its RUN mode. This +clock was selected to allow for the maximum number of peripherals to be used +with the crystal and PLL clocks. Other clock configurations are possible +through NXP SDK currently. + +Serial Port +=========== + +The K22F SoC has three UARTs. One is configured for the console, another for BT +HCI, and the remaining are not used. + +USB +=== + +The K22F SoC has a USB OTG (USBOTG) controller that supports both +device and host functions through its micro USB connector (K22F USB). +Only USB device function is supported in Zephyr at the moment. + +Programming and Debugging +************************* + +Build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +Configuring a Debug Probe +========================= + +A debug probe is used for both flashing and debugging the board. This board is +configured by default to use the :ref:`opensda-daplink-onboard-debug-probe`. + +Early versions of this board have an outdated version of the OpenSDA bootloader +and require an update. Please see the `DAPLink Bootloader Update`_ page for +instructions to update from the CMSIS-DAP bootloader to the DAPLink bootloader. + +Option 1: :ref:`opensda-daplink-onboard-debug-probe` (Recommended) +------------------------------------------------------------------ + +Install the :ref:`pyocd-debug-host-tools` and make sure they are in your search +path. + +Follow the instructions in :ref:`opensda-daplink-onboard-debug-probe` to program +the `OpenSDA DAPLink FRDM-K22F Firmware`_. + +Option 2: :ref:`opensda-jlink-onboard-debug-probe` +-------------------------------------------------- + +Install the :ref:`jlink-debug-host-tools` and make sure they are in your search +path. + +Follow the instructions in :ref:`opensda-jlink-onboard-debug-probe` to program +the `Segger J-Link OpenSDA V2.1 Firmware`_. Note that Segger +does provide an OpenSDA J-Link Board-Specific Firmware for this board, however +it is not compatible with the DAPLink bootloader. + +Add the argument ``-DOPENSDA_FW=jlink`` when you invoke ``west build`` to +override the default runner from pyOCD to J-Link: + +Configuring a Console +===================== + +Regardless of your choice in debug probe, we will use the OpenSDA +microcontroller as a usb-to-serial adapter for the serial console. + +Connect a USB cable from your PC to J26. + +Use the following settings with your serial terminal of choice (minicom, putty, +etc.): + +- Speed: 115200 +- Data: 8 bits +- Parity: None +- Stop bits: 1 + +Flashing +======== + +Here is an example for the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: frdm_k22f + :goals: flash + +Open a serial terminal, reset the board (press the SW1 button), and you should +see the following message in the terminal: + +.. code-block:: console + + ***** Booting Zephyr OS v2.0.0 ***** + Hello World! frdm_k22f + +Debugging +========= + +Here is an example for the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: frdm_k22f + :goals: debug + +Open a serial terminal, step through the application in your debugger, and you +should see the following message in the terminal: + +.. code-block:: console + + ***** Booting Zephyr OS v2.0.0 ***** + Hello World! frdm_k22f + +.. _FRDM-K22F Website: + https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/freedom-development-boards/mcu-boards/nxp-freedom-development-platform-for-kinetis-k22-mcus:FRDM-K22F + +.. _FRDM-K22F User Guide: + https://www.nxp.com/webapp/Download?colCode=FRDMK22FUG + +.. _FRDM-K22F Schematics: + https://www.nxp.com/webapp/Download?colCode=FRDM-K22F-SCH + +.. _K22F Website: + https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/kinetis-cortex-m-mcus/k-seriesperformancem4/k2x-usb/kinetis-k22-120-mhz-cost-effective-full-speed-usb-microcontrollers-mcus-based-on-arm-cortex-m4-core:K22_120 + +.. _K22F Datasheet: + https://www.nxp.com/docs/en/data-sheet/K22P121M120SF7.pdf + +.. _K22F Reference Manual: + https://www.nxp.com/docs/en/reference-manual/K22P121M120SF7RM.pdf + +.. _OpenSDA DAPLink FRDM-K22F Firmware: + http://www.nxp.com/assets/downloads/data/en/ide-debug-compile-build-tools/OpenSDAv2.2_DAPLink_frdmk22f_rev0242.zip + +.. _DAPLink Bootloader Update: + https://os.mbed.com/blog/entry/DAPLink-bootloader-update/ + +.. _Segger J-Link OpenSDA V2.1 Firmware: + https://www.segger.com/downloads/jlink/OpenSDA_V2_1.bin diff --git a/boards/arm/frdm_k22f/frdm_k22f.dts b/boards/arm/frdm_k22f/frdm_k22f.dts new file mode 100644 index 000000000000..c723994337ab --- /dev/null +++ b/boards/arm/frdm_k22f/frdm_k22f.dts @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018 Prevas A/S + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include + +/ { + model = "NXP Freedom MK22F board"; + compatible = "nxp,mk22f12", "nxp,k22f", "nxp,k2x"; + + aliases { + adc-0 = &adc0; + pwm-0 = &pwm0; + pwm-1 = &pwm1; + pwm-2 = &pwm2; + pwm-3 = &pwm3; + uart-0 = &uart0; + pinmux-a = &pinmux_a; + pinmux-b = &pinmux_b; + pinmux-c = &pinmux_c; + pinmux-d = &pinmux_d; + pinmux-e = &pinmux_e; + gpio-a = &gpioa; + gpio-b = &gpiob; + gpio-c = &gpioc; + gpio-d = &gpiod; + gpio-e = &gpioe; + i2c-0 = &i2c0; + i2c-1 = &i2c1; + led0 = &green_led; + led1 = &blue_led; + led2 = &red_led; + sw0 = &user_button_3; + sw1 = &user_button_2; + }; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,console = &uart1; + zephyr,shell-uart = &uart1; + zephyr,uart-pipe = &uart1; + }; + + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpioa 1 0>; + label = "User LD1"; + }; + green_led: led_1 { + gpios = <&gpioa 2 0>; + label = "User LD2"; + }; + blue_led: led_2 { + gpios = <&gpiod 5 0>; + label = "User LD3"; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + user_button_2: button_0 { + label = "User SW2"; + gpios = <&gpioc 1 GPIO_INT_ACTIVE_LOW>; + }; + user_button_3: button_1 { + label = "User SW3"; + gpios = <&gpiob 17 GPIO_INT_ACTIVE_LOW>; + }; + }; + + arduino_header: connector { + compatible = "arduino-header-r3"; + #gpio-cells = <2>; + gpio-map = <0 0 &gpiob 0 0>, /* A0 */ + <1 0 &gpiob 1 0>, /* A1 */ + <2 0 &gpioc 1 0>, /* A2 */ + <3 0 &gpioc 2 0>, /* A3 */ + <4 0 &gpiob 3 0>, /* A4 */ + <5 0 &gpiob 2 0>, /* A5 */ + <6 0 &gpiod 2 0>, /* D0 */ + <7 0 &gpiod 3 0>, /* D1 */ + <8 0 &gpiob 16 0>, /* D2 */ + <9 0 &gpioa 2 0>, /* D3 */ + <10 0 &gpioa 4 0>, /* D4 */ + <11 0 &gpiob 18 0>, /* D5 */ + <12 0 &gpioc 3 0>, /* D6 */ + <13 0 &gpioc 6 0>, /* D7 */ + <14 0 &gpiob 19 0>, /* D8 */ + <15 0 &gpioa 1 0>, /* D9 */ + <16 0 &gpiod 4 0>, /* D10 */ + <17 0 &gpiod 6 0>, /* D11 */ + <18 0 &gpiod 7 0>, /* D12 */ + <19 0 &gpiod 5 0>, /* D13 */ + <20 0 &gpioe 0 0>, /* D14 */ + <21 0 &gpioe 1 0>; /* D15 */ + }; +}; + +&adc0 { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + + fxos8700@1d { + compatible = "nxp,fxos8700"; + reg = <0x1d>; + label = "FXOS8700"; + int1-gpios = <&gpiod 0 0>; + int2-gpios = <&gpiod 1 0>; + }; +}; + +arduino_spi: &spi0 { + status = "okay"; +}; + +&pwm3 { + status = "okay"; +}; + +&uart1 { + status = "okay"; + current-speed = <115200>; +}; + +&usbd { + compatible = "nxp,kinetis-usbd"; + status = "okay"; + num-bidir-endpoints = <8>; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00010000>; + read-only; + }; + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00020000>; + }; + slot1_partition: partition@30000 { + label = "image-1"; + reg = <0x00030000 0x00020000>; + }; + scratch_partition: partition@50000 { + label = "image-scratch"; + reg = <0x00050000 0x00010000>; + }; + + /* + * The flash starting at 0x00060000 and ending at + * 0x0007ffff (sectors 16-31) is reserved for use + * by the application. + */ + storage_partition: partition@60000 { + label = "storage"; + reg = <0x00060000 0x00020000>; + }; + + }; +}; diff --git a/boards/arm/frdm_k22f/frdm_k22f.yaml b/boards/arm/frdm_k22f/frdm_k22f.yaml new file mode 100644 index 000000000000..2c5fd60ef7f1 --- /dev/null +++ b/boards/arm/frdm_k22f/frdm_k22f.yaml @@ -0,0 +1,16 @@ +identifier: frdm_k22f +name: NXP FRDM-K22F +type: mcu +arch: arm +ram: 64 +toolchain: + - zephyr + - gnuarmemb +supported: + - adc + - i2c + - nvs + - spi + - gpio + - usb_device + - watchdog diff --git a/boards/arm/frdm_k22f/frdm_k22f_defconfig b/boards/arm/frdm_k22f/frdm_k22f_defconfig new file mode 100644 index 000000000000..0032485393e0 --- /dev/null +++ b/boards/arm/frdm_k22f/frdm_k22f_defconfig @@ -0,0 +1,20 @@ +# +# Copyright (c) 2018 Prevas A/S +# Copyright (c) 2019 Thomas Burdick + +# +# SPDX-License-Identifier: Apache-2.0 +# + +CONFIG_ARM=y +CONFIG_SOC_MK22F51212=y +CONFIG_SOC_SERIES_KINETIS_K2X=y +CONFIG_BOARD_FRDM_K22F=y +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_CORTEX_M_SYSTICK=y +CONFIG_GPIO=y +CONFIG_PINMUX=y +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 +CONFIG_OSC_LOW_POWER=y diff --git a/boards/arm/frdm_k22f/pinmux.c b/boards/arm/frdm_k22f/pinmux.c new file mode 100644 index 000000000000..fde0f6c6742b --- /dev/null +++ b/boards/arm/frdm_k22f/pinmux.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018 Prevas A/S + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +static int frdm_k22f_pinmux_init(struct device *dev) +{ + ARG_UNUSED(dev); + +#ifdef CONFIG_PINMUX_MCUX_PORTA + struct device *porta = + device_get_binding(CONFIG_PINMUX_MCUX_PORTA_NAME); +#endif +#ifdef CONFIG_PINMUX_MCUX_PORTB + struct device *portb = + device_get_binding(CONFIG_PINMUX_MCUX_PORTB_NAME); +#endif +#ifdef CONFIG_PINMUX_MCUX_PORTC + struct device *portc = + device_get_binding(CONFIG_PINMUX_MCUX_PORTC_NAME); +#endif +#ifdef CONFIG_PINMUX_MCUX_PORTD + struct device *portd = + device_get_binding(CONFIG_PINMUX_MCUX_PORTD_NAME); +#endif +#ifdef CONFIG_PINMUX_MCUX_PORTE + struct device *porte = + device_get_binding(CONFIG_PINMUX_MCUX_PORTE_NAME); +#endif + +#ifdef CONFIG_UART_MCUX_0 +#error "No UART0 is used" +#endif + +#ifdef CONFIG_UART_MCUX_1 + /* UART1 RX, TX */ + pinmux_pin_set(porte, 0, PORT_PCR_MUX(kPORT_MuxAlt3)); + pinmux_pin_set(porte, 1, PORT_PCR_MUX(kPORT_MuxAlt3)); +#endif + +#ifdef CONFIG_UART_MCUX_2 + /* UART2 RX, TX */ + pinmux_pin_set(portd, 2, PORT_PCR_MUX(kPORT_MuxAlt3)); + pinmux_pin_set(portd, 3, PORT_PCR_MUX(kPORT_MuxAlt3)); +#endif + + /* SW2 */ + pinmux_pin_set(portc, 1, PORT_PCR_MUX(kPORT_MuxAsGpio)); + /* SW3 */ + pinmux_pin_set(portb, 17, PORT_PCR_MUX(kPORT_MuxAsGpio)); + + /* FXOS8700 INT1 */ + pinmux_pin_set(portd, 0, PORT_PCR_MUX(kPORT_MuxAsGpio)); + /* FXOS8700 INT2 */ + pinmux_pin_set(portd, 1, PORT_PCR_MUX(kPORT_MuxAsGpio)); + + /* Red, green, blue LEDs */ + pinmux_pin_set(porta, 1, PORT_PCR_MUX(kPORT_MuxAsGpio)); + pinmux_pin_set(porta, 2, PORT_PCR_MUX(kPORT_MuxAsGpio)); + pinmux_pin_set(portd, 5, PORT_PCR_MUX(kPORT_MuxAsGpio)); + +#ifdef CONFIG_SPI_0 + /* SPI0 CS0, SCK, SOUT, SIN */ + pinmux_pin_set(portd, 4, PORT_PCR_MUX(kPORT_MuxAlt2)); + pinmux_pin_set(portd, 1, PORT_PCR_MUX(kPORT_MuxAlt2)); + pinmux_pin_set(portd, 2, PORT_PCR_MUX(kPORT_MuxAlt2)); + pinmux_pin_set(portd, 3, PORT_PCR_MUX(kPORT_MuxAlt2)); + pinmux_pin_set(portc, 11, PORT_PCR_MUX(kPORT_MuxAsGpio)); +#endif + +#if CONFIG_I2C_0 + /* I2C0 SCL, SDA */ + pinmux_pin_set(portb, 2, PORT_PCR_MUX(kPORT_MuxAlt2) + | PORT_PCR_ODE_MASK); + pinmux_pin_set(portb, 3, PORT_PCR_MUX(kPORT_MuxAlt2) + | PORT_PCR_ODE_MASK); +#endif + + return 0; +} + +SYS_INIT(frdm_k22f_pinmux_init, PRE_KERNEL_1, CONFIG_PINMUX_INIT_PRIORITY); diff --git a/boards/arm/frdm_k22f/support/openocd.cfg b/boards/arm/frdm_k22f/support/openocd.cfg new file mode 100644 index 000000000000..a66254ba3a8c --- /dev/null +++ b/boards/arm/frdm_k22f/support/openocd.cfg @@ -0,0 +1,4 @@ + +source [find interface/cmsis-dap.cfg] + +source [find target/k20.cfg] diff --git a/tests/benchmarks/latency_measure/boards/frdm_k22f.conf b/tests/benchmarks/latency_measure/boards/frdm_k22f.conf new file mode 100644 index 000000000000..34b1402918b4 --- /dev/null +++ b/tests/benchmarks/latency_measure/boards/frdm_k22f.conf @@ -0,0 +1,4 @@ +# eliminate timer interrupts during the benchmark +# for platforms that do not allow frequency dividers large enough to get +# system clock tick period in 1 sec, make system clock tick to 0.1 sec +CONFIG_SYS_CLOCK_TICKS_PER_SEC=10