From 23099c53268b1d078e516e1f21f4ab3bdc6efd6f Mon Sep 17 00:00:00 2001 From: wgz-code <820906721@qq.com> Date: Mon, 7 Mar 2022 18:24:10 +0800 Subject: [PATCH 01/25] support M7 imxrt-ok1052 board --- .../Nuttx/aiit_board/imxrt1052-ok/Kconfig | 27 + .../imxrt1052-ok/configs/knsh/Make.defs | 74 + .../imxrt1052-ok/configs/knsh/defconfig | 43 + .../imxrt1052-ok/configs/libcxxtest/Make.defs | 85 ++ .../imxrt1052-ok/configs/libcxxtest/defconfig | 40 + .../imxrt1052-ok/configs/netnsh/defconfig | 62 + .../imxrt1052-ok/configs/nsh/defconfig | 37 + .../aiit_board/imxrt1052-ok/include/board.h | 338 +++++ .../aiit_board/imxrt1052-ok/kernel/Makefile | 103 ++ .../imxrt1052-ok/kernel/imxrt_userspace.c | 113 ++ .../aiit_board/imxrt1052-ok/scripts/Make.defs | 75 + .../imxrt1052-ok/scripts/flash-ocram.ld | 140 ++ .../imxrt1052-ok/scripts/kernel-space.ld | 104 ++ .../aiit_board/imxrt1052-ok/scripts/memory.ld | 67 + .../imxrt1052-ok/scripts/user-space.ld | 118 ++ .../aiit_board/imxrt1052-ok/src/Makefile | 69 + .../imxrt1052-ok/src/imxrt1052-ok.h | 193 +++ .../imxrt1052-ok/src/imxrt_appinit.c | 75 + .../imxrt1052-ok/src/imxrt_autoleds.c | 166 +++ .../aiit_board/imxrt1052-ok/src/imxrt_boot.c | 77 + .../imxrt1052-ok/src/imxrt_bringup.c | 190 +++ .../imxrt1052-ok/src/imxrt_buttons.c | 129 ++ .../imxrt1052-ok/src/imxrt_ethernet.c | 284 ++++ .../imxrt1052-ok/src/imxrt_flexspi_nor_boot.c | 55 + .../imxrt1052-ok/src/imxrt_flexspi_nor_boot.h | 142 ++ .../src/imxrt_flexspi_nor_flash.c | 206 +++ .../src/imxrt_flexspi_nor_flash.h | 350 +++++ .../aiit_board/imxrt1052-ok/src/imxrt_gpio.c | 215 +++ .../aiit_board/imxrt1052-ok/src/imxrt_lcd.c | 68 + .../imxrt1052-ok/src/imxrt_mmcsd_spi.c | 122 ++ .../imxrt1052-ok/src/imxrt_sdram_ini_dcd.c | 1257 +++++++++++++++++ .../aiit_board/imxrt1052-ok/src/imxrt_spi.c | 211 +++ .../imxrt1052-ok/src/imxrt_userleds.c | 85 ++ Ubiquitous/Nuttx/app_match_nuttx/build.sh | 1 + .../app_match_nuttx/nuttx/boards/Kconfig | 14 + 35 files changed, 5335 insertions(+) create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c create mode 100644 Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig new file mode 100644 index 000000000..c4fde44a1 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig @@ -0,0 +1,27 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_IMXRT1052_OK + +choice + prompt "Boot Flash" + default IMXRT1052_OK_HYPER_FLASH + +config IMXRT1052_OK_HYPER_FLASH + bool "HYPER Flash" + +config IMXRT1052_OK_QSPI_FLASH + bool "QSPI Flash" + +endchoice # Boot Flash + +config IMXRT1052_OK_SDRAM + bool "Enable SDRAM" + default n + select IMXRT_SEMC_INIT_DONE + ---help--- + Activate DCD configuration of SDRAM + +endif diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs new file mode 100644 index 000000000..9f16dfe9d --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs @@ -0,0 +1,74 @@ +############################################################################ +# boards/arm/imxrt/imxrt1052-ok/configs/knsh/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv7-m/Toolchain.defs + +LDSCRIPT1 = memory.ld +LDSCRIPT2 = kernel-space.ld + +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT1)}" + ARCHSCRIPT += -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT2)}" +else + ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT1) + ARCHSCRIPT += -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT2) +endif + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + ARCHOPTIMIZATION = -g +endif + +ifneq ($(CONFIG_DEBUG_NOOPT),y) + ARCHOPTIMIZATION += $(MAXOPTIMIZATION) +endif + +ARCHCFLAGS = -fno-builtin +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti +ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -fno-strict-aliasing +ARCHWARNINGSXX = -Wall -Wshadow -Wundef +ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 + +CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 + +# Loadable module definitions + +CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs + +LDMODULEFLAGS = -r -e module_initialize +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libs/libc/modlib/gnu-elf.ld}" +else + LDMODULEFLAGS += -T $(TOPDIR)/libs/libc/modlib/gnu-elf.ld +endif + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + LDFLAGS += -g +endif diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig new file mode 100644 index 000000000..1ef5015a7 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -0,0 +1,43 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_RAMFUNCS is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="imxrt1052-ok" +CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_CHIP="imxrt" +CONFIG_ARCH_CHIP_IMXRT=y +CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_LAZYFPU=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU=y +CONFIG_BOARD_LOOPSPERMSEC=104926 +CONFIG_BUILD_PROTECTED=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_IMXRT_LPUART1=y +CONFIG_INTELHEX_BINARY=y +CONFIG_LPUART1_SERIAL_CONSOLE=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_DISABLE_MKRD=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_NUTTX_USERSPACE=0x60200000 +CONFIG_PASS1_BUILDIR="boards/arm/imxrt/imxrt1052-ok/kernel" +CONFIG_RAM_SIZE=524288 +CONFIG_RAM_START=0x20200000 +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=8 +CONFIG_START_MONTH=6 +CONFIG_SYSTEM_NSH=y +CONFIG_SYS_RESERVED=9 +CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs new file mode 100644 index 000000000..6e1d1be1c --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs @@ -0,0 +1,85 @@ +############################################################################ +# boards/arm/imxrt/imxrt1052-ok/configs/libcxxtest/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv7-m/Toolchain.defs + +ifeq ($(CONFIG_ARMV7M_DTCM),y) + LDSCRIPT = flash-dtcm.ld +else + LDSCRIPT = flash-ocram.ld +endif + +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}" +else + ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) +endif + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + ARCHOPTIMIZATION = -g +endif + +ifneq ($(CONFIG_DEBUG_NOOPT),y) + ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing \ + -fno-strength-reduce -fomit-frame-pointer +endif + +ARCHCFLAGS = -fno-builtin +ifeq ($(CONFIG_CXX_EXCEPTION),y) + ARCHCPUFLAGSXX = -fno-builtin +else + ARCHCPUFLAGSXX = -fno-builtin -fno-exceptions -fcheck-new +endif +ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef #-fno-strict-aliasing +ARCHWARNINGSXX = -Wall -Wshadow -Wundef +ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 + + +CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) \ + $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) +CXXFLAGS += $(ARCHDEFINES) $(EXTRAFLAGS) -pipe -std=c++11 +CXXFLAGS += -fno-builtin -fno-exceptions -fcheck-new -fno-rtti +CXXFLAGS += -pedantic -D_DEBUG -D_LIBCPP_BUILD_STATIC -D_LIBCPP_NO_EXCEPTIONS +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 + +# Loadable module definitions + +CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs + +LDMODULEFLAGS = -r -e module_initialize +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libs/libc/modlib/gnu-elf.ld}" +else + LDMODULEFLAGS += -T $(TOPDIR)/libs/libc/modlib/gnu-elf.ld +endif + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + LDFLAGS += -g +endif diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig new file mode 100644 index 000000000..568c20516 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -0,0 +1,40 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="imxrt1052-ok" +CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_CHIP="imxrt" +CONFIG_ARCH_CHIP_IMXRT=y +CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_LOOPSPERMSEC=20000 +CONFIG_BUILTIN=y +CONFIG_C99_BOOL8=y +CONFIG_FS_PROCFS=y +CONFIG_HAVE_CXX=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_IMXRT_LPUART1=y +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBCXX=y +CONFIG_LIBCXXABI=y +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LOCALTIME=y +CONFIG_LIBM=y +CONFIG_LPUART1_SERIAL_CONSOLE=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=536870912 +CONFIG_RAM_START=0x20200000 +CONFIG_SCHED_CPULOAD=y +CONFIG_START_DAY=14 +CONFIG_START_MONTH=3 +CONFIG_SYSTEM_NSH=y +CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig new file mode 100644 index 000000000..bbc23cc75 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -0,0 +1,62 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_LEDS is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="imxrt1052-ok" +CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_CHIP="imxrt" +CONFIG_ARCH_CHIP_IMXRT=y +CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARD_LOOPSPERMSEC=104926 +CONFIG_BUILTIN=y +CONFIG_ETH0_PHY_KSZ8081=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_IMXRT_ENET=y +CONFIG_IMXRT_LPUART1=y +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_HOSTNAME="i.MXRT1050 EVK" +CONFIG_LPUART1_SERIAL_CONSOLE=y +CONFIG_NET=y +CONFIG_NETDEV_STATISTICS=y +CONFIG_NETINIT_NOMAC=y +CONFIG_NETUTILS_TELNETD=y +CONFIG_NET_ARP_SEND=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_ICMPv6=y +CONFIG_NET_ICMPv6_NEIGHBOR=y +CONFIG_NET_ICMPv6_SOCKET=y +CONFIG_NET_IPv6=y +CONFIG_NET_SOCKOPTS=y +CONFIG_NET_STATISTICS=y +CONFIG_NET_TCP=y +CONFIG_NET_TCPBACKLOG=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_UDP=y +CONFIG_NET_UDP_WRITE_BUFFERS=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=524288 +CONFIG_RAM_START=0x20200000 +CONFIG_SCHED_LPWORK=y +CONFIG_START_DAY=14 +CONFIG_START_MONTH=3 +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING6=y +CONFIG_SYSTEM_PING=y +CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig new file mode 100644 index 000000000..d69e7aecd --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -0,0 +1,37 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="imxrt1052-ok" +CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_CHIP="imxrt" +CONFIG_ARCH_CHIP_IMXRT=y +CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARD_LOOPSPERMSEC=104926 +CONFIG_BUILTIN=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_IMXRT_LPUART1=y +CONFIG_INTELHEX_BINARY=y +CONFIG_LPUART1_SERIAL_CONSOLE=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=524288 +CONFIG_RAM_START=0x20200000 +CONFIG_START_DAY=14 +CONFIG_START_MONTH=3 +CONFIG_SYSTEM_NSH=y +CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h new file mode 100644 index 000000000..f7a7e1be1 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h @@ -0,0 +1,338 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/include/board.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H +#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/* Do not include i.MXRT header files here */ + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +/* Set VDD_SOC to 1.25V */ + +#define IMXRT_VDD_SOC (0x12) + +/* Set Arm PLL (PLL1) to fOut = (24Mhz * ARM_PLL_DIV_SELECT/2) / + * ARM_PODF_DIVISOR + * 600Mhz = (24Mhz * ARM_PLL_DIV_SELECT/2) / + * ARM_PODF_DIVISOR + * ARM_PLL_DIV_SELECT = 100 + * ARM_PODF_DIVISOR = 2 + * 600Mhz = (24Mhz * 100/2) / 2 + * + * AHB_CLOCK_ROOT = PLL1fOut / IMXRT_AHB_PODF_DIVIDER + * 1Hz to 600 MHz = 600Mhz / IMXRT_ARM_CLOCK_DIVIDER + * IMXRT_ARM_CLOCK_DIVIDER = 1 + * 600Mhz = 600Mhz / 1 + * + * PRE_PERIPH_CLK_SEL = PRE_PERIPH_CLK_SEL_PLL1 + * PERIPH_CLK_SEL = 1 (0 select PERIPH_CLK2_PODF, + * 1 select PRE_PERIPH_CLK_SEL_PLL1) + * PERIPH_CLK = 600Mhz + * + * IPG_CLOCK_ROOT = AHB_CLOCK_ROOT / IMXRT_IPG_PODF_DIVIDER + * IMXRT_IPG_PODF_DIVIDER = 4 + * 150Mhz = 600Mhz / 4 + * + * PERCLK_CLOCK_ROOT = IPG_CLOCK_ROOT / + * IMXRT_PERCLK_PODF_DIVIDER + * IMXRT_PERCLK_PODF_DIVIDER = 9 + * 16.6Mhz = 150Mhz / 9 + * + * SEMC_CLK_ROOT = 600Mhz / IMXRT_SEMC_PODF_DIVIDER + * (labeled AIX_PODF in 18.2) + * IMXRT_SEMC_PODF_DIVIDER = 8 + * 75Mhz = 600Mhz / 8 + * + * Set Sys PLL (PLL2) to fOut = (24Mhz * (20+(2*(DIV_SELECT))) + * 528Mhz = (24Mhz * (20+(2*(1))) + * + * Set USB1 PLL (PLL3) to fOut = (24Mhz * 20) + * 480Mhz = (24Mhz * 20) + * + * Set LPSPI PLL3 PFD0 to fOut = (480Mhz / 12 * 18) + * 720Mhz = (480Mhz / 12 * 18) + * 90Mhz = (720Mhz / LSPI_PODF_DIVIDER) + * + * Set LPI2C PLL3 / 8 to fOut = (480Mhz / 8) + * 60Mhz = (480Mhz / 8) + * 12Mhz = (60Mhz / LSPI_PODF_DIVIDER) + * + * These clock frequencies can be verified via the CCM_CLKO1 pin and sending + * the appropriate clock to it with something like; + * + * putreg32( | CCM_CCOSR_CLKO1_EN , IMXRT_CCM_CCOSR); + * imxrt_config_gpio(GPIO_CCM_CLKO1); + */ + +#define BOARD_XTAL_FREQUENCY 24000000 +#define IMXRT_PRE_PERIPH_CLK_SEL CCM_CBCMR_PRE_PERIPH_CLK_SEL_PLL1 +#define IMXRT_PERIPH_CLK_SEL CCM_CBCDR_PERIPH_CLK_SEL_PRE_PERIPH +#define IMXRT_ARM_PLL_DIV_SELECT 100 +#define IMXRT_ARM_PODF_DIVIDER 2 +#define IMXRT_AHB_PODF_DIVIDER 1 +#define IMXRT_IPG_PODF_DIVIDER 4 +#define IMXRT_PERCLK_CLK_SEL CCM_CSCMR1_PERCLK_CLK_SEL_IPG_CLK_ROOT +#define IMXRT_PERCLK_PODF_DIVIDER 9 +#define IMXRT_SEMC_PODF_DIVIDER 8 +#define IMXRT_LPSPI_CLK_SELECT CCM_CBCMR_LPSPI_CLK_SEL_PLL3_PFD0 +#define IMXRT_LSPI_PODF_DIVIDER 8 + +#define IMXRT_LPSPI_CLK_SELECT CCM_CBCMR_LPSPI_CLK_SEL_PLL3_PFD0 +#define IMXRT_LSPI_PODF_DIVIDER 8 + +#define IMXRT_LPI2C_CLK_SELECT CCM_CSCDR2_LPI2C_CLK_SEL_PLL3_60M +#define IMXRT_LSI2C_PODF_DIVIDER 5 + +#define IMXRT_USDHC1_CLK_SELECT CCM_CSCMR1_USDHC1_CLK_SEL_PLL2_PFD0 +#define IMXRT_USDHC1_PODF_DIVIDER 2 + +#define IMXRT_SYS_PLL_SELECT CCM_ANALOG_PLL_SYS_DIV_SELECT_22 + +#define IMXRT_USB1_PLL_DIV_SELECT CCM_ANALOG_PLL_USB1_DIV_SELECT_20 + +#define BOARD_CPU_FREQUENCY \ + (BOARD_XTAL_FREQUENCY * (IMXRT_ARM_PLL_DIV_SELECT / 2)) / IMXRT_ARM_PODF_DIVIDER + +/* Define this to enable tracing */ + +#if 0 +# define IMXRT_TRACE_PODF_DIVIDER 1 +# define IMXRT_TRACE_CLK_SELECT CCM_CBCMR_TRACE_CLK_SEL_PLL2_PFD0 +#endif + +/* LED definitions **********************************************************/ + +/* There are four LED status indicators located on the EVK Board. + * The functions of these LEDs include: + * + * - Main Power Supply(D3) + * Green: DC 5V main supply is normal. + * Red: J2 input voltage is over 5.6V. + * Off: The board is not powered. + * - Reset RED LED(D15) + * - OpenSDA LED(D16) + * - USER LED(D18) + * + * Only a single LED, D18, is under software control. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_USERLED 0 +#define BOARD_NLEDS 1 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_USERLED_BIT (1 << BOARD_USERLED) + +/* This LED is not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/imxrt_autoleds.c. The LED is used to encode + * OS-related events as follows: + * + * -------------------- ----------------------------- ------ + * SYMBOL Meaning LED + * -------------------- ----------------------------- ------ + */ + +#define LED_STARTED 0 /* NuttX has been started OFF */ +#define LED_HEAPALLOCATE 0 /* Heap has been allocated OFF */ +#define LED_IRQSENABLED 0 /* Interrupts enabled OFF */ +#define LED_STACKCREATED 1 /* Idle stack created ON */ +#define LED_INIRQ 2 /* In an interrupt N/C */ +#define LED_SIGNAL 2 /* In a signal handler N/C */ +#define LED_ASSERTION 2 /* An assertion failed N/C */ +#define LED_PANIC 3 /* The system has crashed FLASH */ +#undef LED_IDLE /* Not used */ + +/* Thus if the LED is statically on, NuttX has successfully booted and is, + * apparently, running normally. If the LED is flashing at approximately + * 2Hz, then a fatal error has been detected and the system has halted. + */ + +/* Button definitions *******************************************************/ + +/* The IMXRT board has one external user button + * + * 1. SW8 (IRQ88) GPIO5-00 + */ + +#define BUTTON_SW8 0 + +#define BUTTON_SW8_BIT (1 << BUTTON_SW8) + +/* SDIO *********************************************************************/ + +/* Pin drive characteristics - drive strength in particular may need tuning + * for specific boards, but has been checked by scope on the EVKB to make + * sure shapes are square with minimal ringing. + */ + +#define PIN_USDHC1_D0 (GPIO_USDHC1_DATA0 | IOMUX_USDHC1_DATAX_DEFAULT) +#define PIN_USDHC1_D1 (GPIO_USDHC1_DATA1 | IOMUX_USDHC1_DATAX_DEFAULT) +#define PIN_USDHC1_D2 (GPIO_USDHC1_DATA2 | IOMUX_USDHC1_DATAX_DEFAULT) +#define PIN_USDHC1_D3 (GPIO_USDHC1_DATA3 | IOMUX_USDHC1_DATAX_DEFAULT) +#define PIN_USDHC1_DCLK (GPIO_USDHC1_CLK | IOMUX_USDHC1_CLK_DEFAULT) +#define PIN_USDHC1_CMD (GPIO_USDHC1_CMD | IOMUX_USDHC1_CMD_DEFAULT) +#define PIN_USDHC1_CD (GPIO_USDHC1_CD_2 | IOMUX_USDHC1_CLK_DEFAULT) + +/* 386 KHz for initial inquiry stuff */ + +#define BOARD_USDHC_IDMODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV256 +#define BOARD_USDHC_IDMODE_DIVISOR USDHC_SYSCTL_DVS_DIV(2) + +/* 24.8MHz for other modes */ + +#define BOARD_USDHC_MMCMODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV8 +#define BOARD_USDHC_MMCMODE_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + +#define BOARD_USDHC_SD1MODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV8 +#define BOARD_USDHC_SD1MODE_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + +#define BOARD_USDHC_SD4MODE_PRESCALER USDHC_SYSCTL_SDCLKFS_DIV8 +#define BOARD_USDHC_SD4MODE_DIVISOR USDHC_SYSCTL_DVS_DIV(1) + +/* LCD **********************************************************************/ + +#ifdef CONFIG_IMXRT_LCD +/* LCD controller */ + +# define GPIO_LCD_DATA23 (GPIO_LCD_DATA23_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA22 (GPIO_LCD_DATA22_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA21 (GPIO_LCD_DATA21_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA20 (GPIO_LCD_DATA20_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA19 (GPIO_LCD_DATA19_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA18 (GPIO_LCD_DATA18_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA17 (GPIO_LCD_DATA17_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA16 (GPIO_LCD_DATA16_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA15 (GPIO_LCD_DATA15_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA14 (GPIO_LCD_DATA14_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA13 (GPIO_LCD_DATA13_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA12 (GPIO_LCD_DATA12_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA11 (GPIO_LCD_DATA11_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA10 (GPIO_LCD_DATA10_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA09 (GPIO_LCD_DATA09_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA08 (GPIO_LCD_DATA08_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA07 (GPIO_LCD_DATA07_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA06 (GPIO_LCD_DATA06_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA05 (GPIO_LCD_DATA05_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA04 (GPIO_LCD_DATA04_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA03 (GPIO_LCD_DATA03_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA02 (GPIO_LCD_DATA02_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA01 (GPIO_LCD_DATA01_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_DATA00 (GPIO_LCD_DATA00_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_ENABLE (GPIO_LCD_ENABLE_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_HSYNC (GPIO_LCD_HSYNC_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_VSYNC (GPIO_LCD_VSYNC_1 | IOMUX_LCD_DEFAULT) +# define GPIO_LCD_CLK (GPIO_LCD_CLK_1 | IOMUX_LCD_DEFAULT) +#endif + +/* ETH Disambiguation *******************************************************/ + +#define GPIO_ENET_TX_DATA00 (GPIO_ENET_TX_DATA00_1| \ + IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_07 */ +#define GPIO_ENET_TX_DATA01 (GPIO_ENET_TX_DATA01_1| \ + IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_08 */ +#define GPIO_ENET_RX_DATA00 (GPIO_ENET_RX_DATA00_1| \ + IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_04 */ +#define GPIO_ENET_RX_DATA01 (GPIO_ENET_RX_DATA01_1| \ + IOMUX_ENET_DATA_DEFAULT) /* GPIO_B1_05 */ +#define GPIO_ENET_MDIO (GPIO_ENET_MDIO_3|IOMUX_ENET_MDIO_DEFAULT) /* GPIO_EMC_41 */ +#define GPIO_ENET_MDC (GPIO_ENET_MDC_3|IOMUX_ENET_MDC_DEFAULT) /* GPIO_EMC_40 */ +#define GPIO_ENET_RX_EN (GPIO_ENET_RX_EN_1|IOMUX_ENET_EN_DEFAULT) /* GPIO_B1_06 */ +#define GPIO_ENET_RX_ER (GPIO_ENET_RX_ER_1|IOMUX_ENET_RXERR_DEFAULT) /* GPIO_B1_11 */ +#define GPIO_ENET_TX_CLK (GPIO_ENET_REF_CLK_2|\ + IOMUX_ENET_TX_CLK_DEFAULT) /* GPIO_B1_10 */ +#define GPIO_ENET_TX_EN (GPIO_ENET_TX_EN_1|IOMUX_ENET_EN_DEFAULT) /* GPIO_B1_09 */ + +/* PIO Disambiguation *******************************************************/ + +/* LPUARTs + * + * Virtual console port provided by OpenSDA on UART1 and + * Arduino RS-232 Shield on UART3. + * + */ + +#define GPIO_LPUART1_RX (GPIO_LPUART1_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_13 */ +#define GPIO_LPUART1_TX (GPIO_LPUART1_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_12 */ +#define GPIO_LPUART3_RX (GPIO_LPUART3_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_07 */ +#define GPIO_LPUART3_TX (GPIO_LPUART3_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_06 */ + +/* LPI2Cs + * + * Arduino Connector LPI2C1 and audio/gyro IO on LPI2C3. + */ + +#define GPIO_LPI2C1_SDA (GPIO_LPI2C1_SDA_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_01 */ +#define GPIO_LPI2C1_SCL (GPIO_LPI2C1_SCL_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_00 */ +#define GPIO_LPI2C3_SDA (GPIO_LPI2C3_SDA_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_01 */ +#define GPIO_LPI2C3_SCL (GPIO_LPI2C3_SCL_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_00 */ + +/* LPSPI + * + * Arduino Connector + * + * J24 D09 GPIO_AD_B0_02 LPSPI3_SDI + * J24 D14 GPIO_AD_B0_01 LPSPI3_SDO + * J24 D15 GPIO_AD_B0_00 LPSPI3_SCK + */ + +#define GPIO_LPSPI3_SCK (GPIO_LPSPI3_SCK_2|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B0_00 */ +#define GPIO_LPSPI3_MISO (GPIO_LPSPI3_SDI_2|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B0_02 */ +#define GPIO_LPSPI3_MOSI (GPIO_LPSPI3_SDO_2|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B0_01 */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile new file mode 100644 index 000000000..8315d342c --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile @@ -0,0 +1,103 @@ +############################################################################ +# boards/arm/imxrt/imxrt1052-ok/kernel/Makefile +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +# The entry point name (if none is provided in the .config file) + +CONFIG_USER_ENTRYPOINT ?= user_start +ENTRYPT = $(patsubst "%",%,$(CONFIG_USER_ENTRYPOINT)) + +# Get the paths to the libraries and the links script path in format that +# is appropriate for the host OS + +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + # Windows-native toolchains + USER_LIBPATHS = ${shell for path in $(USERLIBS); do dir=`dirname $(TOPDIR)$(DELIM)$$path`;echo "-L\"`cygpath -w $$dir`\"";done} + USER_LDSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)memory.ld}" + USER_LDSCRIPT += -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)user-space.ld}" + USER_HEXFILE += "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx_user.hex}" + USER_SRECFILE += "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx_user.srec}" + USER_BINFILE += "${shell cygpath -w $(TOPDIR)$(DELIM)nuttx_user.bin}" +else + # Linux/Cygwin-native toolchain + USER_LIBPATHS = $(addprefix -L$(TOPDIR)$(DELIM),$(dir $(USERLIBS))) + USER_LDSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)memory.ld + USER_LDSCRIPT += -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)user-space.ld + USER_HEXFILE += "$(TOPDIR)$(DELIM)nuttx_user.hex" + USER_SRECFILE += "$(TOPDIR)$(DELIM)nuttx_user.srec" + USER_BINFILE += "$(TOPDIR)$(DELIM)nuttx_user.bin" +endif + +USER_LDFLAGS = --undefined=$(ENTRYPT) --entry=$(ENTRYPT) $(USER_LDSCRIPT) +USER_LDLIBS = $(patsubst lib%,-l%,$(basename $(notdir $(USERLIBS)))) +USER_LIBGCC = "${shell "$(CC)" $(ARCHCPUFLAGS) -print-libgcc-file-name}" + +# Source files + +CSRCS = imxrt_userspace.c +COBJS = $(CSRCS:.c=$(OBJEXT)) +OBJS = $(COBJS) + +# Targets: + +all: $(TOPDIR)$(DELIM)nuttx_user.elf $(TOPDIR)$(DELIM)User.map +.PHONY: nuttx_user.elf depend clean distclean + +$(COBJS): %$(OBJEXT): %.c + $(call COMPILE, $<, $@) + +# Create the nuttx_user.elf file containing all of the user-mode code + +nuttx_user.elf: $(OBJS) + $(Q) $(LD) -o $@ $(USER_LDFLAGS) $(USER_LIBPATHS) $(OBJS) --start-group $(USER_LDLIBS) --end-group $(USER_LIBGCC) + +$(TOPDIR)$(DELIM)nuttx_user.elf: nuttx_user.elf + @echo "LD: nuttx_user.elf" + $(Q) cp -a nuttx_user.elf $(TOPDIR)$(DELIM)nuttx_user.elf +ifeq ($(CONFIG_INTELHEX_BINARY),y) + @echo "CP: nuttx_user.hex" + $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex nuttx_user.elf $(USER_HEXFILE) +endif +ifeq ($(CONFIG_MOTOROLA_SREC),y) + @echo "CP: nuttx_user.srec" + $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O srec nuttx_user.elf $(USER_SRECFILE) +endif +ifeq ($(CONFIG_RAW_BINARY),y) + @echo "CP: nuttx_user.bin" + $(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary nuttx_user.elf $(USER_BINFILE) +endif + +$(TOPDIR)$(DELIM)User.map: nuttx_user.elf + @echo "MK: User.map" + $(Q) $(NM) nuttx_user.elf >$(TOPDIR)$(DELIM)User.map + $(Q) $(CROSSDEV)size nuttx_user.elf + +.depend: + +depend: .depend + +clean: + $(call DELFILE, nuttx_user.elf) + $(call DELFILE, "$(TOPDIR)$(DELIM)nuttx_user.*") + $(call DELFILE, "$(TOPDIR)$(DELIM)User.map") + $(call CLEAN) + +distclean: clean diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c new file mode 100644 index 000000000..a30557c6a --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/kernel/imxrt_userspace.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include + +#if defined(CONFIG_BUILD_PROTECTED) && !defined(__KERNEL__) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +#ifndef CONFIG_NUTTX_USERSPACE +# error "CONFIG_NUTTX_USERSPACE not defined" +#endif + +#if CONFIG_NUTTX_USERSPACE != 0x60200000 +# error "CONFIG_NUTTX_USERSPACE must be 0x60200000 to match user-space.ld" +#endif + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* These 'addresses' of these values are setup by the linker script. + * They are not actual uint32_t storage locations! + * They are only used meaningfully in the following way: + * + * - The linker script defines, for example, the symbol_sdata. + * - The declareion extern uint32_t _sdata; makes C happy. C will believe + * that the value _sdata is the address of a uint32_t variable _data (it + * is not!). + * - We can recoved the linker value then by simply taking the address of + * of _data. like: uint32_t *pdata = &_sdata; + */ + +extern uint32_t _stext; /* Start of .text */ +extern uint32_t _etext; /* End_1 of .text + .rodata */ +extern const uint32_t _eronly; /* End+1 of read only section (.text + .rodata) */ +extern uint32_t _sdata; /* Start of .data */ +extern uint32_t _edata; /* End+1 of .data */ +extern uint32_t _sbss; /* Start of .bss */ +extern uint32_t _ebss; /* End+1 of .bss */ + +/* This is the user space entry point */ + +int CONFIG_USER_ENTRYPOINT(int argc, char *argv[]); + +const struct userspace_s userspace locate_data(".userspace") = +{ + /* General memory map */ + + .us_entrypoint = (main_t)CONFIG_USER_ENTRYPOINT, + .us_textstart = (uintptr_t)&_stext, + .us_textend = (uintptr_t)&_etext, + .us_datasource = (uintptr_t)&_eronly, + .us_datastart = (uintptr_t)&_sdata, + .us_dataend = (uintptr_t)&_edata, + .us_bssstart = (uintptr_t)&_sbss, + .us_bssend = (uintptr_t)&_ebss, + + /* Memory manager heap structure */ + + .us_heap = &g_mmheap, + + /* Task/thread startup routines */ + + .task_startup = nxtask_startup, + + /* Signal handler trampoline */ + + .signal_handler = up_signal_handler, + + /* User-space work queue support (declared in include/nuttx/wqueue.h) */ + +#ifdef CONFIG_LIBC_USRWORK + .work_usrstart = work_usrstart, +#endif +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +#endif /* CONFIG_BUILD_PROTECTED && !__KERNEL__ */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs new file mode 100644 index 000000000..431e865cd --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs @@ -0,0 +1,75 @@ +############################################################################ +# boards/arm/imxrt/imxrt1052-ok/scripts/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv7-m/Toolchain.defs + +ifeq ($(CONFIG_ARMV7M_DTCM),y) + LDSCRIPT = flash-dtcm.ld +else + LDSCRIPT = flash-ocram.ld +endif + +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}" +else + ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) +endif + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + ARCHOPTIMIZATION = -g +endif + +ifneq ($(CONFIG_DEBUG_NOOPT),y) + ARCHOPTIMIZATION += $(MAXOPTIMIZATION) +endif + +ARCHCFLAGS = -fno-builtin +ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti +ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -fno-strict-aliasing +ARCHWARNINGSXX = -Wall -Wshadow -Wundef +ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 + +CFLAGS := $(APPPATHS) $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 + +# Loadable module definitions + +CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs + +LDMODULEFLAGS = -r -e module_initialize +ifeq ($(CONFIG_CYGWIN_WINTOOL),y) + LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libs/libc/modlib/gnu-elf.ld}" +else + LDMODULEFLAGS += -T $(TOPDIR)/libs/libc/modlib/gnu-elf.ld +endif + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + LDFLAGS += -g +endif diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld new file mode 100644 index 000000000..4cd8da676 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld @@ -0,0 +1,140 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/scripts/flash-ocram.ld + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* Specify the memory areas */ + +MEMORY +{ + flash (rx) : ORIGIN = 0x60000000, LENGTH = 0x04000000 + sram (rwx) : ORIGIN = 0x20200000, LENGTH = 0x00080000 + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 0x00020000 + dtcm (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +EXTERN(g_flash_config) +EXTERN(g_image_vector_table) +EXTERN(g_boot_data) +EXTERN(g_dcd_data) + +ENTRY(_stext) + +SECTIONS +{ + /* Image Vector Table and Boot Data for booting from external flash */ + + .boot_hdr : ALIGN(4) + { + FILL(0xff) + __boot_hdr_start__ = ABSOLUTE(.) ; + KEEP(*(.boot_hdr.conf)) + . = 0x1000 ; + KEEP(*(.boot_hdr.ivt)) + . = 0x1020 ; + KEEP(*(.boot_hdr.boot_data)) + . = 0x1030 ; + KEEP(*(.boot_hdr.dcd_data)) + __boot_hdr_end__ = ABSOLUTE(.) ; + . = 0x2000 ; + } >flash + + .text : + { + _stext = ABSOLUTE(.); + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > flash + + .init_section : + { + _sinit = ABSOLUTE(.); + *(.init_array .init_array.*) + _einit = ABSOLUTE(.); + } > flash + + .ARM.extab : + { + *(.ARM.extab*) + } > flash + + .ARM.exidx : + { + __exidx_start = ABSOLUTE(.); + *(.ARM.exidx*) + __exidx_end = ABSOLUTE(.); + } > flash + + _eronly = ABSOLUTE(.); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > sram AT > flash + + .ramfunc ALIGN(4): + { + _sramfuncs = ABSOLUTE(.); + *(.ramfunc .ramfunc.*) + _eramfuncs = ABSOLUTE(.); + } > sram AT > flash + + _framfuncs = LOADADDR(.ramfunc); + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld new file mode 100644 index 000000000..b50660936 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld @@ -0,0 +1,104 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/scripts/kernel-space.ld + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* NOTE: This depends on the memory.ld script having been included prior to + * this script. + */ + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +SECTIONS +{ + .text : + { + _stext = ABSOLUTE(.); + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > kflash + + .init_section : + { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > kflash + + .ARM.extab : + { + *(.ARM.extab*) + } > kflash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : + { + *(.ARM.exidx*) + } > kflash + + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > kocram AT > kflash + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > kocram + + /* Stabs debugging sections */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld new file mode 100644 index 000000000..6486acda5 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld @@ -0,0 +1,67 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/scripts/memory.ld + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* The i.MXRT1050-EVK has 64Mb of Hyper FLASH beginning at address, + * 0x0060:0000, 512Kb of DTCM RAM beginning at 0x2000:0000, and 512Kb OCRAM + * beginning at 0x2020:0000. Neither DTCM or SDRAM are used in this + * configuration. + * + * The user and kernel space partitions will be spanned with a single + * region of size 2**n bytes. As a consequence, as the partitions increase + * in size, the alignment requirement also increases. The sizes below give + * the largest possible user address spaces (but leave far too much for the + * OS). + * + * The solution to this wasted memory is to (1) use more than one region to + * span the user spaces, or (2) poke holes in a larger region (via sub- + * regions) to trim it to fit better. + * + * A detailed memory map for the 512KB SRAM region is as follows: + * + * 0x2020 0000: Kernel .data region. Typical size: 0.1KB + * ------ ---- Kernel .bss region. Typical size: 1.8KB + * 0x2020 0800: Kernel IDLE thread stack (approximate). Size is + * determined by CONFIG_IDLETHREAD_STACKSIZE and + * adjustments for alignment. Typical is 1KB. + * ------ ---- Padded to 4KB + * 0x2040 0000: User .data region. Size is variable. + * ------- ---- User .bss region Size is variable. + * 0x2042 0000: Beginning of kernel heap. Size determined by + * CONFIG_MM_KERNEL_HEAPSIZE. + * ------ ---- Beginning of user heap. Can vary with other settings. + * 0x2080 0000: End+1 of mappable OCRAM + */ + +/* Specify the memory areas */ + +MEMORY +{ + /* 64Mb of HyperFLASH */ + + kflash (rx) : ORIGIN = 0x60000000, LENGTH = 1M + uflash (rx) : ORIGIN = 0x60200000, LENGTH = 1M + flash (rx) : ORIGIN = 0x60400000, LENGTH = 62M + + /* 512Kb of OCRAM */ + + dtcm (rwx) : ORIGIN = 0x20000000, LENGTH = 512K + kocram (rwx) : ORIGIN = 0x20200000, LENGTH = 256K + uocram (rwx) : ORIGIN = 0x20240000, LENGTH = 256K +} diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld new file mode 100644 index 000000000..5eb3f32dd --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld @@ -0,0 +1,118 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/scripts/user-space.ld + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* NOTE: This depends on the memory.ld script having been included prior to + * this script. + */ + +/* Make sure that the critical memory management functions are in user-space. + * the user heap memory manager will reside in user-space but be usable both + * by kernel- and user-space code + */ + +EXTERN(umm_initialize) +EXTERN(umm_addregion) + +EXTERN(malloc) +EXTERN(realloc) +EXTERN(zalloc) +EXTERN(free) + +OUTPUT_ARCH(arm) +SECTIONS +{ + .userspace : + { + *(.userspace) + } > uflash + + .text : + { + _stext = ABSOLUTE(.); + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > uflash + + .init_section : + { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > uflash + + .ARM.extab : + { + *(.ARM.extab*) + } > uflash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : + { + *(.ARM.exidx*) + } > uflash + + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > uocram AT > uflash + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > uocram + + /* Stabs debugging sections */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile new file mode 100644 index 000000000..b3d3dcf44 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile @@ -0,0 +1,69 @@ +############################################################################ +# boards/arm/imxrt/imxrt1052-ok/src/Makefile +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS = imxrt_boot.c imxrt_flexspi_nor_boot.c imxrt_flexspi_nor_flash.c + +ifeq ($(CONFIG_IMXRT_SDRAMC),y) +CSRCS += imxrt_sdram.c +endif + +ifeq ($(CONFIG_BOARDCTL),y) +CSRCS += imxrt_appinit.c imxrt_bringup.c +else ifeq ($(CONFIG_BOARD_LATE_INITIALIZE),y) +CSRCS += imxrt_bringup.c +endif + +ifeq ($(CONFIG_ARCH_LEDS),y) +CSRCS += imxrt_autoleds.c +else +CSRCS += imxrt_userleds.c +endif + +ifeq ($(CONFIG_ARCH_BUTTONS),y) +CSRCS += imxrt_buttons.c +endif + +ifeq ($(CONFIG_IMXRT_ENET),y) +CSRCS += imxrt_ethernet.c +endif + +ifeq ($(CONFIG_IMXRT_LPSPI),y) +CSRCS += imxrt_spi.c +endif + +ifeq ($(CONFIG_IMXRT_LCD),y) +CSRCS += imxrt_lcd.c +endif + +ifeq ($(CONFIG_MMCSD_SPI),y) +CSRCS += imxrt_mmcsd_spi.c +endif + +ifeq ($(CONFIG_DEV_GPIO),y) +CSRCS += imxrt_gpio.c +endif + +ifeq ($(CONFIG_IMXRT1052_OK_SDRAM),y) +CSRCS += imxrt_sdram_ini_dcd.c +endif + +include $(TOPDIR)/boards/Board.mk diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h new file mode 100644 index 000000000..8407404e2 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h @@ -0,0 +1,193 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt1052-ok.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H +#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include "imxrt_gpio.h" +#include "imxrt_iomuxc.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* LEDs */ + +#define GPIO_LED (GPIO_OUTPUT | IOMUX_LED_DEFAULT | \ + GPIO_OUTPUT_ZERO | GPIO_PORT1 | GPIO_PIN9) /* AD_BO_09 */ + +/* Buttons ******************************************************************/ + +#define GPIO_SW8 (GPIO_INTERRUPT | GPIO_INT_FALLINGEDGE | \ + IOMUX_SW_DEFAULT | \ + GPIO_PORT5 | GPIO_PIN0 | ) /* WAKEUP */ + +/* Test Pins ****************************************************************/ + +#define BOARD_NGPIOIN 0 /* Amount of GPIO Input pins */ +#define BOARD_NGPIOOUT 4 /* Amount of GPIO Output pins */ +#define BOARD_NGPIOINT 0 /* Amount of GPIO Input w/ Interruption pins */ + +#define GPIO_GOUT1 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ + GPIO_PORT1 | GPIO_PIN19) + +#define GPIO_GOUT2 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ + GPIO_PIN18 | GPIO_PORT1) + +#define GPIO_GOUT3 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ + GPIO_PIN10 | GPIO_PORT1) + +#define GPIO_GOUT4 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ + GPIO_PIN9 | GPIO_PORT1) + +/* Backlight */ + +#define GPIO_LCD_BL (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | GPIO_PORT2 | \ + GPIO_PIN31 | IOMUX_LCD_BL_DEFAULT) + +/* Ethernet */ + +#define GPIO_ENET_INT (IOMUX_ENET_INT_DEFAULT | \ + GPIO_PORT1 | GPIO_PIN10) /* AD_B0_10 */ +#define GPIO_ENET_IRQ IMXRT_IRQ_GPIO1_10 +#define GPIO_ENET_RST (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | \ + GPIO_PORT1 | GPIO_PIN9 | IOMUX_ENET_RST_DEFAULT) + +#ifdef CONFIG_ETH0_PHY_KSZ8081 +#ifdef GPIO_LED +#warning LED interferes with ETH reset unless R323 is removed. +#endif +#endif + +/* LPSPI CS: */ + +#define IOMUX_LPSPI3_CS (IOMUX_SLEW_FAST | IOMUX_DRIVE_50OHM | \ + IOMUX_SPEED_MEDIUM | IOMUX_PULL_UP_100K | \ + _IOMUX_PULL_ENABLE) +#define GPIO_LPSPI3_CS (GPIO_OUTPUT | GPIO_OUTPUT_ONE | \ + GPIO_PORT1 | GPIO_PIN3 | IOMUX_LPSPI3_CS) /* GPIO_AD_B0_03 */ + +/* LPSPI1 CS: GPIO_SD_B0_01 */ + +#define IOMUX_LPSPI1_CS (IOMUX_SLEW_FAST | IOMUX_DRIVE_50OHM | \ + IOMUX_SPEED_MEDIUM | IOMUX_PULL_UP_100K | \ + _IOMUX_PULL_ENABLE) +#define GPIO_LPSPI1_CS (GPIO_OUTPUT | GPIO_OUTPUT_ONE | \ + GPIO_PORT3 | GPIO_PIN13 | IOMUX_LPSPI1_CS) + +#define IOMUX_MMCSD_EN (IOMUX_SLEW_FAST | IOMUX_DRIVE_50OHM | \ + IOMUX_SPEED_MEDIUM | IOMUX_PULL_UP_100K | \ + _IOMUX_PULL_ENABLE) +#define GPIO_MMCSD_EN (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | \ + GPIO_PORT3 | GPIO_PIN2 | IOMUX_MMCSD_EN) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Functions Definitions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_bringup + * + * Description: + * Bring up board features + * + ****************************************************************************/ + +#if defined(CONFIG_BOARDCTL) || defined(CONFIG_BOARD_LATE_INITIALIZE) +int imxrt_bringup(void); +#endif + +/**************************************************************************** + * Name: imxrt_spidev_initialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the i.MXRT1050 EVK. + * + ****************************************************************************/ + +void imxrt_spidev_initialize(void); + +/**************************************************************************** + * Name: imxrt_mmcsd_spi_initialize + * + * Description: + * Initialize SPI-based SD card and card detect thread. + * + ****************************************************************************/ + +#ifdef CONFIG_MMCSD_SPI +int imxrt_mmcsd_spi_initialize(int minor); +#endif + +/**************************************************************************** + * Name: imxrt_autoled_initialize + * + * Description: + * Initialize NuttX-controlled LED logic + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_LEDS +void imxrt_autoled_initialize(void); +#endif + +#ifdef CONFIG_DEV_GPIO + +/**************************************************************************** + * Name: imxrt_gpio_initialize + * + * Description: + * Initialize GPIO drivers for use with /apps/examples/gpio + * + ****************************************************************************/ + +int imxrt_gpio_initialize(void); +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c new file mode 100644 index 000000000..bdd387ae4 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_appinit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#include "imxrt1052-ok.h" + +#ifdef CONFIG_BOARDCTL + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initialization logic and the + * matching application logic. The value could be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +int board_app_initialize(uintptr_t arg) +{ +#ifndef CONFIG_BOARD_LATE_INITIALIZE + /* Perform board initialization */ + + return imxrt_bringup(); +#else + return OK; +#endif +} + +#endif /* CONFIG_BOARDCTL */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c new file mode 100644 index 000000000..0b18c711f --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c @@ -0,0 +1,166 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_autoleds.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* There are four LED status indicators located on the EVK Board. The + * functions of these LEDs include: + * + * - Main Power Supply(D3) + * Green: DC 5V main supply is normal. + * Red: J2 input voltage is over 5.6V. + * Off: The board is not powered. + * - Reset RED LED(D15) + * - OpenSDA LED(D16) + * - USER LED(D18) + * + * Only a single LED, D18, is under software control. + * + * This LED is not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/imxrt_autoleds.c. The LED is used to encode + * OS-related events as follows: + * + * -------------------- ----------------------- ------ + * SYMBOL Meaning LED + * -------------------- ----------------------- ------ + * + * LED_STARTED 0 NuttX has been started OFF + * LED_HEAPALLOCATE 0 Heap has been allocated OFF + * LED_IRQSENABLED 0 Interrupts enabled OFF + * LED_STACKCREATED 1 Idle stack created ON + * LED_INIRQ 2 In an interrupt N/C + * LED_SIGNAL 2 In a signal handler N/C + * LED_ASSERTION 2 An assertion failed N/C + * LED_PANIC 3 The system has crashed FLASH + * LED_IDLE Not used + * + * Thus if the LED is statically on, NuttX has successfully booted and is, + * apparently, running normally. If the LED is flashing at approximately + * 2Hz, then a fatal error has been detected and the system has halted. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "imxrt_gpio.h" +#include "imxrt_iomuxc.h" +#include "imxrt1052-ok.h" + +#include + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_autoled_initialize + * + * Description: + * Initialize NuttX-controlled LED logic + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void imxrt_autoled_initialize(void) +{ + /* Configure LED GPIO for output */ + + imxrt_config_gpio(GPIO_LED); +} + +/**************************************************************************** + * Name: board_autoled_on + * + * Description: + * Turn on the "logical" LED state + * + * Input Parameters: + * led - Identifies the "logical" LED state (see definitions in + * include/board.h) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_on(int led) +{ + bool ledoff = false; + + switch (led) + { + case 0: /* LED Off */ + ledoff = true; + break; + + case 2: /* LED No change */ + return; + + case 1: /* LED On */ + case 3: /* LED On */ + break; + } + + imxrt_gpio_write(GPIO_LED, ledoff); /* Low illuminates */ +} + +/**************************************************************************** + * Name: board_autoled_off + * + * Description: + * Turn off the "logical" LED state + * + * Input Parameters: + * led - Identifies the "logical" LED state (see definitions in + * include/board.h) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_off(int led) +{ + switch (led) + { + case 0: /* LED Off */ + case 1: /* LED Off */ + case 3: /* LED Off */ + break; + + case 2: /* LED No change */ + return; + } + + imxrt_gpio_write(GPIO_LED, true); /* Low illuminates */ +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c new file mode 100644 index 000000000..813931cdf --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_boot.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "imxrt_start.h" +#include "imxrt1052-ok.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_boardinitialize + * + * Description: + * All i.MX RT architectures must provide the following entry point. This + * entry point is called early in the initialization -- after clocking and + * memory have been configured but before caches have been enabled and + * before any devices have been initialized. + * + ****************************************************************************/ + +void imxrt_boardinitialize(void) +{ + /* Configure on-board LEDs if LED support has been selected. */ + +#ifdef CONFIG_ARCH_LEDS + imxrt_autoled_initialize(); +#endif +} + +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional + * initialization call will be performed in the boot-up sequence to a + * function called board_late_initialize(). board_late_initialize() will be + * called immediately after up_intitialize() is called and just before the + * initial application is started. This additional initialization phase + * may be used, for example, to initialize board-specific device drivers. + * + ****************************************************************************/ + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void) +{ + /* Perform board initialization */ + + imxrt_bringup(); +} +#endif /* CONFIG_BOARD_LATE_INITIALIZE */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c new file mode 100644 index 000000000..85f05794d --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c @@ -0,0 +1,190 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_bringup.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_IMXRT_USDHC +# include "imxrt_usdhc.h" +#endif + +#include "imxrt1052-ok.h" + +#include /* Must always be included last */ + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Checking needed by MMC/SDCard */ + +#ifdef CONFIG_NSH_MMCSDMINOR +# define MMCSD_MINOR CONFIG_NSH_MMCSDMINOR +#else +# define MMCSD_MINOR 0 +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C) +static void imxrt_i2c_register(int bus) +{ + FAR struct i2c_master_s *i2c; + int ret; + + i2c = imxrt_i2cbus_initialize(bus); + if (i2c == NULL) + { + serr("ERROR: Failed to get I2C%d interface\n", bus); + } + else + { + ret = i2c_register(i2c, bus); + if (ret < 0) + { + serr("ERROR: Failed to register I2C%d driver: %d\n", bus, ret); + imxrt_i2cbus_uninitialize(i2c); + } + } +} +#endif + +#ifdef CONFIG_IMXRT_USDHC +static int nsh_sdmmc_initialize(void) +{ + struct sdio_dev_s *sdmmc; + int ret = 0; + + /* Get an instance of the SDIO interface */ + + sdmmc = imxrt_usdhc_initialize(0); + if (!sdmmc) + { + syslog(LOG_ERR, "ERROR: Failed to initialize SD/MMC\n"); + } + else + { + /* Bind the SDIO interface to the MMC/SD driver */ + + ret = mmcsd_slotinitialize(0, sdmmc); + if (ret != OK) + { + syslog(LOG_ERR, + "ERROR: Failed to bind SDIO to the MMC/SD driver: %d\n", + ret); + } + } + + return OK; +} +#else +# define nsh_sdmmc_initialize() (OK) +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_bringup + * + * Description: + * Bring up board features + * + ****************************************************************************/ + +int imxrt_bringup(void) +{ + int ret; + + /* If we got here then perhaps not all initialization was successful, but + * at least enough succeeded to bring-up NSH with perhaps reduced + * capabilities. + */ + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = nx_mount(NULL, "/proc", "procfs", 0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret); + } +#endif + +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C1) + imxrt_i2c_register(1); +#endif + +#ifdef CONFIG_IMXRT_USDHC + /* Initialize SDHC-base MMC/SD card support */ + + nsh_sdmmc_initialize(); +#endif + +#ifdef CONFIG_MMCSD_SPI + /* Initialize SPI-based MMC/SD card support */ + + imxrt_spidev_initialize(); + + ret = imxrt_mmcsd_spi_initialize(MMCSD_MINOR); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize SD slot %d: %d\n", ret); + } +#endif + +#ifdef CONFIG_DEV_GPIO + ret = imxrt_gpio_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret); + return ret; + } +#endif + +#ifdef CONFIG_VIDEO_FB + /* Initialize and register the framebuffer driver */ + + ret = fb_register(0, 0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: fb_register() failed: %d\n", ret); + } +#endif + + UNUSED(ret); + return OK; +} diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c new file mode 100644 index 000000000..f6c3b2b30 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c @@ -0,0 +1,129 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_buttons.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include + +#include "arm_arch.h" + +#include "imxrt_config.h" +#include "imxrt_irq.h" +#include "imxrt_gpio.h" +#include "imxrt1052-ok.h" + +#ifdef CONFIG_ARCH_BUTTONS + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* The IMXRT has 1 user button (SW8)): + * + * 1. SW8 (IRQ88) GPIO5-00 + */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_button_initialize + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + ****************************************************************************/ + +uint32_t board_button_initialize(void) +{ + /* Configure the button as input */ + + imxrt_config_gpio(GPIO_SW8); + return 1; +} + +/**************************************************************************** + * Name: board_buttons + * + * Description: + * After board_button_initialize() has been called, board_buttons() may be + * called to collect the state of all buttons. board_buttons() returns an + * 8-bit bit set with each bit associated with a button. See the + * BUTTON_*_BIT definitions in board.h for the meaning of each bit. + * + ****************************************************************************/ + +uint8_t board_buttons(void) +{ + uint8_t ret = 0; + + if (!imxrt_gpio_read(GPIO_SW8)) + { + ret |= BUTTON_SW8_BIT; + } + + return ret; +} + +/**************************************************************************** + * Name: board_button_irq + * + * Description: + * board_button_irq() may be called to register an interrupt handler that + * will be called when a button is depressed or released. The ID value is + * a button enumeration value that uniquely identifies a button resource. + * See the BUTTON_* definitions in board.h for the meaning of enumeration + * value. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_IRQBUTTONS +int board_button_irq(int id, xcpt_t irqhandler) +{ + int ret = -EINVAL; + + /* The button has already been configured as an interrupting input (by + * board_button_initialize() above). + * + * Attach the new button handler. + */ + + ret = irq_attach(id, irqhandler, NULL); + + /* Then make sure that interrupts are enabled on the pin */ + + up_enable_irq(id); + return ret; +} +#endif +#endif /* CONFIG_ARCH_BUTTONS */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c new file mode 100644 index 000000000..958aa2414 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c @@ -0,0 +1,284 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_ethernet.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/* Force verbose debug on in this file only to support unit-level testing. */ + +#ifdef CONFIG_NETDEV_PHY_DEBUG +# undef CONFIG_DEBUG_INFO +# define CONFIG_DEBUG_INFO 1 +# undef CONFIG_DEBUG_NET +# define CONFIG_DEBUG_NET 1 +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include "imxrt_gpio.h" +#include "imxrt_enet.h" + +#include "imxrt1052-ok.h" + +#include + +#ifdef CONFIG_IMXRT_ENET + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define IMXRT_ENET_DEVNAME "eth0" + +/* Debug ********************************************************************/ + +/* Extra, in-depth debug output that is only available if + * CONFIG_NETDEV_PHY_DEBUG us defined. + */ + +#ifdef CONFIG_NETDEV_PHY_DEBUG +# define phyerr _err +# define phywarn _warn +# define phyinfo _info +#else +# define phyerr(x...) +# define phywarn(x...) +# define phyinfo(x...) +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_enet_phy_enable + ****************************************************************************/ + +#ifdef CONFIG_IMXRT_GPIO1_0_15_IRQ +static void imxrt_enet_phy_enable(bool enable) +{ + phyinfo("IRQ%d: enable=%d\n", GPIO_ENET_INT, enable); + + if (enable) + { + up_enable_irq(GPIO_ENET_IRQ); + } + else + { + up_disable_irq(GPIO_ENET_IRQ); + } +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: imxrt_phy_boardinitialize + * + * Description: + * Some boards require specialized initialization of the PHY before it can + * be used. + * This may include such things as configuring GPIOs, resetting the PHY, + * etc. + * If CONFIG_IMXRT_ENET_PHYINIT is defined in the configuration then the + * board specific logic must provide imxrt_phyinitialize(); + * The i.MX RT Ethernet driver will call this function one time before it + * first uses the PHY. + * + * Input Parameters: + * intf - Always zero for now. + * + * Returned Value: + * OK on success; Negated errno on failure. + * + ****************************************************************************/ + +int imxrt_phy_boardinitialize(int intf) +{ +#ifdef CONFIG_IMXRT_GPIO1_0_15_IRQ + /* Configure the PHY interrupt pin */ + + phyinfo("Configuring interrupt: %08x\n", GPIO_ENET_INT); + imxrt_config_gpio(GPIO_ENET_INT); +#endif + + /* Configure the PHY reset pin. + * + * The #RST uses inverted logic. The initial value of zero will put the + * PHY into the reset state. + */ +#ifdef GPIO_ENET_RST + /* On the EVK the RST pin is combined with LED, so sometimes can't be + * accessed. Only stress about it if we've got a definition. + */ + + phyinfo("Configuring reset: %08x\n", GPIO_ENET_RST); + imxrt_config_gpio(GPIO_ENET_RST); + + /* Take the PHY out of reset. */ + + imxrt_gpio_write(GPIO_ENET_RST, true); +#endif + return OK; +} + +/**************************************************************************** + * Name: arch_phy_irq + * + * Description: + * This function may be called to register an interrupt handler that will + * be called when a PHY interrupt occurs. This function both attaches + * the interrupt handler and enables the interrupt if 'handler' is non- + * NULL. If handler is NULL, then the interrupt is detached and disabled + * instead. + * + * The PHY interrupt is always disabled upon return. The caller must + * call back through the enable function point to control the state of + * the interrupt. + * + * This interrupt may or may not be available on a given platform depending + * on how the network hardware architecture is implemented. In a typical + * case, the PHY interrupt is provided to board-level logic as a GPIO + * interrupt (in which case this is a board-specific interface and really + * should be called board_phy_irq()); In other cases, the PHY interrupt + * may be cause by the chip's MAC logic (in which case arch_phy_irq()) is + * an appropriate name. Other other boards, there may be no PHY interrupts + * available at all. If client attachable PHY interrupts are available + * from the board or from the chip, then CONFIG_ARCH_PHY_INTERRUPT should + * be defined to indicate that fact. + * + * Typical usage: + * a. OS service logic (not application logic*) attaches to the PHY + * PHY interrupt and enables the PHY interrupt. + * b. When the PHY interrupt occurs: (1) the interrupt should be + * disabled and () work should be scheduled on the worker thread (or + * perhaps a dedicated application thread). + * c. That worker thread should use the SIOCGMIIPHY, SIOCGMIIREG, + * and SIOCSMIIREG ioctl calls** to communicate with the PHY, + * determine what network event took place (Link Up/Down?), and + * take the appropriate actions. + * d. It should then interact the PHY to clear any pending + * interrupts, then re-enable the PHY interrupt. + * + * * This is an OS internal interface and should not be used from + * application space. Rather applications should use the SIOCMIISIG + * ioctl to receive a signal when a PHY event occurs. + * ** This interrupt is really of no use if the Ethernet MAC driver + * does not support these ioctl calls. + * + * Input Parameters: + * intf - Identifies the network interface. For example "eth0". Only + * useful on platforms that support multiple Ethernet interfaces + * and, hence, multiple PHYs and PHY interrupts. + * handler - The client interrupt handler to be invoked when the PHY + * asserts an interrupt. Must reside in OS space, but can + * signal tasks in user space. A value of NULL can be passed + * in order to detach and disable the PHY interrupt. + * arg - The argument that will accompany the interrupt + * enable - A function pointer that be unused to enable or disable the + * PHY interrupt. + * + * Returned Value: + * Zero (OK) returned on success; a negated errno value is returned on + * failure. + * + ****************************************************************************/ + +#ifdef CONFIG_IMXRT_GPIO1_0_15_IRQ +int arch_phy_irq(FAR const char *intf, xcpt_t handler, void *arg, + phy_enable_t *enable) +{ + irqstate_t flags; + phy_enable_t enabler; + int irq; + + DEBUGASSERT(intf); + + ninfo("%s: handler=%p\n", intf, handler); + phyinfo("EMAC: devname=%s\n", IMXRT_ENET_DEVNAME); + + if (strcmp(intf, IMXRT_ENET_DEVNAME) == 0) + { + irq = GPIO_ENET_IRQ; + enabler = imxrt_enet_phy_enable; + } + else + { + nerr("ERROR: Unsupported interface: %s\n", intf); + return -EINVAL; + } + + /* Disable interrupts until we are done. This guarantees that the + * following operations are atomic. + */ + + flags = spin_lock_irqsave(NULL); + + /* Configure the interrupt */ + + if (handler) + { + /* The interrupt pin has already been configured as an interrupting + * input (by imxrt_phy_boardinitialize() above). + * + * Attach the new button handler. + */ + + phyinfo("Attach IRQ%d\n", irq); + irq_attach(irq, handler, arg); + } + else + { + phyinfo("Detach IRQ%d\n", irq); + irq_detach(irq); + enabler = NULL; + } + + /* Return with the interrupt disabled in either case */ + + up_disable_irq(GPIO_ENET_IRQ); + + /* Return the enabling function pointer */ + + if (enable) + { + *enable = enabler; + } + + /* Return the old handler (so that it can be restored) */ + + spin_unlock_irqrestore(NULL, flags); + return OK; +} +#endif /* CONFIG_IMXRT_GPIO1_0_15_IRQ */ + +#endif /* CONFIG_IMXRT_ENET */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c new file mode 100644 index 000000000..b727cf579 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c @@ -0,0 +1,55 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "imxrt_flexspi_nor_boot.h" + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +locate_data(".boot_hdr.ivt") +const struct ivt_s g_image_vector_table = +{ + IVT_HEADER, /* IVT Header */ + 0x60002000, /* Image Entry Function */ + IVT_RSVD, /* Reserved = 0 */ + (uint32_t)DCD_ADDRESS, /* Address where DCD information is stored */ + (uint32_t)BOOT_DATA_ADDRESS, /* Address where BOOT Data Structure is stored */ + (uint32_t)&g_image_vector_table, /* Pointer to IVT Self (absolute address */ + (uint32_t)CSF_ADDRESS, /* Address where CSF file is stored */ + IVT_RSVD /* Reserved = 0 */ +}; + +locate_data(".boot_hdr.boot_data") +const struct boot_data_s g_boot_data = +{ + FLASH_BASE, /* boot start location */ + (FLASH_END - FLASH_BASE), /* size */ + PLUGIN_FLAG, /* Plugin flag */ + 0xffffffff /* empty - extra data word */ +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h new file mode 100644 index 000000000..807ab9b82 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h @@ -0,0 +1,142 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H +#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* IVT Data */ + +#define IVT_MAJOR_VERSION 0x4 +#define IVT_MAJOR_VERSION_SHIFT 0x4 +#define IVT_MAJOR_VERSION_MASK 0xf +#define IVT_MINOR_VERSION 0x1 +#define IVT_MINOR_VERSION_SHIFT 0x0 +#define IVT_MINOR_VERSION_MASK 0xf + +#define IVT_VERSION(major, minor) \ + ((((major) & IVT_MAJOR_VERSION_MASK) << IVT_MAJOR_VERSION_SHIFT) | \ + (((minor) & IVT_MINOR_VERSION_MASK) << IVT_MINOR_VERSION_SHIFT)) + +#define IVT_TAG_HEADER (0xd1) /* Image Vector Table */ +#define IVT_SIZE 0x2000 +#define IVT_PAR IVT_VERSION(IVT_MAJOR_VERSION, IVT_MINOR_VERSION) + +#define IVT_HEADER (IVT_TAG_HEADER | (IVT_SIZE << 8) | (IVT_PAR << 24)) +#define IVT_RSVD (uint32_t)(0x00000000) + +/* DCD Data */ + +#define DCD_TAG_HEADER (0xd2) +#define DCD_TAG_HEADER_SHIFT (24) +#define DCD_VERSION (0x40) +#define DCD_ARRAY_SIZE 1 + +#define FLASH_BASE 0x60000000 +#define FLASH_END 0x7f7fffff +#define SCLK 1 + +#ifdef CONFIG_IMXRT1052_OK_SDRAM +# define DCD_ADDRESS &g_dcd_data +#else +# define DCD_ADDRESS 0 +#endif + +#define BOOT_DATA_ADDRESS &g_boot_data +#define CSF_ADDRESS 0 +#define PLUGIN_FLAG (uint32_t)0 + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* IVT Data */ + +struct ivt_s +{ + /* Header with tag #HAB_TAG_IVT, length and HAB version fields + * (see data) + */ + + uint32_t hdr; + + /* Absolute address of the first instruction to execute from the + * image + */ + + uint32_t entry; + + /* Reserved in this version of HAB: should be NULL. */ + + uint32_t reserved1; + + /* Absolute address of the image DCD: may be NULL. */ + + uint32_t dcd; + + /* Absolute address of the Boot Data: may be NULL, but not interpreted + * any further by HAB + */ + + uint32_t boot_data; + + /* Absolute address of the IVT. */ + + uint32_t self; + + /* Absolute address of the image CSF. */ + + uint32_t csf; + + /* Reserved in this version of HAB: should be zero. */ + + uint32_t reserved2; +}; + +/* Boot Data */ + +struct boot_data_s +{ + uint32_t start; /* boot start location */ + uint32_t size; /* size */ + uint32_t plugin; /* plugin flag - 1 if downloaded application is plugin */ + uint32_t placeholder; /* placeholder to make even 0x10 size */ +}; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +extern const struct boot_data_s g_boot_data; + +#ifdef CONFIG_IMXRT1052_OK_SDRAM +extern const uint8_t g_dcd_data[]; +#endif + +#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c new file mode 100644 index 000000000..0343860ab --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c @@ -0,0 +1,206 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "imxrt_flexspi_nor_flash.h" + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#if defined (CONFIG_IMXRT1052_OK_HYPER_FLASH) +locate_data(".boot_hdr.conf") +const struct flexspi_nor_config_s g_flash_config = +{ + .mem_config = + { + .tag = FLEXSPI_CFG_BLK_TAG, + .version = FLEXSPI_CFG_BLK_VERSION, + .read_sample_clksrc = FLASH_READ_SAMPLE_CLK_EXT_INPUT_FROM_DQSPAD, + .cs_hold_time = 3u, + .cs_setup_time = 3u, + .column_address_width = 3u, + + /* Enable DDR mode, Word addassable, + * Safe configuration, Differential clock + */ + + .controller_misc_option = + (1u << FLEXSPIMISC_OFFSET_DDR_MODE_EN) | + (1u << FLEXSPIMISC_OFFSET_WORD_ADDRESSABLE_EN) | + (1u << FLEXSPIMISC_OFFSET_SAFECONFIG_FREQ_EN) | + (1u << FLEXSPIMISC_OFFSET_DIFFCLKEN), + .sflash_pad_type = SERIAL_FLASH_8PADS, + .serial_clk_freq = FLEXSPI_SERIAL_CLKFREQ_133MHz, + .sflash_a1size = 64u * 1024u * 1024u, + .data_valid_time = + { + 16u, 16u + }, + .lookup_table = + { + /* Read LUTs */ + + FLEXSPI_LUT_SEQ(CMD_DDR, + FLEXSPI_8PAD, 0xa0, RADDR_DDR, FLEXSPI_8PAD, 0x18), + FLEXSPI_LUT_SEQ(CADDR_DDR, + FLEXSPI_8PAD, 0x10, DUMMY_DDR, FLEXSPI_8PAD, 0x06), + FLEXSPI_LUT_SEQ(READ_DDR, + FLEXSPI_8PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0), + }, + }, + .page_size = 512u, + .sector_size = 256u * 1024u, + .blocksize = 256u * 1024u, + .is_uniform_blocksize = 1, +}; + +#elif defined (CONFIG_IMXRT1052_OK_QSPI_FLASH) +locate_data(".boot_hdr.conf") +const struct flexspi_nor_config_s g_flash_config = +{ + .mem_config = + { + .tag = FLEXSPI_CFG_BLK_TAG, + .version = FLEXSPI_CFG_BLK_VERSION, + .read_sample_clksrc = FLASH_READ_SAMPLE_CLK_LOOPBACK_FROM_SCKPAD, + .cs_hold_time = 3u, + .cs_setup_time = 3u, + .column_address_width = 0u, + .device_type = FLEXSPI_DEVICE_TYPE_SERIAL_NOR, + .sflash_pad_type = SERIAL_FLASH_4PADS, + .serial_clk_freq = FLEXSPI_SERIAL_CLKFREQ_60MHz, + .sflash_a1size = 8u * 1024u * 1024u, + .data_valid_time = + { + 16u, 16u + }, + .lookup_table = + { + /* LUTs */ + + /* 0 Fast read Quad IO DTR Mode Operation in SPI Mode (normal read) */ + + FLEXSPI_LUT_SEQ(CMD_SDR, + FLEXSPI_1PAD, 0xed, RADDR_DDR, FLEXSPI_4PAD, 0x18), + FLEXSPI_LUT_SEQ(DUMMY_DDR, + FLEXSPI_4PAD, 0x0c, READ_DDR, FLEXSPI_4PAD, 0x08), + FLEXSPI_LUT_SEQ(STOP, + FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, + FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + + /* 1 Read Status */ + + FLEXSPI_LUT_SEQ(CMD_SDR, + FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x1), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + + /* 2 */ + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + /* 3 */ + + FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + + /* 4 */ + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + /* 5 Erase Sector */ + + FLEXSPI_LUT_SEQ(CMD_SDR, + FLEXSPI_1PAD, 0xd7, RADDR_SDR, FLEXSPI_1PAD, 0x18), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + + /* 6 */ + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + /* 7 */ + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + /* 8 */ + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + /* 9 Page Program */ + + FLEXSPI_LUT_SEQ(CMD_SDR, + FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18), + FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x8, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + + /* 10 */ + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + /* 11 Chip Erase */ + + FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xc7, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x0, STOP, FLEXSPI_1PAD, 0x0), + }, + }, + + .page_size = 256u, + .sector_size = 4u * 1024u, + .blocksize = 32u * 1024u, + .is_uniform_blocksize = false, +}; +#else +# error Boot Flash type not chosen! +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h new file mode 100644 index 000000000..087a7e3ca --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H +#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* FLEXSPI memory config block related definitions */ + +#define FLEXSPI_CFG_BLK_TAG (0x42464346ul) +#define FLEXSPI_CFG_BLK_VERSION (0x56010400ul) +#define FLEXSPI_CFG_BLK_SIZE (512) + +/* FLEXSPI Feature related definitions */ + +#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1 + +/* Lookup table related definitions */ + +#define CMD_INDEX_READ 0 +#define CMD_INDEX_READSTATUS 1 +#define CMD_INDEX_WRITEENABLE 2 +#define CMD_INDEX_WRITE 4 + +#define CMD_LUT_SEQ_IDX_READ 0 +#define CMD_LUT_SEQ_IDX_READSTATUS 1 +#define CMD_LUT_SEQ_IDX_WRITEENABLE 3 +#define CMD_LUT_SEQ_IDX_WRITE 9 + +#define CMD_SDR 0x01 +#define CMD_DDR 0x21 +#define RADDR_SDR 0x02 +#define RADDR_DDR 0x22 +#define CADDR_SDR 0x03 +#define CADDR_DDR 0x23 +#define MODE1_SDR 0x04 +#define MODE1_DDR 0x24 +#define MODE2_SDR 0x05 +#define MODE2_DDR 0x25 +#define MODE4_SDR 0x06 +#define MODE4_DDR 0x26 +#define MODE8_SDR 0x07 +#define MODE8_DDR 0x27 +#define WRITE_SDR 0x08 +#define WRITE_DDR 0x28 +#define READ_SDR 0x09 +#define READ_DDR 0x29 +#define LEARN_SDR 0x0a +#define LEARN_DDR 0x2a +#define DATSZ_SDR 0x0b +#define DATSZ_DDR 0x2b +#define DUMMY_SDR 0x0c +#define DUMMY_DDR 0x2c +#define DUMMY_RWDS_SDR 0x0d +#define DUMMY_RWDS_DDR 0x2d +#define JMP_ON_CS 0x1f +#define STOP 0 + +#define FLEXSPI_1PAD 0 +#define FLEXSPI_2PAD 1 +#define FLEXSPI_4PAD 2 +#define FLEXSPI_8PAD 3 + +#define FLEXSPI_LUT_OPERAND0_MASK (0xffu) +#define FLEXSPI_LUT_OPERAND0_SHIFT (0U) +#define FLEXSPI_LUT_OPERAND0(x) (((uint32_t) \ + (((uint32_t)(x)) << FLEXSPI_LUT_OPERAND0_SHIFT)) & \ + FLEXSPI_LUT_OPERAND0_MASK) +#define FLEXSPI_LUT_NUM_PADS0_MASK (0x300u) +#define FLEXSPI_LUT_NUM_PADS0_SHIFT (8u) +#define FLEXSPI_LUT_NUM_PADS0(x) (((uint32_t) \ + (((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS0_SHIFT)) & \ + FLEXSPI_LUT_NUM_PADS0_MASK) +#define FLEXSPI_LUT_OPCODE0_MASK (0xfc00u) +#define FLEXSPI_LUT_OPCODE0_SHIFT (10u) +#define FLEXSPI_LUT_OPCODE0(x) (((uint32_t) \ + (((uint32_t)(x)) << FLEXSPI_LUT_OPCODE0_SHIFT)) & \ + FLEXSPI_LUT_OPCODE0_MASK) +#define FLEXSPI_LUT_OPERAND1_MASK (0xff0000u) +#define FLEXSPI_LUT_OPERAND1_SHIFT (16U) +#define FLEXSPI_LUT_OPERAND1(x) (((uint32_t) \ + (((uint32_t)(x)) << FLEXSPI_LUT_OPERAND1_SHIFT)) & \ + FLEXSPI_LUT_OPERAND1_MASK) +#define FLEXSPI_LUT_NUM_PADS1_MASK (0x3000000u) +#define FLEXSPI_LUT_NUM_PADS1_SHIFT (24u) +#define FLEXSPI_LUT_NUM_PADS1(x) (((uint32_t) \ + (((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS1_SHIFT)) & \ + FLEXSPI_LUT_NUM_PADS1_MASK) +#define FLEXSPI_LUT_OPCODE1_MASK (0xfc000000u) +#define FLEXSPI_LUT_OPCODE1_SHIFT (26u) +#define FLEXSPI_LUT_OPCODE1(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE1_SHIFT)) & \ + FLEXSPI_LUT_OPCODE1_MASK) + +#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \ + (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | \ + FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \ + FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1)) + +#define NOR_CMD_INDEX_READ CMD_INDEX_READ +#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS +#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE +#define NOR_CMD_INDEX_ERASESECTOR 3 +#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE +#define NOR_CMD_INDEX_CHIPERASE 5 +#define NOR_CMD_INDEX_DUMMY 6 +#define NOR_CMD_INDEX_ERASEBLOCK 7 + +/* READ LUT sequence id in lookupTable stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ + +/* Read Status LUT sequence id in lookupTable stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_READSTATUS CMD_LUT_SEQ_IDX_READSTATUS + +/* 2 Read status DPI/QPI/OPI sequence id in lookupTable stored in config + * block + */ + +#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI 2 + +/* 3 Write Enable sequence id in lookupTable stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE CMD_LUT_SEQ_IDX_WRITEENABLE + +/* 4 Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config + * block + */ + +#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI 4 + +/* 5 Erase Sector sequence id in lookupTable stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 + +/* 8 Erase Block sequence id in lookupTable stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8 + +/* 9 Program sequence id in lookupTable stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM CMD_LUT_SEQ_IDX_WRITE + +/* 11 Chip Erase sequence in lookupTable id stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 + +/* 13 Read SFDP sequence in lookupTable id stored in config block */ + +#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 + +/* 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config + * block + */ + +#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD 14 + +/* 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config + * blobk + */ + +#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD 15 + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* Definitions for FlexSPI Serial Clock Frequency */ + +enum flexspi_serial_clkfreq_e +{ + FLEXSPI_SERIAL_CLKFREQ_30MHz = 1, + FLEXSPI_SERIAL_CLKFREQ_50MHz = 2, + FLEXSPI_SERIAL_CLKFREQ_60MHz = 3, + FLEXSPI_SERIAL_CLKFREQ_75MHz = 4, + FLEXSPI_SERIAL_CLKFREQ_80MHz = 5, + FLEXSPI_SERIAL_CLKFREQ_100MHz = 6, + FLEXSPI_SERIAL_CLKFREQ_133MHz = 7, + FLEXSPI_SERIAL_CLKFREQ_166MHz = 8, + FLEXSPI_SERIAL_CLKFREQ_200MHz = 9, +}; + +/* FlexSPI clock configuration type */ + +enum flexspi_serial_clockmode_e +{ + FLEXSPI_CLKMODE_SDR, + FLEXSPI_CLKMODE_DDR, +}; + +/* FlexSPI Read Sample Clock Source definition */ + +enum flash_read_sample_clk_e +{ + FLASH_READ_SAMPLE_CLK_LOOPBACK_INTERNELLY = 0, + FLASH_READ_SAMPLE_CLK_LOOPBACK_FROM_DQSPAD = 1, + FLASH_READ_SAMPLE_CLK_LOOPBACK_FROM_SCKPAD = 2, + FLASH_READ_SAMPLE_CLK_EXT_INPUT_FROM_DQSPAD = 3, +}; + +/* Misc feature bit definitions */ + +enum flash_misc_feature_e +{ + FLEXSPIMISC_OFFSET_DIFFCLKEN = 0, /* Bit for Differential clock enable */ + FLEXSPIMISC_OFFSET_CK2EN = 1, /* Bit for CK2 enable */ + FLEXSPIMISC_OFFSET_PARALLELEN = 2, /* Bit for Parallel mode enable */ + FLEXSPIMISC_OFFSET_WORD_ADDRESSABLE_EN = 3, /* Bit for Word Addressable enable */ + FLEXSPIMISC_OFFSET_SAFECONFIG_FREQ_EN = 4, /* Bit for Safe Configuration Frequency enable */ + FLEXSPIMISC_OFFSET_PAD_SETTING_OVERRIDE_EN = 5, /* Bit for Pad setting override enable */ + FLEXSPIMISC_OFFSET_DDR_MODE_EN = 6, /* Bit for DDR clock confiuration indication. */ +}; + +/* Flash Type Definition */ + +enum flash_flash_type_e +{ + FLEXSPI_DEVICE_TYPE_SERIAL_NOR = 1, /* Flash devices are Serial NOR */ + FLEXSPI_DEVICE_TYPE_SERIAL_NAND = 2, /* Flash devices are Serial NAND */ + FLEXSPI_DEVICE_TYPE_SERIAL_RAM = 3, /* Flash devices are Serial RAM/HyperFLASH */ + FLEXSPI_DEVICE_TYPE_MCP_NOR_NAND = 0x12, /* Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND */ + FLEXSPI_DEVICE_TYPE_MCP_NOR_RAM = 0x13, /* Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs */ +}; + +/* Flash Pad Definitions */ + +enum flash_flash_pad_e +{ + SERIAL_FLASH_1PAD = 1, + SERIAL_FLASH_2PADS = 2, + SERIAL_FLASH_4PADS = 4, + SERIAL_FLASH_8PADS = 8, +}; + +/* Flash Configuration Command Type */ + +enum flash_config_cmd_e +{ + DEVICE_CONFIG_CMD_TYPE_GENERIC, /* Generic command, for example: configure dummy cycles, drive strength, etc */ + DEVICE_CONFIG_CMD_TYPE_QUADENABLE, /* Quad Enable command */ + DEVICE_CONFIG_CMD_TYPE_SPI2XPI, /* Switch from SPI to DPI/QPI/OPI mode */ + DEVICE_CONFIG_CMD_TYPE_XPI2SPI, /* Switch from DPI/QPI/OPI to SPI mode */ + DEVICE_CONFIG_CMD_TYPE_SPI2NO_CMD, /* Switch to 0-4-4/0-8-8 mode */ + DEVICE_CONFIG_CMD_TYPE_RESET, /* Reset device command */ +}; + +/* FlexSPI LUT Sequence structure */ + +struct flexspi_lut_seq_s +{ + uint8_t seq_num; /* Sequence Number, valid number: 1-16 */ + uint8_t seq_id; /* Sequence Index, valid number: 0-15 */ + uint16_t reserved; +}; + +/* FlexSPI Memory Configuration Block */ + +struct flexspi_mem_config_s +{ + uint32_t tag; + uint32_t version; + uint32_t reserved0; + uint8_t read_sample_clksrc; + uint8_t cs_hold_time; + uint8_t cs_setup_time; + uint8_t column_address_width; /* [0x00f-0x00f] Column Address with, for + * HyperBus protocol, it is fixed to 3, For + * Serial NAND, need to refer to datasheet + */ + uint8_t device_mode_cfg_enable; + uint8_t device_mode_type; + uint16_t wait_time_cfg_commands; + struct flexspi_lut_seq_s device_mode_seq; + uint32_t device_mode_arg; + uint8_t config_cmd_enable; + uint8_t config_mode_type[3]; + struct flexspi_lut_seq_s config_cmd_seqs[3]; + uint32_t reserved1; + uint32_t config_cmd_args[3]; + uint32_t reserved2; + uint32_t controller_misc_option; + uint8_t device_type; + uint8_t sflash_pad_type; + uint8_t serial_clk_freq; + uint8_t lut_custom_seq_enable; + uint32_t reserved3[2]; + uint32_t sflash_a1size; + uint32_t sflash_a2size; + uint32_t sflash_b1size; + uint32_t sflash_b2size; + uint32_t cspad_setting_override; + uint32_t sclkpad_setting_override; + uint32_t datapad_setting_override; + uint32_t dqspad_setting_override; + uint32_t timeout_in_ms; + uint32_t command_interval; + uint16_t data_valid_time[2]; + uint16_t busy_offset; + uint16_t busybit_polarity; + uint32_t lookup_table[64]; + struct flexspi_lut_seq_s lut_customseq[12]; + uint32_t reserved4[4]; +}; + +/* Serial NOR configuration block */ + +struct flexspi_nor_config_s +{ + struct flexspi_mem_config_s mem_config; /* Common memory configuration info via FlexSPI */ + uint32_t page_size; /* Page size of Serial NOR */ + uint32_t sector_size; /* Sector size of Serial NOR */ + uint8_t ipcmd_serial_clkfreq; /* Clock frequency for IP command */ + uint8_t is_uniform_blocksize; /* Sector/Block size is the same */ + uint8_t reserved0[2]; /* Reserved for future use */ + uint8_t serial_nor_type; /* Serial NOR Flash type: 0/1/2/3 */ + uint8_t need_exit_nocmdmode; /* Need to exit NoCmd mode before other IP command */ + uint8_t halfclk_for_nonreadcmd; /* Half the Serial Clock for non-read command: true/false */ + uint8_t need_restore_nocmdmode; /* Need to Restore NoCmd mode after IP command execution */ + uint32_t blocksize; /* Block size */ + uint32_t reserve2[11]; /* Reserved for future use */ +}; + +#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c new file mode 100644 index 000000000..c904cd5aa --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c @@ -0,0 +1,215 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_gpio.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include "chip.h" + +#include +#include "imxrt1052-ok.h" + +#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct imxrtgpio_dev_s +{ + struct gpio_dev_s gpio; + uint8_t id; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +#if BOARD_NGPIOIN > 0 +static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value); +#endif + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value); +static int gpout_write(FAR struct gpio_dev_s *dev, bool value); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + + #if BOARD_NGPIOIN > 0 +static const struct gpio_operations_s gpin_ops = +{ + .go_read = gpin_read, + .go_write = NULL, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as INPUT */ + +static const uint32_t g_gpioinputs[BOARD_NGPIOIN] = +{ + GPIO_IN1, +}; + +static struct imxrtgpio_dev_s g_gpin[BOARD_NGPIOIN]; +#endif + +#if BOARD_NGPIOOUT > 0 + +static const struct gpio_operations_s gpout_ops = +{ + .go_read = gpout_read, + .go_write = gpout_write, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as OUTPUT */ + +static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] = +{ + GPIO_GOUT1, + GPIO_GOUT2, + GPIO_GOUT3, + GPIO_GOUT4, +}; + +static struct imxrtgpio_dev_s g_gpout[BOARD_NGPIOOUT]; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#if BOARD_NGPIOIN > 0 +static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value) +{ + FAR struct imxrtgpio_dev_s *imxrtgpio = (FAR struct imxrtgpio_dev_s *)dev; + + DEBUGASSERT(imxrtgpio != NULL && value != NULL); + DEBUGASSERT(imxrtgpio->id < BOARD_NGPIOIN); + gpioinfo("Reading...\n"); + + *value = imxrt_gpio_read(g_gpioinputs[imxrtgpio->id]); + return OK; +} +#endif + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value) +{ + FAR struct imxrtgpio_dev_s *imxrtgpio = (FAR struct imxrtgpio_dev_s *)dev; + + DEBUGASSERT(imxrtgpio != NULL && value != NULL); + DEBUGASSERT(imxrtgpio->id < BOARD_NGPIOOUT); + gpioinfo("Reading...\n"); + + *value = imxrt_gpio_read(g_gpiooutputs[imxrtgpio->id]); + return OK; +} + +static int gpout_write(FAR struct gpio_dev_s *dev, bool value) +{ + FAR struct imxrtgpio_dev_s *imxrtgpio = (FAR struct imxrtgpio_dev_s *)dev; + + DEBUGASSERT(imxrtgpio != NULL); + DEBUGASSERT(imxrtgpio->id < BOARD_NGPIOOUT); + gpioinfo("Writing %d\n", (int)value); + + imxrt_gpio_write(g_gpiooutputs[imxrtgpio->id], value); + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_gpio_initialize + * + * Description: + * Initialize GPIO drivers for use with /apps/examples/gpio + * + ****************************************************************************/ + +int imxrt_gpio_initialize(void) +{ + int pincount = 0; + int i; + +#if BOARD_NGPIOIN > 0 + for (i = 0; i < BOARD_NGPIOIN; i++) + { + /* Setup and register the GPIO pin */ + + g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN; + g_gpin[i].gpio.gp_ops = &gpin_ops; + g_gpin[i].id = i; + + gpio_pin_register(&g_gpin[i].gpio, pincount); + + /* Configure the pin that will be used as input */ + + imxrt_config_gpio(g_gpioinputs[i]); + + pincount++; + } +#endif + +#if BOARD_NGPIOOUT > 0 + for (i = 0; i < BOARD_NGPIOOUT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN; + g_gpout[i].gpio.gp_ops = &gpout_ops; + g_gpout[i].id = i; + + gpio_pin_register(&g_gpout[i].gpio, pincount); + + /* Configure the pin that will be used as output */ + + imxrt_gpio_write(g_gpiooutputs[i], 0); + imxrt_config_gpio(g_gpiooutputs[i]); + + pincount++; + } +#endif + + return 0; +} +#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c new file mode 100644 index 000000000..bec6d715c --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c @@ -0,0 +1,68 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_lcd.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "imxrt_lcd.h" +#include "imxrt_gpio.h" + +#include "imxrt1052-ok.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_lcd_initialize + * + * Description: + * Initialize the LCD. Setup backlight (initially off) + * + ****************************************************************************/ + +void imxrt_lcd_initialize(void) +{ + /* Configure the LCD backlight (and turn the backlight off) */ + + imxrt_config_gpio(GPIO_LCD_BL); +} + +/**************************************************************************** + * Name: imxrt_backlight + * + * Description: + * If CONFIG_IMXRT_LCD_BACKLIGHT is defined, then the board-specific + * logic must provide this interface to turn the backlight on and off. + * + ****************************************************************************/ + +#ifdef CONFIG_IMXRT_LCD_BACKLIGHT +void imxrt_backlight(bool blon) +{ + imxrt_gpio_write(GPIO_LCD_BL, blon); /* High illuminates */ +} +#endif diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c new file mode 100644 index 000000000..561a12283 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c @@ -0,0 +1,122 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_mmcsd_spi.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include + +#include "arm_arch.h" +#include "chip.h" +#include "imxrt_lpspi.h" + +#ifdef CONFIG_MMCSD_SPI + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef CONFIG_IMXRT_LPSPI1 +# error "SD driver requires CONFIG_IMXRT_LPSPI1 to be enabled" +#endif + +#ifdef CONFIG_DISABLE_MOUNTPOINT +# error "SD driver requires CONFIG_DISABLE_MOUNTPOINT to be disabled" +#endif + +/**************************************************************************** + * Private Definitions + ****************************************************************************/ + +static const int SD_SPI_PORT = CONFIG_NSH_MMCSDSPIPORTNO; /* SD is connected to SPI1 port */ + +static const int SD_SLOT_NO = 0; /* There is only one SD slot */ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/* NOTE: We are using a SDCard adapter/module without Card Detect pin! + * Then we don't need to Card Detect callback here. + */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_spi1register + * + * Description: + * Registers media change callback + ****************************************************************************/ + +#ifdef CONFIG_IMXRT_LPSPI1 +int imxrt_lpspi1register(struct spi_dev_s *dev, spi_mediachange_t callback, + void *arg) +{ + spiinfo("INFO: Registering spi1 device\n"); + return OK; +} +#endif + +/**************************************************************************** + * Name: imxrt_mmcsd_spi_initialize + * + * Description: + * Initialize SPI-based SD card and card detect thread. + * + ****************************************************************************/ + +int imxrt_mmcsd_spi_initialize(int minor) +{ + struct spi_dev_s *spi; + int rv; + + mcinfo("INFO: Initializing mmcsd card\n"); + + spi = imxrt_lpspibus_initialize(SD_SPI_PORT); + if (spi == NULL) + { + mcerr("ERROR: Failed to initialize SPI port %d\n", SD_SPI_PORT); + return -ENODEV; + } + + rv = mmcsd_spislotinitialize(minor, SD_SLOT_NO, spi); + if (rv < 0) + { + mcerr("ERROR: Failed to bind SPI port %d to SD slot %d\n", + SD_SPI_PORT, SD_SLOT_NO); + return rv; + } + + spiinfo("INFO: mmcsd card has been initialized successfully\n"); + return OK; +} + +#endif /* CONFIG_MMCSD_SPI */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c new file mode 100644 index 000000000..556930feb --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c @@ -0,0 +1,1257 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c + * + * Copyright (C) 2017, NXP Semiconductors, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "imxrt_flexspi_nor_boot.h" + +locate_data(".boot_hdr.dcd_data") + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +const uint8_t g_dcd_data[] = +{ + /* 0000 */ DCD_TAG_HEADER, + + 0x04, + 0x30, + 0x41, + 0xcc, + 0x03, + 0xac, + 0x04, + 0x40, + 0x0f, + 0xc0, + 0x68, + 0xff, + 0xff, + 0xff, + 0xff, + + /* 0010 */ 0x40, + + 0x0f, + 0xc0, + 0x6c, + 0xff, + 0xff, + 0xff, + 0xff, + 0x40, + 0x0f, + 0xc0, + 0x70, + 0xff, + 0xff, + 0xff, + 0xff, + + /* 0020 */ 0x40, + + 0x0f, + 0xc0, + 0x74, + 0xff, + 0xff, + 0xff, + 0xff, + 0x40, + 0x0f, + 0xc0, + 0x78, + 0xff, + 0xff, + 0xff, + 0xff, + + /* 0030 */ 0x40, + + 0x0f, + 0xc0, + 0x7c, + 0xff, + 0xff, + 0xff, + 0xff, + 0x40, + 0x0f, + 0xc0, + 0x80, + 0xff, + 0xff, + 0xff, + 0xff, + + /* 0040 */ 0x40, + + 0x0d, + 0x80, + 0x30, + 0x00, + 0x00, + 0x20, + 0x01, + 0x40, + 0x0d, + 0x81, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + + /* 0050 */ 0x40, + + 0x0f, + 0xc0, + 0x14, + 0x00, + 0x01, + 0x0d, + 0x40, + 0x40, + 0x1f, + 0x80, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0060 */ 0x40, + + 0x1f, + 0x80, + 0x18, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0070 */ 0x40, + + 0x1f, + 0x80, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x24, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0080 */ 0x40, + + 0x1f, + 0x80, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0090 */ 0x40, + + 0x1f, + 0x80, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x34, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 00a0 */ 0x40, + + 0x1f, + 0x80, + 0x38, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 00b0 */ 0x40, + + 0x1f, + 0x80, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x44, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 00c0 */ 0x40, + + 0x1f, + 0x80, + 0x48, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 00d0 */ 0x40, + + 0x1f, + 0x80, + 0x50, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x54, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 00e0 */ 0x40, + + 0x1f, + 0x80, + 0x58, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 00f0 */ 0x40, + + 0x1f, + 0x80, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0100 */ 0x40, + + 0x1f, + 0x80, + 0x68, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0110 */ 0x40, + + 0x1f, + 0x80, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x74, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0120 */ 0x40, + + 0x1f, + 0x80, + 0x78, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0130 */ 0x40, + + 0x1f, + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0140 */ 0x40, + + 0x1f, + 0x80, + 0x88, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0150 */ 0x40, + + 0x1f, + 0x80, + 0x90, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x94, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0160 */ 0x40, + + 0x1f, + 0x80, + 0x98, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0170 */ 0x40, + + 0x1f, + 0x80, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0180 */ 0x40, + + 0x1f, + 0x80, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x80, + 0xac, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 0190 */ 0x40, + + 0x1f, + 0x80, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x10, + 0x40, + 0x1f, + 0x80, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 01a0 */ 0x40, + + 0x1f, + 0x80, + 0xb8, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x1f, + 0x82, + 0x04, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 01b0 */ 0x40, + + 0x1f, + 0x82, + 0x08, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x0c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 01c0 */ 0x40, + + 0x1f, + 0x82, + 0x10, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x14, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 01d0 */ 0x40, + + 0x1f, + 0x82, + 0x18, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x1c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 01e0 */ 0x40, + + 0x1f, + 0x82, + 0x20, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x24, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 01f0 */ 0x40, + + 0x1f, + 0x82, + 0x28, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x2c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0200 */ 0x40, + + 0x1f, + 0x82, + 0x30, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x34, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0210 */ 0x40, + + 0x1f, + 0x82, + 0x38, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x3c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0220 */ 0x40, + + 0x1f, + 0x82, + 0x40, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x44, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0230 */ 0x40, + + 0x1f, + 0x82, + 0x48, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x4c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0240 */ 0x40, + + 0x1f, + 0x82, + 0x50, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x54, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0250 */ 0x40, + + 0x1f, + 0x82, + 0x58, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x5c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0260 */ 0x40, + + 0x1f, + 0x82, + 0x60, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x64, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0270 */ 0x40, + + 0x1f, + 0x82, + 0x68, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x6c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0280 */ 0x40, + + 0x1f, + 0x82, + 0x70, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x74, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 0290 */ 0x40, + + 0x1f, + 0x82, + 0x78, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x7c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 02a0 */ 0x40, + + 0x1f, + 0x82, + 0x80, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x84, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 02b0 */ 0x40, + + 0x1f, + 0x82, + 0x88, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x8c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 02c0 */ 0x40, + + 0x1f, + 0x82, + 0x90, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x94, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 02d0 */ 0x40, + + 0x1f, + 0x82, + 0x98, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0x9c, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 02e0 */ 0x40, + + 0x1f, + 0x82, + 0xa0, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x1f, + 0x82, + 0xa4, + 0x00, + 0x01, + 0x10, + 0xf9, + + /* 02f0 */ 0x40, + + 0x1f, + 0x82, + 0xa8, + 0x00, + 0x01, + 0x10, + 0xf9, + 0x40, + 0x2f, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x04, + + /* 0300 */ 0x40, + + 0x2f, + 0x00, + 0x08, + 0x00, + 0x03, + 0x05, + 0x24, + 0x40, + 0x2f, + 0x00, + 0x0c, + 0x06, + 0x03, + 0x05, + 0x24, + + /* 0310 */ 0x40, + + 0x2f, + 0x00, + 0x10, + 0x80, + 0x00, + 0x00, + 0x1b, + 0x40, + 0x2f, + 0x00, + 0x14, + 0x82, + 0x00, + 0x00, + 0x1b, + + /* 0320 */ 0x40, + + 0x2f, + 0x00, + 0x18, + 0x84, + 0x00, + 0x00, + 0x1b, + 0x40, + 0x2f, + 0x00, + 0x1c, + 0x86, + 0x00, + 0x00, + 0x1b, + + /* 0330 */ 0x40, + + 0x2f, + 0x00, + 0x20, + 0x90, + 0x00, + 0x00, + 0x21, + 0x40, + 0x2f, + 0x00, + 0x24, + 0xa0, + 0x00, + 0x00, + 0x19, + + /* 0340 */ 0x40, + + 0x2f, + 0x00, + 0x28, + 0xa8, + 0x00, + 0x00, + 0x17, + 0x40, + 0x2f, + 0x00, + 0x2c, + 0xa9, + 0x00, + 0x00, + 0x1b, + + /* 0350 */ 0x40, + + 0x2f, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x21, + 0x40, + 0x2f, + 0x00, + 0x04, + 0x00, + 0x00, + 0x79, + 0xa8, + + /* 0360 */ 0x40, + + 0x2f, + 0x00, + 0x40, + 0x00, + 0x00, + 0x0f, + 0x31, + 0x40, + 0x2f, + 0x00, + 0x44, + 0x00, + 0x65, + 0x29, + 0x22, + + /* 0370 */ 0x40, + + 0x2f, + 0x00, + 0x48, + 0x00, + 0x01, + 0x09, + 0x20, + 0x40, + 0x2f, + 0x00, + 0x4c, + 0x50, + 0x21, + 0x0a, + 0x08, + + /* 0380 */ 0x40, + + 0x2f, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x21, + 0x40, + 0x2f, + 0x00, + 0x84, + 0x00, + 0x88, + 0x88, + 0x88, + + /* 0390 */ 0x40, + + 0x2f, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x02, + 0x40, + 0x2f, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x00, + + /* 03a0 */ 0x40, + + 0x2f, + 0x00, + 0x90, + 0x80, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2f, + 0x00, + 0x9c, + 0xa5, + 0x5a, + 0x00, + 0x0f, + + /* 03b0 */ 0xcf, + + 0x00, + 0x0c, + 0x1c, + 0x40, + 0x2f, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x01, + 0xcc, + 0x00, + 0x14, + 0x04, + + /* 03c0 */ 0x40, + + 0x2f, + 0x00, + 0x90, + 0x80, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2f, + 0x00, + 0x9c, + 0xa5, + 0x5a, + 0x00, + 0x0c, + + /* 03d0 */ 0xcf, + + 0x00, + 0x0c, + 0x1c, + 0x40, + 0x2f, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x01, + 0xcc, + 0x00, + 0x14, + 0x04, + + /* 03e0 */ 0x40, + + 0x2f, + 0x00, + 0x90, + 0x80, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2f, + 0x00, + 0x9c, + 0xa5, + 0x5a, + 0x00, + 0x0c, + + /* 03f0 */ 0xcf, + + 0x00, + 0x0c, + 0x1c, + 0x40, + 0x2f, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x01, + 0xcc, + 0x00, + 0x1c, + 0x04, + + /* 0400 */ 0x40, + + 0x2f, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x33, + 0x40, + 0x2f, + 0x00, + 0x90, + 0x80, + 0x00, + 0x00, + 0x00, + + /* 0410 */ 0x40, + + 0x2f, + 0x00, + 0x9c, + 0xa5, + 0x5a, + 0x00, + 0x0a, + 0xcf, + 0x00, + 0x0c, + 0x1c, + 0x40, + 0x2f, + 0x00, + 0x3c, + + /* 0420 */ 0x00, + + 0x00, + 0x00, + 0x01, + 0xcc, + 0x00, + 0x0c, + 0x04, + 0x40, + 0x2f, + 0x00, + 0x4c, + 0x50, + 0x21, + 0x0a, + 0x09, +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c new file mode 100644 index 000000000..bb4702c99 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c @@ -0,0 +1,211 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_spi.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "arm_arch.h" + +#include "imxrt_config.h" +#include "imxrt_lpspi.h" +#include "imxrt_gpio.h" +#include "imxrt1052-ok.h" + +#if defined(CONFIG_IMXRT_LPSPI1) || defined(CONFIG_IMXRT_LPSPI2) || \ + defined(CONFIG_IMXRT_LPSPI3) || defined(CONFIG_IMXRT_LPSPI4) + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_spidev_initialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the imxrt1052-ok + * board. + * + ****************************************************************************/ + +void weak_function imxrt_spidev_initialize(void) +{ +#ifdef CONFIG_IMXRT_LPSPI1 + imxrt_config_gpio(GPIO_LPSPI1_CS); /* LPSPI1 chip select */ + imxrt_config_gpio(GPIO_MMCSD_EN); +#endif +#ifdef CONFIG_IMXRT_LPSPI3 + imxrt_config_gpio(GPIO_LPSPI3_CS); /* LPSPI3 chip select */ +#endif +} + +/**************************************************************************** + * Name: imxrt_lpspi1/2/3select and imxrt_lpspi1/2/3status + * + * Description: + * The external functions, imxrt_lpspi1/2/3select and + * imxrt_lpspi1/2/3status must be provided by board-specific logic. + * They are implementations of the select and status methods of the SPI + * interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h). + * All other methods (including imxrt_lpspibus_initialize()) are provided + * by common STM32 logic. To use this common SPI logic on your board: + * + * 1. Provide logic in imxrt_boardinitialize() to configure SPI chip select + * pins. + * 2. Provide imxrt_lpspi1/2/3select() and imxrt_lpspi1/2/3status() + * functions in your board-specific logic. + * These functions will perform chip selection and status operations + * using GPIOs in the way your board is configured. + * 3. Add a calls to imxrt_lpspibus_initialize() in your low level + * application initialization logic + * 4. The handle returned by imxrt_lpspibus_initialize() may then be used + * to bind the SPI driver to higher level logic (e.g., calling + * mmcsd_spislotinitialize(), for example, will bind the SPI driver to + * the SPI MMC/SD driver). + * + ****************************************************************************/ + +#ifdef CONFIG_IMXRT_LPSPI1 +void imxrt_lpspi1select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %d CS: %s\n", (int)devid, + selected ? "assert" : "de-assert"); + + imxrt_gpio_write(GPIO_LPSPI1_CS, !selected); +} + +uint8_t imxrt_lpspi1status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif + +#ifdef CONFIG_IMXRT_LPSPI2 +void imxrt_lpspi2select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %d CS: %s\n", (int)devid, + selected ? "assert" : "de-assert"); + + imxrt_gpio_write(GPIO_LPSPI2_CS, !selected); +} + +uint8_t imxrt_lpspi2status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif + +#ifdef CONFIG_IMXRT_LPSPI3 +void imxrt_lpspi3select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %d CS: %s\n", (int)devid, + selected ? "assert" : "de-assert"); + + imxrt_gpio_write(GPIO_LPSPI3_CS, !selected); +} + +uint8_t imxrt_lpspi3status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif + +#ifdef CONFIG_IMXRT_LPSPI4 +void imxrt_lpspi4select(FAR struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %d CS: %s\n", (int)devid, + selected ? "assert" : "de-assert"); + + imxrt_gpio_write(GPIO_LPSPI4_CS, !selected); +} + +uint8_t imxrt_lpspi4status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif + +/**************************************************************************** + * Name: imxrt_lpspi1cmddata + * + * Description: + * Set or clear the SH1101A A0 or SD1306 D/C n bit to select data (true) + * or command (false). This function must be provided by platform-specific + * logic. This is an implementation of the cmddata method of the SPI + * interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h). + * + * Input Parameters: + * + * spi - SPI device that controls the bus the device that requires the CMD/ + * DATA selection. + * devid - If there are multiple devices on the bus, this selects which one + * to select cmd or data. NOTE: This design restricts, for example, + * one one SPI display per SPI bus. + * cmd - true: select command; false: select data + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_SPI_CMDDATA +#ifdef CONFIG_IMXRT_LPSPI1 +int imxrt_lpspi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) +{ + return -ENODEV; +} +#endif + +#ifdef CONFIG_IMXRT_LPSPI2 +int imxrt_lpspi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) +{ + return -ENODEV; +} +#endif + +#ifdef CONFIG_IMXRT_LPSPI3 +int imxrt_lpspi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) +{ + return -ENODEV; +} +#endif + +#ifdef CONFIG_IMXRT_LPSPI4 +int imxrt_lpspi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) +{ + return -ENODEV; +} +#endif +#endif /* CONFIG_SPI_CMDDATA */ +#endif /* CONFIG_IMXRT_LPSPI1 || CONFIG_IMXRT_LPSPI2 */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c new file mode 100644 index 000000000..d0e565c91 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c @@ -0,0 +1,85 @@ +/**************************************************************************** + * boards/arm/imxrt/imxrt1052-ok/src/imxrt_userleds.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* There are four LED status indicators located on the EVK Board. The + * functions of these LEDs include: + * + * - Main Power Supply(D3) + * Green: DC 5V main supply is normal. + * Red: J2 input voltage is over 5.6V. + * Off: The board is not powered. + * - Reset RED LED(D15) + * - OpenSDA LED(D16) + * - USER LED(D18) + * + * Only a single LED, D18, is under software control. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "imxrt_gpio.h" +#include "imxrt_iomuxc.h" +#include "imxrt1052-ok.h" + +#include + +#if !defined(CONFIG_ARCH_LEDS) && defined(GPIO_LED) + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + /* Configure LED GPIO for output */ + + imxrt_config_gpio(GPIO_LED); + return BOARD_NLEDS; +} + +/**************************************************************************** + * Name: board_userled + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + imxrt_gpio_write(GPIO_LED, !ledon); /* Low illuminates */ +} + +/**************************************************************************** + * Name: board_userled_all + ****************************************************************************/ + +void board_userled_all(uint32_t ledset) +{ + /* Low illuminates */ + + imxrt_gpio_write(GPIO_LED, (ledset & BOARD_USERLED_BIT) == 0); +} + +#endif /* !CONFIG_ARCH_LEDS */ diff --git a/Ubiquitous/Nuttx/app_match_nuttx/build.sh b/Ubiquitous/Nuttx/app_match_nuttx/build.sh index 7b5b39fcc..cb656dbdb 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/build.sh +++ b/Ubiquitous/Nuttx/app_match_nuttx/build.sh @@ -18,5 +18,6 @@ cp -rf $current/nuttx $nuttx cp -rf $current/apps $nuttx cp -rf $nuttx/aiit_board/aiit-arm32-board $nuttx/nuttx/boards/arm/stm32 cp -rf $nuttx/aiit_board/aiit-riscv64-board $nuttx/nuttx/boards/risc-v/k210 +cp -rf $nuttx/aiit_board/imxrt1052-ok $nuttx/nuttx/boards/arm/imxrt cd ../nuttx diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig index a2cd90a8c..1c5a46d02 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig @@ -445,6 +445,16 @@ config ARCH_BOARD_IMXRT1050_EVK This is the board configuration for the port of NuttX to the NXP i.MXRT evaluation kit, MIMXRT1050-EVKB. This board features the MIMXRT1052DVL6A MCU. +config ARCH_BOARD_IMXRT1052_OK + bool "NXP i.MX RT 1052 OK" + depends on ARCH_CHIP_MIMXRT1052DVL6A + select ARCH_HAVE_LEDS + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS + ---help--- + This is the board configuration for the port of NuttX to the NXP i.MXRT + evaluation kit, MIMXRT1052-OK. This board features the MIMXRT1052DVL6A MCU. + config ARCH_BOARD_IMXRT1060_EVK bool "NXP i.MX RT 1060 EVK" depends on ARCH_CHIP_MIMXRT1062DVL6A @@ -2382,6 +2392,7 @@ config ARCH_BOARD default "hymini-stm32v" if ARCH_BOARD_HYMINI_STM32V default "imxrt1020-evk" if ARCH_BOARD_IMXRT1020_EVK default "imxrt1050-evk" if ARCH_BOARD_IMXRT1050_EVK + default "imxrt1052-ok" if ARCH_BOARD_IMXRT1052_OK default "imxrt1060-evk" if ARCH_BOARD_IMXRT1060_EVK default "imxrt1064-evk" if ARCH_BOARD_IMXRT1064_EVK default "kwikstik-k40" if ARCH_BOARD_KWIKSTIK_K40 @@ -2660,6 +2671,9 @@ endif if ARCH_BOARD_IMXRT1050_EVK source "boards/arm/imxrt/imxrt1050-evk/Kconfig" endif +if ARCH_BOARD_IMXRT1052_OK +source "boards/arm/imxrt/imxrt1052-ok/Kconfig" +endif if ARCH_BOARD_IMXRT1060_EVK source "boards/arm/imxrt/imxrt1060-evk/Kconfig" endif From aa9d16c64dfec9f3648c806c527b84dd5960a7a1 Mon Sep 17 00:00:00 2001 From: wgz-code <820906721@qq.com> Date: Tue, 8 Mar 2022 13:21:48 +0800 Subject: [PATCH 02/25] imxrt-ok1052 board set CONFIG_RAW_BINARY=y --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 + Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index 1ef5015a7..ed76b3fe5 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -35,6 +35,7 @@ CONFIG_NUTTX_USERSPACE=0x60200000 CONFIG_PASS1_BUILDIR="boards/arm/imxrt/imxrt1052-ok/kernel" CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 +CONFIG_RAW_BINARY=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=8 CONFIG_START_MONTH=6 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index 568c20516..21c8df6cf 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -33,6 +33,7 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=536870912 CONFIG_RAM_START=0x20200000 +CONFIG_RAW_BINARY=y CONFIG_SCHED_CPULOAD=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index bbc23cc75..1e52233e1 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -53,6 +53,7 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 +CONFIG_RAW_BINARY=y CONFIG_SCHED_LPWORK=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index d69e7aecd..69c47892d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -31,6 +31,7 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 +CONFIG_RAW_BINARY=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y From f57bed1b8d976c3919e3ecc629cb53693a36cc0d Mon Sep 17 00:00:00 2001 From: wgz-code <820906721@qq.com> Date: Tue, 8 Mar 2022 14:07:56 +0800 Subject: [PATCH 03/25] set CONFIG_CLOCK_MONOTONIC=y on attiboard --- .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 + Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 + 3 files changed, 3 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index 21c8df6cf..75e2a5517 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -15,6 +15,7 @@ CONFIG_ARCH_STACKDUMP=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_LOOPSPERMSEC=20000 CONFIG_BUILTIN=y +CONFIG_CLOCK_MONOTONIC=y CONFIG_C99_BOOL8=y CONFIG_FS_PROCFS=y CONFIG_HAVE_CXX=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index 1e52233e1..976517dab 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -19,6 +19,7 @@ CONFIG_ARMV7M_ICACHE=y CONFIG_ARMV7M_USEBASEPRI=y CONFIG_BOARD_LOOPSPERMSEC=104926 CONFIG_BUILTIN=y +CONFIG_CLOCK_MONOTONIC=y CONFIG_ETH0_PHY_KSZ8081=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 69c47892d..4dfc0e128 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -18,6 +18,7 @@ CONFIG_ARMV7M_ICACHE=y CONFIG_ARMV7M_USEBASEPRI=y CONFIG_BOARD_LOOPSPERMSEC=104926 CONFIG_BUILTIN=y +CONFIG_CLOCK_MONOTONIC=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_IMXRT_LPUART1=y From 40a12583ccae2bc725ee61e1933f2967918c6690 Mon Sep 17 00:00:00 2001 From: wgz-code <820906721@qq.com> Date: Tue, 8 Mar 2022 14:53:12 +0800 Subject: [PATCH 04/25] set CONFIG_ADD_NUTTX_FETURES=y on attiboards for nuttx os --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 + Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index ed76b3fe5..545fc5922 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -6,6 +6,7 @@ # modifications. # # CONFIG_ARCH_RAMFUNCS is not set +CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index 75e2a5517..cb56d4c90 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -5,6 +5,7 @@ # You can then do "make savedefconfig" to generate a new defconfig file that includes your # modifications. # +CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index 976517dab..38f027780 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -6,6 +6,7 @@ # modifications. # # CONFIG_ARCH_LEDS is not set +CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 4dfc0e128..da7afef51 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -5,6 +5,7 @@ # You can then do "make savedefconfig" to generate a new defconfig file that includes your # modifications. # +CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y From 2f73d551eefbe070aeafeb6682eb212914939206 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Fri, 18 Mar 2022 11:31:41 +0800 Subject: [PATCH 05/25] remove mxrt-ok1052 board CONFIG_RAW_BINARY=y --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig | 1 - .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 - .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 - Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 - 4 files changed, 4 deletions(-) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index 545fc5922..04e6e6908 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -36,7 +36,6 @@ CONFIG_NUTTX_USERSPACE=0x60200000 CONFIG_PASS1_BUILDIR="boards/arm/imxrt/imxrt1052-ok/kernel" CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 -CONFIG_RAW_BINARY=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=8 CONFIG_START_MONTH=6 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index cb56d4c90..fed0b9c77 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -35,7 +35,6 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=536870912 CONFIG_RAM_START=0x20200000 -CONFIG_RAW_BINARY=y CONFIG_SCHED_CPULOAD=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index 38f027780..9a6fce90d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -55,7 +55,6 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 -CONFIG_RAW_BINARY=y CONFIG_SCHED_LPWORK=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index da7afef51..1f5be9d79 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -33,7 +33,6 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 -CONFIG_RAW_BINARY=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y From 6886a4d73aca46e8326a4ecc6c124a901c2025a3 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 21 Mar 2022 12:06:29 +0800 Subject: [PATCH 06/25] changge pin config for chip MIMXRT1052CVL5B --- .../aiit_board/imxrt1052-ok/include/board.h | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h index f7a7e1be1..646432e5c 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h @@ -277,39 +277,50 @@ /* LPUARTs * - * Virtual console port provided by OpenSDA on UART1 and - * Arduino RS-232 Shield on UART3. + * Virtual console port provided by OpenSDA on UART1. * */ +/* LPUART1 */ #define GPIO_LPUART1_RX (GPIO_LPUART1_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_13 */ #define GPIO_LPUART1_TX (GPIO_LPUART1_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B0_12 */ + +/* LPUART2 */ +#define GPIO_LPUART2_RX (GPIO_LPUART2_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_03 */ +#define GPIO_LPUART2_TX (GPIO_LPUART2_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_02 */ + +/* LPUART3 */ #define GPIO_LPUART3_RX (GPIO_LPUART3_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_07 */ #define GPIO_LPUART3_TX (GPIO_LPUART3_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_06 */ -/* LPI2Cs - * - * Arduino Connector LPI2C1 and audio/gyro IO on LPI2C3. - */ +/* LPUART4 */ +#define GPIO_LPUART4_RX (GPIO_LPUART4_RX_1|IOMUX_UART_DEFAULT) /* GPIO_SD_B1_01 */ +#define GPIO_LPUART4_TX (GPIO_LPUART4_TX_1|IOMUX_UART_DEFAULT) /* GPIO_SD_B1_00 */ +/* LPUART8 */ +#define GPIO_LPUART8_RX (GPIO_LPUART8_RX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_11 */ +#define GPIO_LPUART8_TX (GPIO_LPUART8_TX_1|IOMUX_UART_DEFAULT) /* GPIO_AD_B1_10 */ + + +/* LPI2C1 */ #define GPIO_LPI2C1_SDA (GPIO_LPI2C1_SDA_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_01 */ #define GPIO_LPI2C1_SCL (GPIO_LPI2C1_SCL_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_00 */ -#define GPIO_LPI2C3_SDA (GPIO_LPI2C3_SDA_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_01 */ -#define GPIO_LPI2C3_SCL (GPIO_LPI2C3_SCL_2|IOMUX_LPI2C_DEFAULT) /* GPIO_AD_B1_00 */ -/* LPSPI - * - * Arduino Connector - * - * J24 D09 GPIO_AD_B0_02 LPSPI3_SDI - * J24 D14 GPIO_AD_B0_01 LPSPI3_SDO - * J24 D15 GPIO_AD_B0_00 LPSPI3_SCK - */ +/* LPI2C3 */ +#define GPIO_LPI2C3_SDA (GPIO_LPI2C3_SDA_2|IOMUX_LPI2C_DEFAULT) /* GPIO_EMC_21 */ +#define GPIO_LPI2C3_SCL (GPIO_LPI2C3_SCL_2|IOMUX_LPI2C_DEFAULT) /* GPIO_EMC_22 */ + +/* LPSPI */ #define GPIO_LPSPI3_SCK (GPIO_LPSPI3_SCK_2|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B0_00 */ #define GPIO_LPSPI3_MISO (GPIO_LPSPI3_SDI_2|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B0_02 */ #define GPIO_LPSPI3_MOSI (GPIO_LPSPI3_SDO_2|IOMUX_LPSPI_DEFAULT) /* GPIO_AD_B0_01 */ + +/* FLEXCAN2 */ +#define GPIO_FLEXCAN2_TX (GPIO_FLEXCAN2_TX_3|IOMUX_CAN_DEFAULT) /* GPIO_AD_B0_14 */ +#define GPIO_FLEXCAN2_RX (GPIO_FLEXCAN2_RX_3|IOMUX_CAN_DEFAULT) /* GPIO_AD_B0_15 */ + /**************************************************************************** * Public Types ****************************************************************************/ From c2a949f6c878a4115f7ad83094b91aa2882c222a Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 21 Mar 2022 16:22:33 +0800 Subject: [PATCH 07/25] imxrt1052 CHIP_MIMXRT1052DVL6A change CHIP_MIMXRT1052CVL5B --- .../imxrt1052-ok/configs/knsh/defconfig | 2 +- .../imxrt1052-ok/configs/libcxxtest/defconfig | 2 +- .../imxrt1052-ok/configs/netnsh/defconfig | 2 +- .../imxrt1052-ok/configs/nsh/defconfig | 2 +- .../nuttx/arch/arm/include/imxrt/chip.h | 111 + .../nuttx/arch/arm/src/imxrt/Kconfig | 2013 +++++++++++++++++ .../app_match_nuttx/nuttx/boards/Kconfig | 4 +- 7 files changed, 2130 insertions(+), 6 deletions(-) create mode 100644 Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h create mode 100644 Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/Kconfig diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index 04e6e6908..e75a746fc 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -12,7 +12,7 @@ CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y -CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index fed0b9c77..a417efe5d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -11,7 +11,7 @@ CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y -CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y CONFIG_ARCH_STACKDUMP=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_LOOPSPERMSEC=20000 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index 9a6fce90d..b3998028a 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -12,7 +12,7 @@ CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y -CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 1f5be9d79..3d682848c 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -11,7 +11,7 @@ CONFIG_ARCH_BOARD="imxrt1052-ok" CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y -CONFIG_ARCH_CHIP_MIMXRT1052DVL6A=y +CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h new file mode 100644 index 000000000..73039331c --- /dev/null +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h @@ -0,0 +1,111 @@ +/**************************************************************************** + * arch/arm/include/imxrt/chip.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_INCLUDE_IMXRT_CHIP_H +#define __ARCH_ARM_INCLUDE_IMXRT_CHIP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Prototypes + ****************************************************************************/ + +/* Get customizations for each supported chip */ + +#if defined(CONFIG_ARCH_CHIP_MIMXRT1021CAG4A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1021CAF4A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1021DAF5A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1021DAG5A) + +/* MIMXRT1021CAG4A - 144 pin, 400MHz Industrial + * MIMXRT1021CAF4A - 100 pin, 400MHz Industrial + * MIMXRT1021DAF5A - 100 pin, 500MHz Consumer + * MIMXRT1021DAG5A - 144 pin, 500MHz Consumer + */ + +# define IMXRT_OCRAM_SIZE (256 * 1024) /* 256Kb OCRAM */ +# define IMXRT_GPIO_NPORTS 5 /* Five total ports */ + /* but 4 doesn't exist */ + +#elif defined(CONFIG_ARCH_CHIP_MIMXRT1051DVL6A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1051CVL5A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1052DVL6A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1052CVL5A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1052CVL5B) +/* MIMXRT1051CVL5A - Industrial, Reduced Features, 528MHz + * MIMXRT1051DVL6A - Consumer, Reduced Features, 600MHz + * MIMXRT1052CVL5A - Industrial, Full Feature, 528MHz + * MIMXRT1052CVL5B - Industrial, Full Feature, 528MHz + * MIMXRT1052DVL6A - Consumer, Full Feature, 600MHz + */ + +# define IMXRT_OCRAM_SIZE (512 * 1024) /* 512Kb OCRAM */ +# define IMXRT_GPIO_NPORTS 5 /* Five total ports */ + +#elif defined(CONFIG_ARCH_CHIP_MIMXRT1061DVL6A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1061CVL5A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1062DVL6A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1062CVL5A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1064DVL6A) || \ + defined(CONFIG_ARCH_CHIP_MIMXRT1064CVL5A) +/* MIMXRT1061CVL5A - Industrial, Reduced Features, 528MHz + * MIMXRT1061DVL6A - Consumer, Reduced Features, 600MHz + * MIMXRT1062CVL5A - Industrial, Full Feature, 528MHz + * MIMXRT1062DVL6A - Consumer, Full Feature, 600MHz + * MIMXRT1064CVL5A - Industrial, Full Feature, 528MHz + * MIMXRT1064DVL6A - Consumer, Full Feature, 600MHz + */ + +# define IMXRT_OCRAM_SIZE (1024 * 1024) /* 1024Kb OCRAM */ +# define IMXRT_GPIO_NPORTS 9 /* Nine total ports */ +#else +# error "Unknown i.MX RT chip type" +#endif + +/* NVIC priority levels *****************************************************/ + +/* Each priority field holds an 8-bit priority value, 0-15. The lower the + * value, the greater the priority of the corresponding interrupt. The i.MX + * RT processor implements only bits[7:4] of each field, bits[3:0] read as + * zero and ignore writes. + */ + +#define NVIC_SYSH_PRIORITY_MIN 0xf0 /* All bits[7:4] set is min pri */ +#define NVIC_SYSH_PRIORITY_DEFAULT 0x80 /* Midpoint is the default */ +#define NVIC_SYSH_PRIORITY_MAX 0x00 /* Zero is maximum priority */ +#define NVIC_SYSH_PRIORITY_STEP 0x40 /* Two bits of interrupt pri used */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Public Functions Prototypes + ****************************************************************************/ + +#endif /* __ARCH_ARM_INCLUDE_IMXRT_CHIP_H */ diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/Kconfig b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/Kconfig new file mode 100644 index 000000000..e46a53aa1 --- /dev/null +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/Kconfig @@ -0,0 +1,2013 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_CHIP_IMXRT + +comment "i.MX RT Configuration Options" + +choice + prompt "i.MX RT Chip Selection" + default ARCH_CHIP_MIMXRT1052CVL5B + depends on ARCH_CHIP_IMXRT + +config ARCH_CHIP_MIMXRT1021CAG4A + bool "MIMXRT1021CAG4A" + select ARCH_FAMILY_MIMXRT1021C + +config ARCH_CHIP_MIMXRT1021CAF4A + bool "MIMXRT1021CAF4A" + select ARCH_FAMILY_MIMXRT1021C + +config ARCH_CHIP_MIMXRT1021DAF5A + bool "MIMXRT1021DAF5A" + select ARCH_FAMILY_MIMXRT1021D + +config ARCH_CHIP_MIMXRT1021DAG5A + bool "MIMXRT1021DAG5A" + select ARCH_FAMILY_MIMXRT1021D + +config ARCH_CHIP_MIMXRT1051DVL6A + bool "MIMXRT1051DVL6A" + select ARCH_FAMILY_MIMXRT105xDVL6A + +config ARCH_CHIP_MIMXRT1051CVL5A + bool "MIMXRT1051CVL5A" + select ARCH_FAMILY_MIMXRT105xCVL5A + +config ARCH_CHIP_MIMXRT1052DVL6A + bool "MIMXRT1052DVL6A" + select ARCH_FAMILY_MIMXRT105xDVL6A + select IMXRT_HAVE_LCD + +config ARCH_CHIP_MIMXRT1052CVL5A + bool "MIMXRT1052CVL5A" + select ARCH_FAMILY_MIMXRT105xCVL5A + select IMXRT_HAVE_LCD + +config ARCH_CHIP_MIMXRT1052CVL5B + bool "MIMXRT1052CVL5B" + select ARCH_FAMILY_MIMXRT105xCVL5B + select IMXRT_HAVE_LCD + +config ARCH_CHIP_MIMXRT1061DVL6A + bool "MIMXRT1061DVL6A" + select ARCH_FAMILY_MXRT106xDVL6A + +config ARCH_CHIP_MIMXRT1061CVL5A + bool "MIMXRT1061CVL5A" + select ARCH_FAMILY_MIMXRT106xCVL5A + +config ARCH_CHIP_MIMXRT1062DVL6A + bool "MIMXRT1062DVL6A" + select ARCH_FAMILY_MXRT106xDVL6A + select IMXRT_HAVE_LCD + +config ARCH_CHIP_MIMXRT1062CVL5A + bool "MIMXRT1062DVL6A" + select ARCH_FAMILY_MIMXRT106xCVL5A + select IMXRT_HAVE_LCD + +config ARCH_CHIP_MIMXRT1064DVL6A + bool "MIMXRT1064DVL6A" + select ARCH_FAMILY_MXRT106xDVL6A + select IMXRT_HAVE_LCD + +config ARCH_CHIP_MIMXRT1064CVL5A + bool "MIMXRT1064DVL6A" + select ARCH_FAMILY_MIMXRT106xCVL5A + select IMXRT_HAVE_LCD + +endchoice # i.MX RT Chip Selection + +# i.MX RT Families + +config ARCH_FAMILY_MIMXRT1021D + bool + default n + select ARCH_FAMILY_IMXRT102x + ---help--- + i.MX RT1020 Crossover Processors for Consumer Products + +config ARCH_FAMILY_MIMXRT1021C + bool + default n + select ARCH_FAMILY_IMXRT102x + ---help--- + i.MX RT1020 Crossover Processors for Industrial Products + +config ARCH_FAMILY_IMXRT102x + bool + default n + select ARCH_HAVE_FPU + select ARCH_HAVE_DPFPU # REVISIT + select ARMV7M_HAVE_ICACHE + select ARMV7M_HAVE_DCACHE + select ARMV7M_HAVE_ITCM + select ARMV7M_HAVE_DTCM + +config ARCH_FAMILY_MIMXRT105xDVL6A + bool + default n + select ARCH_FAMILY_IMXRT105x + ---help--- + i.MX RT1050 Crossover Processors for Consumer Products + +config ARCH_FAMILY_MIMXRT105xCVL5A + bool + default n + select ARCH_FAMILY_IMXRT105x + ---help--- + i.MX RT1050 Crossover Processors for Industrial Products + +config ARCH_FAMILY_MIMXRT105xCVL5B + bool + default n + select ARCH_FAMILY_IMXRT105x + ---help--- + i.MX RT1050 Crossover Processors for Industrial Products + +config ARCH_FAMILY_IMXRT105x + bool + default n + select ARCH_HAVE_FPU + select ARCH_HAVE_DPFPU # REVISIT + select ARMV7M_HAVE_ICACHE + select ARMV7M_HAVE_DCACHE + select ARMV7M_HAVE_ITCM + select ARMV7M_HAVE_DTCM + +config ARCH_FAMILY_MXRT106xDVL6A + bool + default n + select ARCH_FAMILY_IMXRT106x + ---help--- + i.MX RT1060 Crossover Processors for Consumer Products + +config ARCH_FAMILY_MIMXRT106xCVL5A + bool + default n + select ARCH_FAMILY_IMXRT106x + ---help--- + i.MX RT1056 Crossover Processors for Industrial Products + +config ARCH_FAMILY_IMXRT106x + bool + default n + select ARCH_HAVE_FPU + select ARCH_HAVE_DPFPU # REVISIT + select ARMV7M_HAVE_ICACHE + select ARMV7M_HAVE_DCACHE + select ARMV7M_HAVE_ITCM + select ARMV7M_HAVE_DTCM + select IMXRT_HIGHSPEED_GPIO + +# Peripheral support + +config IMXRT_USDHC + bool + default n + +config IMXRT_FLEXIO + bool + default n + +config IMXRT_HAVE_LPUART + bool + default n + +config IMXRT_FLEXCAN + bool + default n + select ARCH_HAVE_NETDEV_STATISTICS + +config IMXRT_FLEXPWM + bool + default n + select ARCH_HAVE_PWM_MULTICHAN + +config IMXRT_LPI2C + bool + default n + +config IMXRT_LPSPI + bool + default n + +config IMXRT_FLEXSPI + bool + default n + +config IMXRT_ADC + bool + default n + +config IMXRT_ENC + bool + default n + +config IMXRT_HIGHSPEED_GPIO + bool + default n + +config IMXRT_HAVE_LCD + bool + default n + +config IMXRT_SEMC_INIT_DONE + bool + default n + +menu "i.MX RT Peripheral Selection" + +config IMXRT_EDMA + bool "eDMA" + default n + select ARCH_DMA + +config IMXRT_USBOTG + bool "USB EHCI" + default n + select USBHOST_HAVE_ASYNCH if USBHOST + select USBHOST_ASYNCH + +config IMXRT_USBDEV + bool "USB Device" + default n + +config IMXRT_ENET + bool "Ethernet" + default n + select ARCH_HAVE_PHY + select ARCH_PHY_INTERRUPT + select ARCH_HAVE_NETDEV_STATISTICS + +config IMXRT_LCD + bool "LCD controller" + default n + depends on IMXRT_HAVE_LCD + +config IMXRT_WDOG + bool "Watchdog 1" + default n + depends on WATCHDOG + +menu "FlexIO Peripherals" + +config IMXRT_FLEXIO1 + bool "FLEXIO1" + default n + select IMXRT_FLEXIO + +if IMXRT_FLEXIO1 + +choice + prompt "FLEXIO1 Clock Source" + default FLEXIO1_CLK_PLL3_SW + ---help--- + The clock source that drives the FLEXIO. + Used to set FLEXIO1_CLK_SEL. + +config FLEXIO1_CLK_PLL4 + bool "PLL4" + +config FLEXIO1_CLK_PLL3_PFD2 + bool "PLL3_PFD2" + +if ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +config FLEXIO1_CLK_PLL5 + bool "PLL5" + +endif # ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +config FLEXIO1_CLK_PLL3_SW + bool "PLL3_SW_CLK" + +endchoice # FLEXIO1 Clock Source + +config FLEXIO1_CLK + int + default 0 if FLEXIO1_CLK_PLL4 + default 1 if FLEXIO1_CLK_PLL3_PFD2 + default 2 if FLEXIO1_CLK_PLL5 + default 3 if FLEXIO1_CLK_PLL3_SW + +config FLEXIO1_PRED_DIVIDER + int "FLEXIO1 Predivider" + range 1 8 + default 2 + ---help--- + The clock source predivider value (FLEXIO1_PRED). [1-8] + +config FLEXIO1_PODF_DIVIDER + int "FLEXIO1 Divider" + range 1 8 + default 8 + ---help--- + The clock source divider value (FLEXIO1_PODF). [1-8] + +endif # IMXRT_FLEXIO1 + +if ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +config IMXRT_FLEXIO2 + bool "FLEXIO2" + default n + select IMXRT_FLEXIO + +if IMXRT_FLEXIO2 || IMXRT_FLEXIO3 + +choice + prompt "FLEXIO2 Clock Source" + default FLEXIO2_CLK_PLL3_SW + ---help--- + The clock source that drives the FLEXIO. + Used to set FLEXIO2_CLK_SEL. + +config FLEXIO2_CLK_PLL4 + bool "PLL4" + +config FLEXIO2_CLK_PLL3_PFD2 + bool "PLL3_PFD2" + +config FLEXIO2_CLK_PLL5 + bool "PLL5" + +config FLEXIO2_CLK_PLL3_SW + bool "PLL3_SW_CLK" + +endchoice # FLEXIO2 Clock Source + +config FLEXIO2_CLK + int + default 0 if FLEXIO2_CLK_PLL4 + default 1 if FLEXIO2_CLK_PLL3_PFD2 + default 2 if FLEXIO2_CLK_PLL5 + default 3 if FLEXIO2_CLK_PLL3_SW + +config FLEXIO2_PRED_DIVIDER + int + prompt "FLEXIO2 Predivider" + range 1 8 + default 2 + ---help--- + The clock source predivider value (FLEXIO2_PRED). [1-8] + +config FLEXIO2_PODF_DIVIDER + int + prompt "FLEXIO2 Divider" + range 1 8 + default 8 + ---help--- + The clock source divider value (FLEXIO2_PODF). [1-8] + +endif # IMXRT_FLEXIO2 || IMXRT_FLEXIO3 + +if ARCH_FAMILY_IMXRT106x + +config IMXRT_FLEXIO3 + bool "FLEXIO3" + default n + select IMXRT_FLEXIO + ---help--- + FLEXIO3 uses the FLEXIO2 clock settings. + +endif # ARCH_FAMILY_IMXRT106x +endif # ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +endmenu # FlexIO Peripherals + +menu "LPUART Peripherals" + +config IMXRT_LPUART1 + bool "LPUART1" + default n + select LPUART1_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART2 + bool "LPUART2" + default n + select LPUART2_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART3 + bool "LPUART3" + default n + select LPUART3_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART4 + bool "LPUART4" + default n + select LPUART4_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART5 + bool "LPUART5" + default n + select LPUART5_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART6 + bool "LPUART6" + default n + select LPUART6_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART7 + bool "LPUART7" + default n + select LPUART7_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +config IMXRT_LPUART8 + bool "LPUART8" + default n + select LPUART8_SERIALDRIVER + select ARCH_HAVE_SERIAL_TERMIOS + select IMXRT_HAVE_LPUART + +endmenu # LPUART Peripherals + +menu "LPUART Configuration" + depends on IMXRT_HAVE_LPUART + +config IMXRT_LPUART_INVERT + bool "Signal Invert Support" + default n + depends on IMXRT_HAVE_LPUART + ---help--- + Enable signal inversion UART support. The option enables support for the + TIOCSINVERT ioctl in the IMXRT serial driver. + +config IMXRT_LPUART_SINGLEWIRE + bool "Single Wire Support" + default n + depends on IMXRT_HAVE_LPUART + ---help--- + Enable single wire UART support. The option enables support for the + TIOCSSINGLEWIRE ioctl in the IMXRT serial driver. + +endmenu # LPUART Configuration + +menu "FLEXCAN Peripherals" + +config IMXRT_FLEXCAN1 + bool "FLEXCAN1" + default n + select IMXRT_FLEXCAN + select NET_CAN_HAVE_TX_DEADLINE + +config IMXRT_FLEXCAN2 + bool "FLEXCAN2" + default n + select IMXRT_FLEXCAN + select NET_CAN_HAVE_TX_DEADLINE + +config IMXRT_FLEXCAN3 + bool "FLEXCAN3" + default n + select IMXRT_FLEXCAN + select NET_CAN_HAVE_TX_DEADLINE + select NET_CAN_HAVE_CANFD + +if IMXRT_FLEXCAN1 || IMXRT_FLEXCAN2 || IMXRT_FLEXCAN3 + +config IMXRT_FLEXCAN_TXMB + int "Number of TX message buffers" + default 3 + ---help--- + This defines number of TX messages buffers. Please note that + maximum number of all message buffers is 13 (one MB has to + be reserved for chip errata ERR005829). + +config IMXRT_FLEXCAN_RXMB + int "Number of RX message buffers" + default 10 + ---help--- + This defines number of RX messages buffers. Please note that + maximum number of all message buffers is 13 (one MB has to + be reserved for chip errata ERR005829). + +endif + +endmenu # FLEXCAN Peripherals + +menu "FLEXCAN1 Configuration" + depends on IMXRT_FLEXCAN1 + +config FLEXCAN1_BITRATE + int "CAN bitrate" + default 1000000 + +config FLEXCAN1_SAMPLEP + int "CAN sample point" + default 80 + +endmenu # IMXRT_FLEXCAN1 + +menu "FLEXCAN2 Configuration" + depends on IMXRT_FLEXCAN2 + +config FLEXCAN2_BITRATE + int "CAN bitrate" + default 1000000 + +config FLEXCAN2_SAMPLEP + int "CAN sample point" + default 80 + +endmenu # IMXRT_FLEXCAN2 + +menu "FLEXCAN3 Configuration" + depends on IMXRT_FLEXCAN3 + +config FLEXCAN3_BITRATE + int "CAN bitrate" + depends on !NET_CAN_CANFD + default 1000000 + +config FLEXCAN3_SAMPLEP + int "CAN sample point" + depends on !NET_CAN_CANFD + default 80 + +config FLEXCAN3_ARBI_BITRATE + int "CAN FD Arbitration phase bitrate" + depends on NET_CAN_CANFD + default 1000000 + +config FLEXCAN3_ARBI_SAMPLEP + int "CAN FD Arbitration phase sample point" + depends on NET_CAN_CANFD + default 80 + +config FLEXCAN3_DATA_BITRATE + int "CAN FD Data phase bitrate" + depends on NET_CAN_CANFD + default 4000000 + +config FLEXCAN3_DATA_SAMPLEP + int "CAN FD Data phase sample point" + depends on NET_CAN_CANFD + default 90 + +endmenu # IMXRT_FLEXCAN3 + +menu "FLEXPWM Peripherals" + +config IMXRT_FLEXPWM1 + bool "FLEXPWM1" + default n + select IMXRT_FLEXPWM + +config IMXRT_FLEXPWM2 + bool "FLEXPWM2" + default n + select IMXRT_FLEXPWM + +if ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +config IMXRT_FLEXPWM3 + bool "FLEXPWM3" + default n + select IMXRT_FLEXPWM + +config IMXRT_FLEXPWM4 + bool "FLEXPWM4" + default n + select IMXRT_FLEXPWM + +endif # ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +endmenu # FLEXPWM Peripherals + +menu "FLEXPWM1 Configuration" + depends on IMXRT_FLEXPWM1 + +config IMXRT_FLEXPWM1_MOD1 + bool "FLEXPWM1 Module 1" + default n + +if IMXRT_FLEXPWM1_MOD1 + +config IMXRT_FLEXPWM1_MOD1_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM1_MOD2 + bool "FLEXPWM1 Module 2" + default n + +if IMXRT_FLEXPWM1_MOD2 + +config IMXRT_FLEXPWM1_MOD2_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM1_MOD3 + bool "FLEXPWM1 Module 3" + default n + +if IMXRT_FLEXPWM1_MOD3 + +config IMXRT_FLEXPWM1_MOD3_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM1_MOD4 + bool "FLEXPWM1 Module 4" + default n + +if IMXRT_FLEXPWM1_MOD4 + +config IMXRT_FLEXPWM1_MOD4_COMP + bool "Use complementary output" + default n + +endif + +endmenu # IMXRT_FLEXPWM1 + +menu "FLEXPWM2 Configuration" + depends on IMXRT_FLEXPWM2 + +config IMXRT_FLEXPWM2_MOD1 + bool "FLEXPWM2 Module 1" + default n + +if IMXRT_FLEXPWM2_MOD1 + +config IMXRT_FLEXPWM2_MOD1_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM2_MOD2 + bool "FLEXPWM2 Module 2" + default n + +if IMXRT_FLEXPWM2_MOD2 + +config IMXRT_FLEXPWM2_MOD2_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM2_MOD3 + bool "FLEXPWM2 Module 3" + default n + +if IMXRT_FLEXPWM2_MOD3 + +config IMXRT_FLEXPWM2_MOD3_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM2_MOD4 + bool "FLEXPWM2 Module 4" + default n + +if IMXRT_FLEXPWM2_MOD4 + +config IMXRT_FLEXPWM2_MOD4_COMP + bool "Use complementary output" + default n + +endif + +endmenu # IMXRT_FLEXPWM2 + +menu "FLEXPWM3 Configuration" + depends on IMXRT_FLEXPWM3 + +config IMXRT_FLEXPWM3_MOD1 + bool "FLEXPWM3 Module 1" + default n + +if IMXRT_FLEXPWM3_MOD1 + +config IMXRT_FLEXPWM3_MOD1_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM3_MOD2 + bool "FLEXPWM3 Module 2" + default n + +if IMXRT_FLEXPWM3_MOD2 + +config IMXRT_FLEXPWM3_MOD2_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM3_MOD3 + bool "FLEXPWM3 Module 3" + default n + +if IMXRT_FLEXPWM3_MOD3 + +config IMXRT_FLEXPWM3_MOD3_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM3_MOD4 + bool "FLEXPWM3 Module 4" + default n + +if IMXRT_FLEXPWM3_MOD4 + +config IMXRT_FLEXPWM3_MOD4_COMP + bool "Use complementary output" + default n + +endif + +endmenu # IMXRT_FLEXPWM3 + +menu "FLEXPWM4 Configuration" + depends on IMXRT_FLEXPWM4 + +config IMXRT_FLEXPWM4_MOD1 + bool "FLEXPWM4 Module 1" + default n + +if IMXRT_FLEXPWM4_MOD1 + +config IMXRT_FLEXPWM4_MOD1_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM4_MOD2 + bool "FLEXPWM4 Module 2" + default n + +if IMXRT_FLEXPWM4_MOD2 + +config IMXRT_FLEXPWM4_MOD2_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM4_MOD3 + bool "FLEXPWM4 Module 3" + default n + +if IMXRT_FLEXPWM4_MOD3 + +config IMXRT_FLEXPWM4_MOD3_COMP + bool "Use complementary output" + default n + +endif + +config IMXRT_FLEXPWM4_MOD4 + bool "FLEXPWM4 Module 4" + default n + +if IMXRT_FLEXPWM4_MOD4 + +config IMXRT_FLEXPWM4_MOD4_COMP + bool "Use complementary output" + default n + +endif + +endmenu # IMXRT_FLEXPWM4 + +menu "LPI2C Peripherals" + +menuconfig IMXRT_LPI2C1 + bool "LPI2C1" + default n + select IMXRT_LPI2C + +if IMXRT_LPI2C1 + +config LPI2C1_BUSYIDLE + int "Bus idle timeout period in clock cycles" + default 0 + +config LPI2C1_FILTSCL + int "I2C master digital glitch filters for SCL input in clock cycles" + default 0 + +config LPI2C1_FILTSDA + int "I2C master digital glitch filters for SDA input in clock cycles" + default 0 + +endif # IMXRT_LPI2C1 + +menuconfig IMXRT_LPI2C2 + bool "LPI2C2" + default n + select IMXRT_LPI2C + +if IMXRT_LPI2C2 + +config LPI2C2_BUSYIDLE + int "Bus idle timeout period in clock cycles" + default 0 + +config LPI2C2_FILTSCL + int "I2C master digital glitch filters for SCL input in clock cycles" + default 0 + +config LPI2C2_FILTSDA + int "I2C master digital glitch filters for SDA input in clock cycles" + default 0 + +endif # IMXRT_LPI2C2 + +menuconfig IMXRT_LPI2C3 + bool "LPI2C3" + default n + select IMXRT_LPI2C + +if IMXRT_LPI2C3 + +config LPI2C3_BUSYIDLE + int "Bus idle timeout period in clock cycles" + default 0 + +config LPI2C3_FILTSCL + int "I2C master digital glitch filters for SCL input in clock cycles" + default 0 + +config LPI2C3_FILTSDA + int "I2C master digital glitch filters for SDA input in clock cycles" + default 0 + +endif # IMXRT_LPI2C3 + +menuconfig IMXRT_LPI2C4 + bool "LPI2C4" + default n + select IMXRT_LPI2C + +if IMXRT_LPI2C4 + +config LPI2C4_BUSYIDLE + int "Bus idle timeout period in clock cycles" + default 0 + +config LPI2C4_FILTSCL + int "I2C master digital glitch filters for SCL input in clock cycles" + default 0 + +config LPI2C4_FILTSDA + int "I2C master digital glitch filters for SDA input in clock cycles" + default 0 + +endif # IMXRT_LPI2C4 +endmenu # LPI2C Peripherals + +menu "LPSPI Peripherals" + +menuconfig IMXRT_LPSPI1 + bool "LPSPI1" + default n + select IMXRT_LPSPI + +menuconfig IMXRT_LPSPI2 + bool "LPSPI2" + default n + select IMXRT_LPSPI + +menuconfig IMXRT_LPSPI3 + bool "LPSPI3" + default n + select IMXRT_LPSPI + +menuconfig IMXRT_LPSPI4 + bool "LPSPI4" + default n + select IMXRT_LPSPI + +endmenu # LPSPI Peripherals + +menu "FLEXSPI Peripherals" + +menuconfig IMXRT_FLEXSPI1 + bool "FLEXSPI1" + default n + select IMXRT_FLEXSPI + +endmenu # FLEXSPI Peripherals + +menu "ADC Peripherals" + +menuconfig IMXRT_ADC1 + bool "ADC1" + default n + select IMXRT_ADC + +menuconfig IMXRT_ADC2 + bool "ADC2" + default n + select IMXRT_ADC + +endmenu + +config IMXRT_SEMC + bool "Smart External Memory Controller (SEMC)" + default n + +config IMXRT_SNVS_LPSRTC + bool "LP SRTC" + default n + select IMXRT_SNVS_HPRTC + +config IMXRT_SNVS_HPRTC + bool "HP RTC" + default n + +config IMXRT_USDHC1 + bool "USDHC1" + default n + select ARCH_HAVE_SDIO + select IMXRT_USDHC + ---help--- + Support USDHC host controller 1 + +config IMXRT_USDHC2 + bool "USDHC2" + default n + select ARCH_HAVE_SDIO + select IMXRT_USDHC + ---help--- + Support USDHC host controller 2 + +menu "ENC Peripherals" + +menuconfig IMXRT_ENC1 + bool "ENC1" + default n + select IMXRT_ENC + +if IMXRT_ENC1 + +config ENC1_INITVAL + int "Initial position counter value" + default 0 + +config ENC1_DIR + bool "Reverse positive rotation direction" + default n + ---help--- + Select if PHASEB leading PHASEA pulses is positive rotation + +config ENC1_FILTPER + int "Input filter sample period in clock cycles" + default 0 + +config ENC1_FILTCNT + int "Number of input samples that filter will compare" + default 0 + +config ENC1_MOD + bool "Enable modulo counting" + default n + +if ENC1_MOD + +config ENC1_MODULUS + hex "Modulus to wrap around" + default 0xffffffff + +endif # ENC1_MOD + +config ENC1_HIP + bool "HOME signal initializes position counter" + default n + +if ENC1_HIP + +config ENC1_HNE + bool "Initialize on negedge of HOME" + default n + +endif # ENC1_HIP + +config ENC1_XIP + bool "INDEX signal initializes position counter" + default n + +if ENC1_XIP + +config ENC1_XNE + bool "Initialize on negedge of INDEX" + default n + +endif # ENC1_XIP + +if DEBUG_SENSORS + +config ENC1_TST_DIR + bool "Generate negative test counter advances" + default n + +config ENC1_TST_PER + int "Period of test pulses in clock cycles" + default 31 + +endif # DEBUG_SENSORS + +endif # IMXRT_ENC1 + +menuconfig IMXRT_ENC2 + bool "ENC2" + default n + select IMXRT_ENC + +if IMXRT_ENC2 + +config ENC2_INITVAL + int "Initial position counter value" + default 0 + +config ENC2_DIR + bool "Reverse positive rotation direction" + default n + ---help--- + Select if PHASEB leading PHASEA pulses is positive rotation + +config ENC2_FILTPER + int "Input filter sample period in clock cycles" + default 0 + +config ENC2_FILTCNT + int "Number of input samples that filter will compare" + default 0 + +config ENC2_MOD + bool "Enable modulo counting" + default n + +if ENC2_MOD + +config ENC2_MODULUS + hex "Modulus to wrap around" + default 0xffffffff + +endif # ENC2_MOD + +config ENC2_HIP + bool "HOME signal initializes position counter" + default n + +if ENC2_HIP + +config ENC2_HNE + bool "Initialize on negedge of HOME" + default n + +endif # ENC2_HIP + +config ENC2_XIP + bool "INDEX signal initializes position counter" + default n + +if ENC2_XIP + +config ENC2_XNE + bool "Initialize on negedge of INDEX" + default n + +endif # ENC2_XIP + +if DEBUG_SENSORS + +config ENC2_TST_DIR + bool "Generate negative test counter advances" + default n + +config ENC2_TST_PER + int "Period of test pulses in clock cycles" + default 31 + +endif # DEBUG_SENSORS + +endif # IMXRT_ENC2 + +if ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +menuconfig IMXRT_ENC3 + bool "ENC3" + default n + select IMXRT_ENC + +if IMXRT_ENC3 + +config ENC3_INITVAL + int "Initial position counter value" + default 0 + +config ENC3_DIR + bool "Reverse positive rotation direction" + default n + ---help--- + Select if PHASEB leading PHASEA pulses is positive rotation + +config ENC3_FILTPER + int "Input filter sample period in clock cycles" + default 0 + +config ENC3_FILTCNT + int "Number of input samples that filter will compare" + default 0 + +config ENC3_MOD + bool "Enable modulo counting" + default n + +if ENC3_MOD + +config ENC3_MODULUS + hex "Modulus to wrap around" + default 0xffffffff + +endif # ENC3_MOD + +config ENC3_HIP + bool "HOME signal initializes position counter" + default n + +if ENC3_HIP + +config ENC3_HNE + bool "Initialize on negedge of HOME" + default n + +endif # ENC3_HIP + +config ENC3_XIP + bool "INDEX signal initializes position counter" + default n + +if ENC3_XIP + +config ENC3_XNE + bool "Initialize on negedge of INDEX" + default n + +endif # ENC3_XIP + +if DEBUG_SENSORS + +config ENC3_TST_DIR + bool "Generate negative test counter advances" + default n + +config ENC3_TST_PER + int "Period of test pulses in clock cycles" + default 31 + +endif # DEBUG_SENSORS + +endif # IMXRT_ENC3 + +menuconfig IMXRT_ENC4 + bool "ENC4" + default n + select IMXRT_ENC + +if IMXRT_ENC4 + +config ENC4_INITVAL + int "Initial position counter value" + default 0 + +config ENC4_DIR + bool "Reverse positive rotation direction" + default n + ---help--- + Select if PHASEB leading PHASEA pulses is positive rotation + +config ENC4_FILTPER + int "Input filter sample period in clock cycles" + default 0 + +config ENC4_FILTCNT + int "Number of input samples that filter will compare" + default 0 + +config ENC4_MOD + bool "Enable modulo counting" + default n + +if ENC4_MOD + +config ENC4_MODULUS + hex "Modulus to wrap around" + default 0xffffffff + +endif # ENC4_MOD + +config ENC4_HIP + bool "HOME signal initializes position counter" + default n + +if ENC4_HIP + +config ENC4_HNE + bool "Initialize on negedge of HOME" + default n + +endif # ENC4_HIP + +config ENC4_XIP + bool "INDEX signal initializes position counter" + default n + +if ENC4_XIP + +config ENC4_XNE + bool "Initialize on negedge of INDEX" + default n + +endif # ENC4_XIP + +if DEBUG_SENSORS + +config ENC4_TST_DIR + bool "Generate negative test counter advances" + default n + +config ENC4_TST_PER + int "Period of test pulses in clock cycles" + default 31 + +endif # DEBUG_SENSORS + +endif # IMXRT_ENC4 + +endif # ARCH_FAMILY_IMXRT105x || ARCH_FAMILY_IMXRT106x + +endmenu # ENC Peripherals + +endmenu # i.MX RT Peripheral Selection + +menuconfig IMXRT_GPIO_IRQ + bool "GPIO Interrupt Support" + default n + +if IMXRT_GPIO_IRQ + +config IMXRT_GPIO1_0_15_IRQ + bool "GPIO1 Pins 0-15 interrupts" + default n + +config IMXRT_GPIO1_16_31_IRQ + bool "GPIO1 Pins 16-31 interrupts" + default n + +config IMXRT_GPIO2_0_15_IRQ + bool "GPIO2 Pins 0-15 interrupts" + default n + +config IMXRT_GPIO2_16_31_IRQ + bool "GPIO2 Pins 16-31 interrupts" + default n + +config IMXRT_GPIO3_0_15_IRQ + bool "GPIO3 Pins 0-15 interrupts" + default n + +config IMXRT_GPIO3_16_31_IRQ + bool "GPIO3 Pins 16-31 interrupts" + default n + +config IMXRT_GPIO4_0_15_IRQ + bool "GPIO4 Pins 0-15 interrupts" + default n + +config IMXRT_GPIO4_16_31_IRQ + bool "GPIO4 Pins 16-31 interrupts" + default n + +config IMXRT_GPIO5_0_15_IRQ + bool "GPIO5 Pins 0-15 interrupts" + default n + +config IMXRT_GPIO5_16_31_IRQ + bool "GPIO5 Pins 16-31 interrupts" + default n + +config IMXRT_GPIO6_0_15_IRQ + bool "GPIO6 Pins 0-15 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO6_16_31_IRQ + bool "GPIO6 Pins 16-31 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO7_0_15_IRQ + bool "GPIO7 Pins 0-15 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO7_16_31_IRQ + bool "GPIO7 Pins 16-31 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO8_0_15_IRQ + bool "GPIO8 Pins 0-15 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO8_16_31_IRQ + bool "GPIO8 Pins 16-31 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO9_0_15_IRQ + bool "GPIO9 Pins 0-15 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +config IMXRT_GPIO9_16_31_IRQ + bool "GPIO9 Pins 16-31 interrupts" + default n + depends on IMXRT_HIGHSPEED_GPIO + +endif # IMXRT_GPIO_IRQ + +menu "Ethernet Configuration" + depends on IMXRT_ENET + +config IMXRT_ENET_NRXBUFFERS + int "Number Rx buffers" + default 6 + +config IMXRT_ENET_NTXBUFFERS + int "Number Tx buffers" + default 2 + +config IMXRT_ENET_ENHANCEDBD + bool # not optional + default n + +config IMXRT_ENET_NETHIFS + int # Not optional + default 1 + +config IMXRT_ENET_PHYINIT + bool "Board-specific PHY Initialization" + default n + ---help--- + Some boards require specialized initialization of the PHY before it + can be used. This may include such things as configuring GPIOs, + resetting the PHY, etc. If CONFIG_IMXRT_ENET_PHYINIT is defined in + the configuration then the board specific logic must provide + imxrt_phy_boardinitialize(); The i.MXRT ENET driver will call this + function one time before it first uses the PHY. + +endmenu # IMXRT_ENET + +menu "Memory Configuration" + +config IMXRT_DTCM + int "FLEXRAM DTCM Size in K" + default 128 + depends on ARMV7M_HAVE_DTCM + +config IMXRT_ITCM + int "FLEXRAM ITCM Size in K" + default 128 + depends on ARMV7M_HAVE_ITCM + +config IMXRT_SEMC_SDRAM + bool "External SDRAM installed" + default n + depends on IMXRT_SEMC + +if IMXRT_SEMC_SDRAM + +config IMXRT_SDRAM_START + hex "SDRAM start address" + default 0x10000000 + +config IMXRT_SDRAM_SIZE + int "SDRAM size (bytes)" + default 268435456 + +endif # IMXRT_SEMC_SDRAM + +config IMXRT_SEMC_SRAM + bool "External SRAM installed" + default n + depends on IMXRT_SEMC + +if IMXRT_SEMC_SRAM + +config IMXRT_SRAM_START + hex "SRAM start address" + default 0x10000000 + +config IMXRT_SRAM_SIZE + int "SRAM size (bytes)" + default 268435456 + +endif # IMXRT_SRAM_SIZE + +config IMXRT_SEMC_NOR + bool "External NOR FLASH installed" + default n + depends on IMXRT_SEMC + +choice + prompt "i.MX RT Boot Configuration" + default IMXRT_BOOT_NOR if IMXRT_SEMC_NOR + default IMXRT_BOOT_SDRAM if IMXRT_SEMC_SDRAM && !IMXRT_SEMC_NOR + default IMXRT_BOOT_SRAM if IMXRT_SEMC_SRAM && !IMXRT_SEMC_SDRAM && !IMXRT_SEMC_NOR + default IMXRT_BOOT_OCRAM if !IMXRT_SEMC_SRAM && !IMXRT_SEMC_SDRAM && !IMXRT_SEMC_NOR + ---help--- + The startup code needs to know if the code is running from internal + OCRAM, external SDRAM, external NOR, or external SDRAM in order to + initialize properly. Note that the boot device is not known for + cases where the code is copied into RAM by a bootloader. + +config IMXRT_BOOT_OCRAM + bool "Running from internal OCRAM" + select BOOT_RUNFROMISRAM + +config IMXRT_BOOT_SDRAM + bool "Running from external SDRAM" + select BOOT_RUNFROMSDRAM + depends on IMXRT_SEMC_SDRAM + +config IMXRT_BOOT_NOR + bool "Running from external NOR FLASH" + select BOOT_RUNFROMFLASH + depends on IMXRT_SEMC_NOR + +config IMXRT_BOOT_SRAM + bool "Running from external SRAM" + select BOOT_RUNFROMEXTSRAM + depends on IMXRT_SEMC_SRAM + +endchoice # i.MX RT Boot Configuration + +choice + prompt "i.MX RT Primary RAM" + default IMXRT_OCRAM_PRIMARY + ---help--- + The primary RAM is the RAM that contains the system BLOB's .data and + .bss. The unused portion of the primary RAM will automatically be + added to the system heap. + +config IMXRT_OCRAM_PRIMARY + bool "Internal OCRAM primary" + +config IMXRT_SDRAM_PRIMARY + bool "External SDRAM primary" + depends on IMXRT_SEMC_SDRAM + +config IMXRT_SRAM_PRIMARY + bool "External SRAM primary" + depends on IMXRT_SEMC_SRAM + +endchoice # i.MX RT Primary RAM + +menu "i.MX RT Heap Configuration" + +config IMXRT_OCRAM_HEAP + bool "Add OCRAM to heap" + depends on !IMXRT_OCRAM_PRIMARY + ---help--- + Select to add the entire OCRAM to the heap + +config IMXRT_DTCM_HEAP + bool "Add DTCM to heap" + depends on IMXRT_DTCM > 0 + ---help--- + Select to add the entire DTCM to the heap + +config IMXRT_BOOTLOADER_HEAP + bool "Add ROM bootloader 40Kib RAM to heap" + default false + depends on BOOT_RUNFROMISRAM + ---help--- + Select to add the memory used by the ROM bootloader to heap + +config IMXRT_SDRAM_HEAP + bool "Add SDRAM to heap" + depends on IMXRT_SEMC_SDRAM && !IMXRT_SDRAM_PRIMARY + ---help--- + Add a region of SDRAM to the heap. A region of SDRAM will be added + to the heap that starts at (CONFIG_IMXRT_SDRAM_START + + CONFIG_IMXRT_SDRAM_HEAPOFFSET) and extends up to + (CONFIG_IMXRT_SDRAM_START + CONFIG_IMXRT_SDRAM_SIZE). Note that the + START is the actual start of SDRAM but SIZE is not necessarily the + actual SIZE. + +config IMXRT_SDRAM_HEAPOFFSET + hex "SDRAM heap offset" + default 0x0 + depends on IMXRT_SDRAM_HEAP + ---help--- + Used to reserve memory at the beginning of SDRAM for, as an example, + a framebuffer. + +config IMXRT_SRAM_HEAP + bool "Add SRAM to heap" + depends on IMXRT_SEMC_SRAM && !IMXRT_SRAM_PRIMARY + ---help--- + Add a region of SRAM to the heap. A region of SDRAM will be added + to the heap that starts at (CONFIG_IMXRT_SRAM_START + + CONFIG_IMXRT_SRAM_HEAPOFFSET) and extends up to + (CONFIG_IMXRT_SRAM_START + CONFIG_IMXRT_SRAM_SIZE). Note that the + START is the actual start of SRAM but SIZE is not necessarily the + actual SIZE. + +config IMXRT_SRAM_HEAPOFFSET + hex "SRAM heap offset" + default 0x0 + depends on IMXRT_SRAM_HEAP + ---help--- + Used to reserve memory at the beginning of SRAM for, as an example, + a framebuffer. + +endmenu # i.MX RT Heap Configuration +endmenu # Memory Configuration + +menu "LPI2C Configuration" + depends on IMXRT_LPI2C + +config IMXRT_LPI2C_DYNTIMEO + bool "Use dynamic timeouts" + default n + depends on IMXRT_LPI2C + +config IMXRT_LPI2C_DYNTIMEO_USECPERBYTE + int "Timeout Microseconds per Byte" + default 500 + depends on IMXRT_LPI2C_DYNTIMEO + +config IMXRT_LPI2C_DYNTIMEO_STARTSTOP + int "Timeout for Start/Stop (Milliseconds)" + default 1000 + depends on IMXRT_LPI2C_DYNTIMEO + +config IMXRT_LPI2C_TIMEOSEC + int "Timeout seconds" + default 0 + depends on IMXRT_LPI2C + +config IMXRT_LPI2C_TIMEOMS + int "Timeout Milliseconds" + default 500 + depends on IMXRT_LPI2C && !IMXRT_LPI2C_DYNTIMEO + +config IMXRT_LPI2C_TIMEOTICKS + int "Timeout for Done and Stop (ticks)" + default 500 + depends on IMXRT_LPI2C && !IMXRT_LPI2C_DYNTIMEO + +endmenu # LPI2C Configuration + +menu "USDHC Configuration" + depends on IMXRT_USDHC + +config IMXRT_USDHC_DMA + bool "Support DMA data transfers" + default y + select SDIO_DMA + ---help--- + Support DMA data transfers. + Enable SD card DMA data transfers. This is marginally optional. + For most usages, SD accesses will cause data overruns if used without + DMA. + +choice + prompt "Bus width for USDHC1" + default IMXRT_USDHC1_WIDTH_D1_ONLY + depends on IMXRT_USDHC1 + +config IMXRT_USDHC1_WIDTH_D1_ONLY + bool "One bit" + +config IMXRT_USDHC1_WIDTH_D1_D4 + bool "Four bit" +endchoice + +config IMXRT_USDHC1_INVERT_CD + bool "Invert the USDHC1 CD" + default n + depends on IMXRT_USDHC1 + ---help--- + If the board defines PIN_USDHC1_CD the CD_B input to the USDHC it is + assumed to be active low. Selecting IMXRT_USDHC1_INVERT_CD will make it + active high. + + If the board defines PIN_USDHC1_CD_GPIO it is assumed to be active low. + Selecting IMXRT_USDHC1_INVERT_CD will make it active high. + +choice + depends on IMXRT_USDHC2 + prompt "Bus width for USDHC2" + default IMXRT_USDHC2_WIDTH_D1_D4 + +config IMXRT_USDHC2_WIDTH_D1_ONLY + bool "One bit" + +config IMXRT_USDHC2_WIDTH_D1_D4 + bool "Four bit" + +config IMXRT_USDHC2_WIDTH_D1_D8 + bool "Eight bit" +endchoice + +config IMXRT_USDHC2_INVERT_CD + bool "Invert the USDHC2 CD" + default n + depends on IMXRT_USDHC2 + ---help--- + If the board defines PIN_USDHC2_CD the CD_B input to the USDHC it is + assumed to be active low. Selecting IMXRT_USDHC_INVERT_CD will make it + active high. + + If the board defines PIN_USDHC2_CD_GPIO it is assumed to be active low. + Selecting IMXRT_USDHC2_INVERT_CD will make it active high. + +endmenu # USDHC Configuration + +menu "eDMA Configuration" + depends on IMXRT_EDMA + +config IMXRT_EDMA_NTCD + int "Number of transfer descriptors" + default 0 + ---help--- + Number of pre-allocated transfer descriptors. Needed for scatter- + gather DMA. Make to be set to zero to disable in-memory TCDs in + which case only the TCD channel registers will be used and scatter- + will not be supported. + +config IMXRT_EDMA_ELINK + bool "Channeling Linking" + default n + ---help--- + This option enables optional minor or major loop channel linking: + + Minor loop channel linking: As the channel completes the minor + loop, this flag enables linking to another channel. The link target + channel initiates a channel service request via an internal + mechanism that sets the TCDn_CSR[START] bit of the specified + channel. + + If minor loop channel linking is disabled, this link mechanism is + suppressed in favor of the major loop channel linking. + + Major loop channel linking: As the channel completes the minor + loop, this option enables the linking to another channel. The link + target channel initiates a channel service request via an internal + mechanism that sets the TCDn_CSR[START] bit of the linked channel. + +config IMXRT_EDMA_ERCA + bool "Round Robin Channel Arbitration" + default n + ---help--- + Normally, a fixed priority arbitration is used for channel + selection. If this option is selected, round robin arbitration is + used for channel selection. + +config IMXRT_EDMA_HOE + bool "Halt On Error" + default y + ---help--- + Any error causes the HALT bit to set. Subsequently, all service + requests are ignored until the HALT bit is cleared. + +config IMXRT_EDMA_CLM + bool "Continuous Link Mode" + default n + ---help--- + By default, A minor loop channel link made to itself goes through + channel arbitration before being activated again. If this option is + selected, a minor loop channel link made to itself does not go + through channel arbitration before being activated again. Upon minor + loop completion, the channel activates again if that channel has a + minor loop channel link enabled and the link channel is itself. This + effectively applies the minor loop offsets and restarts the next + minor loop. + +config IMXRT_EDMA_EMLIM + bool "Minor Loop Mapping" + default n + ---help--- + Normally TCD word 2 is a 32-bit NBYTES field. When this option is + enabled, TCD word 2 is redefined to include individual enable fields, + an offset field, and the NBYTES field. The individual enable fields + allow the minor loop offset to be applied to the source address, the + destination address, or both. The NBYTES field is reduced when either + offset is enabled. + +config IMXRT_EDMA_EDBG + bool "Enable Debug" + default n + ---help--- + When in debug mode, the DMA stalls the start of a new channel. Executing + channels are allowed to complete. Channel execution resumes when the + system exits debug mode or the EDBG bit is cleared + +endmenu # eDMA Global Configuration + +if PM + +config IMXRT_PM_SERIAL_ACTIVITY + int "PM serial activity" + default 10 + ---help--- + PM activity reported to power management logic on every serial + interrupt. + +endif + +menu "RTC Configuration" + depends on IMXRT_SNVS_HPRTC + +config IMXRT_RTC_MAGIC_REG + int "RTC SNVS GPR" + default 0 + range 0 3 + ---help--- + The BKP register used to store/check the Magic value to determine if + RTC is already setup + +config IMXRT_RTC_MAGIC + hex "RTC Magic 1" + default 0xfacefeed + ---help--- + Value used as Magic to determine if the RTC is already setup + +endmenu + +menu "LCD Configuration" + depends on IMXRT_LCD + +config IMXRT_LCD_VIDEO_PLL_FREQ + int "Video PLL Frequency" + default 92000000 + range 41500000 1300000000 + ---help--- + Frequency of Video PLL. + +config IMXRT_LCD_VRAMBASE + hex "Video RAM base address" + default 0x80000000 + ---help--- + Base address of the video RAM frame buffer. + Default: SDRAM + +config IMXRT_LCD_REFRESH_FREQ + int "LCD refresh rate (Hz)" + default 60 + ---help--- + LCD refresh rate (Hz) + +config IMXRT_LCD_BACKLIGHT + bool "Enable backlight" + default y + ---help--- + Enable backlight support. If IMXRT_LCD_BACKLIGHT is selected, then + the board-specific logic must provide this IMXRT_backlight() + interface so that the LCD driver can turn the backlight on and off + as necessary. You should select this option and implement + IMXRT_backlight() if your board provides GPIO control over the + backlight. This interface provides only ON/OFF control of the + backlight. If you want finer control over the backlight level (for + example, using PWM), then this interface would need to be extended. + +choice + prompt "Input Bits per pixel" + default IMXRT_LCD_INPUT_BPP16 + +config IMXRT_LCD_INPUT_BPP8_LUT + bool "8 BPP Color Map" + select FB_CMAP + +config IMXRT_LCD_INPUT_BPP8 + bool "8 BPP RGB_332" + +config IMXRT_LCD_INPUT_BPP15 + bool "16 BPP RGB_555" + +config IMXRT_LCD_INPUT_BPP16 + bool "16 BPP RGB_565" + +config IMXRT_LCD_INPUT_BPP24 + bool "24 BPP RGB_888" + +config IMXRT_LCD_INPUT_BPP32 + bool "32 BPP RGB_0888" + +endchoice + +config IMXRT_LCD_BGR + bool "Blue-Green-Red color order" + default n + ---help--- + This option selects BGR color order vs. default RGB + +choice + prompt "Output Bus width" + default IMXRT_LCD_OUTPUT_16 + +config IMXRT_LCD_OUTPUT_8 + bool "8 Bit LCD Bus" + +config IMXRT_LCD_OUTPUT_16 + bool "16 Bit LCD Bus" + +config IMXRT_LCD_OUTPUT_18 + bool "18 Bit LCD Bus" + +config IMXRT_LCD_OUTPUT_24 + bool "24 Bit LCD Bus" + +endchoice + +config IMXRT_LCD_BACKCOLOR + hex "Initial background color" + default 0x0 + ---help--- + Initial background color + +config IMXRT_LCD_HWIDTH + int "Display width (pixels)" + default 480 + ---help--- + Horizontal width the display in pixels + +config IMXRT_LCD_HPULSE + int "Horizontal pulse" + default 41 + +config IMXRT_LCD_HFRONTPORCH + int "Horizontal front porch" + default 4 + +config IMXRT_LCD_HBACKPORCH + int "Horizontal back porch" + default 8 + +config IMXRT_LCD_VHEIGHT + int "Display height (rows)" + default 272 + ---help--- + Vertical height of the display in rows + +config IMXRT_LCD_VPULSE + int "Vertical pulse" + default 10 + +config IMXRT_LCD_VFRONTPORCH + int "Vertical front porch" + default 4 + +config IMXRT_LCD_VBACKPORCH + int "Vertical back porch" + default 2 + +config IMXRT_VSYNC_ACTIVE_HIGH + bool "V-sync active high" + default n + +config IMXRT_HSYNC_ACTIVE_HIGH + bool "H-sync active high" + default n + +config IMXRT_DATAEN_ACTIVE_HIGH + bool "Data enable active high" + default y + +config IMXRT_DATA_RISING_EDGE + bool "Data clock rising edge" + default y + +endmenu # LCD Configuration + +menu "Timer Configuration" + +if SCHED_TICKLESS + +config IMXRT_TICKLESS_TIMER + int "Tickless hardware timer" + default 1 + range 1 2 + ---help--- + If the Tickless OS feature is enabled, then one clock must be + assigned to provided the GPT timer needed by the OS. + +config IMXRT_TICKLESS_CHANNEL + int "Tickless timer channel" + default 1 + range 1 3 + ---help--- + If the Tickless OS feature is enabled, the one clock must be + assigned to provided the free-running timer needed by the OS + and one channel on that clock is needed to handle intervals. + +endif # SCHED_TICKLESS + +endmenu # Timer Configuration + +if IMXRT_USBOTG && USBHOST + +menu "USB host controller driver (HCD) options" + +config IMXRT_EHCI_NQHS + int "Number of Queue Head (QH) structures" + default 4 + ---help--- + Configurable number of Queue Head (QH) structures. The default is + one per Root hub port plus one for EP0 (4). + +config IMXRT_EHCI_NQTDS + int "Number of Queue Element Transfer Descriptor (qTDs)" + default 6 + ---help--- + Configurable number of Queue Element Transfer Descriptor (qTDs). + The default is one per root hub plus three from EP0 (6). + +config IMXRT_EHCI_BUFSIZE + int "Size of one request/descriptor buffer" + default 128 + ---help--- + The size of one request/descriptor buffer in bytes. The TD buffe + size must be an even number of 32-bit words and must be large enough + to hangle the largest transfer via a SETUP request. + +config IMXRT_EHCI_PREALLOCATE + bool "Preallocate descriptor pool" + default y + ---help--- + Select this option to pre-allocate EHCI queue and descriptor + structure pools in .bss. Otherwise, these pools will be + dynamically allocated using kmm_memalign(). + +endmenu # USB host controller driver (HCD) options +endif # IMXRT_USBOTG && USBHOST + +if IMXRT_USBDEV + +menu "USB device controller driver (DCD) options" + +config IMXRT_USBDEV_NOVBUS + bool "No USB VBUS sensing" + default n + +config IMXRT_USBDEV_FRAME_INTERRUPT + bool "USB frame interrupt" + default n + ---help--- + Handle USB Start-Of-Frame events. Enable reading SOF from interrupt + handler vs. simply reading on demand. Probably a bad idea... Unless + there is some issue with sampling the SOF from hardware asynchronously. + +config IMXRT_USBDEV_REGDEBUG + bool "Register level debug" + depends on DEBUG_USB_INFO + default n + ---help--- + Output detailed register-level USB device debug information. Requires + also CONFIG_DEBUG_USB_INFO. + +endmenu # USB device controller driver (DCD) options +endif # IMXRT_USBDEV + +endif # ARCH_CHIP_IMXRT diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig index 1c5a46d02..fb486dc23 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig @@ -447,13 +447,13 @@ config ARCH_BOARD_IMXRT1050_EVK config ARCH_BOARD_IMXRT1052_OK bool "NXP i.MX RT 1052 OK" - depends on ARCH_CHIP_MIMXRT1052DVL6A + depends on ARCH_CHIP_MIMXRT1052CVL5B select ARCH_HAVE_LEDS select ARCH_HAVE_BUTTONS select ARCH_HAVE_IRQBUTTONS ---help--- This is the board configuration for the port of NuttX to the NXP i.MXRT - evaluation kit, MIMXRT1052-OK. This board features the MIMXRT1052DVL6A MCU. + evaluation kit, MIMXRT1052-OK. This board features the MIMXRT1052CVL5B MCU. config ARCH_BOARD_IMXRT1060_EVK bool "NXP i.MX RT 1060 EVK" From 40d0320ef8a94e5bd0daadc335fe19bc7fc307c6 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 21 Mar 2022 19:04:18 +0800 Subject: [PATCH 08/25] add qs-fx and qs-fs sensor support Nuttx on stm32f407-discovery --- .../Applications/sensor_app/Makefile | 8 +++++ .../sensor_app/winddirection_qs_fx.c | 2 ++ .../Applications/sensor_app/windspeed_qs_fs.c | 2 ++ .../Framework/sensor/winddirection/Kconfig | 5 ++++ .../Framework/sensor/winddirection/Make.defs | 4 +++ .../sensor/winddirection/qs-fx/Make.defs | 6 ++++ .../sensor/winddirection/qs-fx/Makefile | 12 ++++++-- .../sensor/winddirection/qs-fx/qs-fx.c | 15 +++++++++- .../Framework/sensor/windspeed/Kconfig | 5 ++++ .../Framework/sensor/windspeed/Make.defs | 4 +++ .../sensor/windspeed/qs-fs/Make.defs | 6 ++++ .../Framework/sensor/windspeed/qs-fs/Makefile | 12 ++++++-- .../Framework/sensor/windspeed/qs-fs/qs-fs.c | 12 ++++++++ .../Nuttx/app_match_nuttx/apps/nshlib/Kconfig | 8 +++++ .../Nuttx/app_match_nuttx/apps/nshlib/nsh.h | 8 +++++ .../apps/nshlib/nsh_Applicationscmd.c | 29 +++++++++++++++++++ .../app_match_nuttx/apps/nshlib/nsh_command.c | 8 +++++ 17 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 APP_Framework/Framework/sensor/winddirection/Make.defs create mode 100644 APP_Framework/Framework/sensor/winddirection/qs-fx/Make.defs create mode 100644 APP_Framework/Framework/sensor/windspeed/Make.defs create mode 100644 APP_Framework/Framework/sensor/windspeed/qs-fs/Make.defs diff --git a/APP_Framework/Applications/sensor_app/Makefile b/APP_Framework/Applications/sensor_app/Makefile index 54daa1592..76fd4e16c 100644 --- a/APP_Framework/Applications/sensor_app/Makefile +++ b/APP_Framework/Applications/sensor_app/Makefile @@ -47,6 +47,14 @@ ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) CSRCS += temperature_hs300x.c endif + ifeq ($(CONFIG_APPLICATION_SENSOR_WINDDIRECTION_QS_FX), y) + CSRCS += winddirection_qs_fx.c + endif + + ifeq ($(CONFIG_APPLICATION_SENSOR_WINDSPEED_QS_FS), y) + CSRCS += windspeed_qs_fs.c + endif + include $(APPDIR)/Application.mk endif diff --git a/APP_Framework/Applications/sensor_app/winddirection_qs_fx.c b/APP_Framework/Applications/sensor_app/winddirection_qs_fx.c index 455b64ec1..d5032718b 100644 --- a/APP_Framework/Applications/sensor_app/winddirection_qs_fx.c +++ b/APP_Framework/Applications/sensor_app/winddirection_qs_fx.c @@ -34,5 +34,7 @@ void WindDirectionQsFx(void) printf("wind direction : %d degree\n", result); SensorQuantityClose(wind_direction); } +#ifdef ADD_XIZI_FETURES SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, WindDirectionQsFx, WindDirectionQsFx, WindDirectionQsFx function); +#endif diff --git a/APP_Framework/Applications/sensor_app/windspeed_qs_fs.c b/APP_Framework/Applications/sensor_app/windspeed_qs_fs.c index 006296aac..72b91db6e 100644 --- a/APP_Framework/Applications/sensor_app/windspeed_qs_fs.c +++ b/APP_Framework/Applications/sensor_app/windspeed_qs_fs.c @@ -34,5 +34,7 @@ void WindSpeedQsFs(void) printf("wind speed : %d.%d m/s\n", result/10, result%10); SensorQuantityClose(wind_speed); } +#ifdef ADD_XIZI_FETURES SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, WindSpeedQsFs, WindSpeedQsFs, WindSpeedQsFs function); +#endif diff --git a/APP_Framework/Framework/sensor/winddirection/Kconfig b/APP_Framework/Framework/sensor/winddirection/Kconfig index 94b2385f0..726bfea8a 100644 --- a/APP_Framework/Framework/sensor/winddirection/Kconfig +++ b/APP_Framework/Framework/sensor/winddirection/Kconfig @@ -34,6 +34,11 @@ config SENSOR_QS_FX endif if ADD_NUTTX_FETURES + config SENSOR_DEVICE_QS_FX_DEV + string "qs-fx device name" + default "/dev/ttyS1" + ---help--- + If USART1 is selected, then fill in /dev/ttyS1 here. endif diff --git a/APP_Framework/Framework/sensor/winddirection/Make.defs b/APP_Framework/Framework/sensor/winddirection/Make.defs new file mode 100644 index 000000000..75fed1c91 --- /dev/null +++ b/APP_Framework/Framework/sensor/winddirection/Make.defs @@ -0,0 +1,4 @@ +############################################################################ +# APP_Framework/Framework/sensor/winddirection/Make.defs +############################################################################ +include $(wildcard $(APPDIR)/../../../APP_Framework/Framework/sensor/winddirection/*/Make.defs) diff --git a/APP_Framework/Framework/sensor/winddirection/qs-fx/Make.defs b/APP_Framework/Framework/sensor/winddirection/qs-fx/Make.defs new file mode 100644 index 000000000..8d9518b2d --- /dev/null +++ b/APP_Framework/Framework/sensor/winddirection/qs-fx/Make.defs @@ -0,0 +1,6 @@ +############################################################################ +# APP_Framework/Framework/sensor/winddirection/qs-fx/Make.defs +############################################################################ +ifneq ($(CONFIG_SENSOR_QS_FX),) +CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/sensor/winddirection/qs-fx +endif diff --git a/APP_Framework/Framework/sensor/winddirection/qs-fx/Makefile b/APP_Framework/Framework/sensor/winddirection/qs-fx/Makefile index 4752b388f..e45522588 100644 --- a/APP_Framework/Framework/sensor/winddirection/qs-fx/Makefile +++ b/APP_Framework/Framework/sensor/winddirection/qs-fx/Makefile @@ -1,3 +1,11 @@ -SRC_FILES := qs-fx.c +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) + include $(APPDIR)/Make.defs + CSRCS += qs-fx.c + include $(APPDIR)/Application.mk +endif -include $(KERNEL_ROOT)/compiler.mk +ifeq ($(CONFIG_ADD_XIZI_FETURES),y) + SRC_FILES := qs-fx.c + include $(KERNEL_ROOT)/compiler.mk +endif diff --git a/APP_Framework/Framework/sensor/winddirection/qs-fx/qs-fx.c b/APP_Framework/Framework/sensor/winddirection/qs-fx/qs-fx.c index 6f3c7ad13..24a6cb726 100644 --- a/APP_Framework/Framework/sensor/winddirection/qs-fx/qs-fx.c +++ b/APP_Framework/Framework/sensor/winddirection/qs-fx/qs-fx.c @@ -35,6 +35,18 @@ static struct SensorProductInfo info = * @param sdev - sensor device pointer * @return success: 1 , failure: other */ +#ifdef ADD_NUTTX_FETURES +static int SensorDeviceOpen(struct SensorDevice *sdev) +{ + sdev->fd = PrivOpen(SENSOR_DEVICE_QS_FX_DEV, O_RDWR); + if (sdev->fd < 0) { + printf("open %s error\n", SENSOR_DEVICE_QS_FX_DEV); + return -1; + } + + return sdev->fd ; +} +#else static int SensorDeviceOpen(struct SensorDevice *sdev) { int result = 0; @@ -64,7 +76,8 @@ static int SensorDeviceOpen(struct SensorDevice *sdev) result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg); return result; -} +} +#endif /** * @description: Read sensor device diff --git a/APP_Framework/Framework/sensor/windspeed/Kconfig b/APP_Framework/Framework/sensor/windspeed/Kconfig index 8db034a35..91bc1fb92 100644 --- a/APP_Framework/Framework/sensor/windspeed/Kconfig +++ b/APP_Framework/Framework/sensor/windspeed/Kconfig @@ -34,6 +34,11 @@ config SENSOR_QS_FS endif if ADD_NUTTX_FETURES + config SENSOR_DEVICE_QS_FS_DEV + string "qs-fx device name" + default "/dev/ttyS1" + ---help--- + If USART1 is selected, then fill in /dev/ttyS1 here. endif diff --git a/APP_Framework/Framework/sensor/windspeed/Make.defs b/APP_Framework/Framework/sensor/windspeed/Make.defs new file mode 100644 index 000000000..ae9715416 --- /dev/null +++ b/APP_Framework/Framework/sensor/windspeed/Make.defs @@ -0,0 +1,4 @@ +############################################################################ +# APP_Framework/Framework/sensor/windspeed/Make.defs +############################################################################ +include $(wildcard $(APPDIR)/../../../APP_Framework/Framework/sensor/windspeed/*/Make.defs) diff --git a/APP_Framework/Framework/sensor/windspeed/qs-fs/Make.defs b/APP_Framework/Framework/sensor/windspeed/qs-fs/Make.defs new file mode 100644 index 000000000..8edbfb6f7 --- /dev/null +++ b/APP_Framework/Framework/sensor/windspeed/qs-fs/Make.defs @@ -0,0 +1,6 @@ +############################################################################ +# APP_Framework/Framework/sensor/windspeed/qs-fs/Make.defs +############################################################################ +ifneq ($(CONFIG_SENSOR_QS_FS),) +CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/sensor/windspeed/qs-fs +endif diff --git a/APP_Framework/Framework/sensor/windspeed/qs-fs/Makefile b/APP_Framework/Framework/sensor/windspeed/qs-fs/Makefile index 32a4000d0..a6872570e 100644 --- a/APP_Framework/Framework/sensor/windspeed/qs-fs/Makefile +++ b/APP_Framework/Framework/sensor/windspeed/qs-fs/Makefile @@ -1,3 +1,11 @@ -SRC_FILES := qs-fs.c +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) + include $(APPDIR)/Make.defs + CSRCS += qs-fs.c + include $(APPDIR)/Application.mk +endif -include $(KERNEL_ROOT)/compiler.mk +ifeq ($(CONFIG_ADD_XIZI_FETURES),y) + SRC_FILES := qs-fs.c + include $(KERNEL_ROOT)/compiler.mk +endif diff --git a/APP_Framework/Framework/sensor/windspeed/qs-fs/qs-fs.c b/APP_Framework/Framework/sensor/windspeed/qs-fs/qs-fs.c index 6478fd2c9..427fa8273 100644 --- a/APP_Framework/Framework/sensor/windspeed/qs-fs/qs-fs.c +++ b/APP_Framework/Framework/sensor/windspeed/qs-fs/qs-fs.c @@ -35,6 +35,17 @@ static struct SensorProductInfo info = * @param sdev - sensor device pointer * @return success: 1 , failure: other */ +#ifdef ADD_NUTTX_FETURES +static int SensorDeviceOpen(struct SensorDevice *sdev) +{ + sdev->fd = PrivOpen(SENSOR_DEVICE_QS_FS_DEV, O_RDWR); + if (sdev->fd < 0) { + printf("open %s error\n", SENSOR_DEVICE_QS_FS_DEV); + return -1; + } + return sdev->fd; +} +#else static int SensorDeviceOpen(struct SensorDevice *sdev) { int result = 0; @@ -65,6 +76,7 @@ static int SensorDeviceOpen(struct SensorDevice *sdev) return result; } +#endif /** * @description: Read sensor device diff --git a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/Kconfig b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/Kconfig index 0ce94d01a..f84148ed5 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/Kconfig +++ b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/Kconfig @@ -630,6 +630,14 @@ config NSH_DISABLE_TEMPHS300X config NSH_DISABLE_HUMIHS300X bool "Disable the humidity function of the sensor Hs300x." default n + +config NSH_DISABLE_QS_FX + bool "Disable the winddirection function of the sensor QS-FX." + default n + +config NSH_DISABLE_QS_FS + bool "Disable the windspeed function of the sensor QS-FS." + default n config NSH_DISABLE_OPENZIGBEE bool "Disable the open function of the zigebee." diff --git a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh.h b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh.h index a10aa150d..f23773552 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh.h +++ b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh.h @@ -1461,6 +1461,14 @@ int nsh_foreach_var(FAR struct nsh_vtbl_s *vtbl, nsh_foreach_var_t cb, int cmd_HumiHs300x(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif +#if defined(CONFIG_APPLICATION_SENSOR_WINDDIRECTION_QS_FX) && !defined(CONFIG_NSH_DISABLE_QS_FX) + int cmd_WindDirectionQsFx(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif + +#if defined(CONFIG_APPLICATION_SENSOR_WINDSPEED_QS_FS) && !defined(CONFIG_NSH_DISABLE_QS_FS) + int cmd_WindSpeedQsFs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif + #if defined(CONFIG_CONNECTION_ADAPTER_ZIGBEE) && !defined(CONFIG_NSH_DISABLE_OPENZIGBEE) int cmd_openzigbee(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); diff --git a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c index f42fec198..68a5da9d4 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c +++ b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c @@ -204,6 +204,35 @@ int cmd_HumiHs300x(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) } #endif +/**************************************************************************** + * Name: cmd_WindDirectionQsFx + ****************************************************************************/ + +#if defined(CONFIG_APPLICATION_SENSOR_WINDDIRECTION_QS_FX) && !defined(CONFIG_NSH_DISABLE_QS_FX) +extern void WindDirectionQsFx(void); +int cmd_WindDirectionQsFx(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + nsh_output(vtbl, "Hello, world!\n"); + FrameworkInit(); + WindDirectionQsFx(); + return OK; +} +#endif + +/**************************************************************************** + * Name: cmd_WindSpeedQsFs + ****************************************************************************/ + +#if defined(CONFIG_APPLICATION_SENSOR_WINDSPEED_QS_FS) && !defined(CONFIG_NSH_DISABLE_QS_FS) +extern void WindSpeedQsFs(void); +int cmd_WindSpeedQsFs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + nsh_output(vtbl, "Hello, world!\n"); + FrameworkInit(); + WindSpeedQsFs(); + return OK; +} +#endif /**************************************************************************** * Name: cmd_openzigbee diff --git a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_command.c b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_command.c index a60bc254f..8cd21e468 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_command.c +++ b/Ubiquitous/Nuttx/app_match_nuttx/apps/nshlib/nsh_command.c @@ -634,6 +634,14 @@ static const struct cmdmap_s g_cmdmap[] = { "humi", cmd_HumiHs300x, 1, 1, "[get humidity with sensor HS300x.]" }, #endif +#if defined(CONFIG_APPLICATION_SENSOR_WINDDIRECTION_QS_FX) && !defined(CONFIG_NSH_DISABLE_QS_FX) + { "WindDirectionQsFx", cmd_WindDirectionQsFx, 1, 1, "[get WindDirection with sensor QsFx.]" }, +#endif + +#if defined(CONFIG_APPLICATION_SENSOR_WINDSPEED_QS_FS) && !defined(CONFIG_NSH_DISABLE_QS_FS) + { "WindSpeedQsFs", cmd_WindSpeedQsFs, 1, 1, "[get WindSpeed with sensor QsFs.]" }, +#endif + #if defined(CONFIG_CONNECTION_ADAPTER_ZIGBEE) && !defined(CONFIG_NSH_DISABLE_OPENZIGBEE) { "openzigbee", cmd_openzigbee, 1, 1, "[open the zigebee device.]" }, #endif From 8aa53e3aadcff21dfd295b907722a76ee10c97e1 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Tue, 22 Mar 2022 10:06:28 +0800 Subject: [PATCH 09/25] change BOARD_CPU_FREQUENCY to 528000000 --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h index 646432e5c..7c49fc26b 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h @@ -93,6 +93,8 @@ */ #define BOARD_XTAL_FREQUENCY 24000000 +#define BOARD_CPU_FREQUENCY 528000000 + #define IMXRT_PRE_PERIPH_CLK_SEL CCM_CBCMR_PRE_PERIPH_CLK_SEL_PLL1 #define IMXRT_PERIPH_CLK_SEL CCM_CBCDR_PERIPH_CLK_SEL_PRE_PERIPH #define IMXRT_ARM_PLL_DIV_SELECT 100 @@ -118,8 +120,8 @@ #define IMXRT_USB1_PLL_DIV_SELECT CCM_ANALOG_PLL_USB1_DIV_SELECT_20 -#define BOARD_CPU_FREQUENCY \ - (BOARD_XTAL_FREQUENCY * (IMXRT_ARM_PLL_DIV_SELECT / 2)) / IMXRT_ARM_PODF_DIVIDER +// #define BOARD_CPU_FREQUENCY \ +// (BOARD_XTAL_FREQUENCY * (IMXRT_ARM_PLL_DIV_SELECT / 2)) / IMXRT_ARM_PODF_DIVIDER /* Define this to enable tracing */ From 8a7a7035b3cbfdc59091abdae70eaf8507de0522 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Tue, 22 Mar 2022 17:11:31 +0800 Subject: [PATCH 10/25] set CONFIG_SCHED_WAITPID=y for disable the application is put into the background for execution --- .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 + Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 2 ++ 3 files changed, 4 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index a417efe5d..9c24bd419 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -36,6 +36,7 @@ CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=536870912 CONFIG_RAM_START=0x20200000 CONFIG_SCHED_CPULOAD=y +CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index b3998028a..b0986eb9d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -56,6 +56,7 @@ CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 3d682848c..001dbabd2 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -20,6 +20,7 @@ CONFIG_ARMV7M_USEBASEPRI=y CONFIG_BOARD_LOOPSPERMSEC=104926 CONFIG_BUILTIN=y CONFIG_CLOCK_MONOTONIC=y +CONFIG_EXAMPLES_HELLO=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_IMXRT_LPUART1=y @@ -33,6 +34,7 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 +CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y From 0541171749f91e129b8604ff59aa26774f9ac1be Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Tue, 22 Mar 2022 18:09:29 +0800 Subject: [PATCH 11/25] set CONFIG_DEFAULT_SMALL=y for disable the application is put into the background for execution --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 001dbabd2..b337b79d1 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -19,6 +19,7 @@ CONFIG_ARMV7M_ICACHE=y CONFIG_ARMV7M_USEBASEPRI=y CONFIG_BOARD_LOOPSPERMSEC=104926 CONFIG_BUILTIN=y +CONFIG_DEFAULT_SMALL=y CONFIG_CLOCK_MONOTONIC=y CONFIG_EXAMPLES_HELLO=y CONFIG_FS_PROCFS=y From 5525c1062717ec91ab088e3c783eaa2a0871c4b2 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Wed, 23 Mar 2022 09:33:38 +0800 Subject: [PATCH 12/25] set CONFIG_DEFAULT_SMALL=y for disable the application is put into the background for execution remove CONFIG_DEFAULT_SMALL=y --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index b337b79d1..001dbabd2 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -19,7 +19,6 @@ CONFIG_ARMV7M_ICACHE=y CONFIG_ARMV7M_USEBASEPRI=y CONFIG_BOARD_LOOPSPERMSEC=104926 CONFIG_BUILTIN=y -CONFIG_DEFAULT_SMALL=y CONFIG_CLOCK_MONOTONIC=y CONFIG_EXAMPLES_HELLO=y CONFIG_FS_PROCFS=y From 034fb66f77a660dcfa5747e1299ae1ca6b626fd3 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Wed, 23 Mar 2022 12:06:36 +0800 Subject: [PATCH 13/25] fix up_registerdump set CONFIG_ARCH_INTERRUPTSTACK --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 + Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index e75a746fc..7bda4e8dd 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -13,6 +13,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y +CONFIG_ARCH_INTERRUPTSTACK=1536 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index 9c24bd419..34c5b488e 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -12,6 +12,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y +CONFIG_ARCH_INTERRUPTSTACK=1536 CONFIG_ARCH_STACKDUMP=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_LOOPSPERMSEC=20000 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index b0986eb9d..18528b672 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -13,6 +13,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y +CONFIG_ARCH_INTERRUPTSTACK=1536 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 001dbabd2..516ee639e 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -12,6 +12,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y +CONFIG_ARCH_INTERRUPTSTACK=1536 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y From b868fb6c8a8ac826e0e78e2fb6bf7f17088f8652 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Wed, 23 Mar 2022 14:01:13 +0800 Subject: [PATCH 14/25] fix up_registerdump set CONFIG_ARCH_INTERRUPTSTACK=10240 --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig | 2 +- .../Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 2 +- .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 2 +- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index 7bda4e8dd..15a659983 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -13,7 +13,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y -CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_INTERRUPTSTACK=10240 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index 34c5b488e..aca6fb61d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -12,7 +12,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y -CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_INTERRUPTSTACK=10240 CONFIG_ARCH_STACKDUMP=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_LOOPSPERMSEC=20000 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index 18528b672..8cd6f8ecf 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -13,7 +13,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y -CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_INTERRUPTSTACK=10240 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 516ee639e..9b4920876 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -12,7 +12,7 @@ CONFIG_ARCH_BOARD_IMXRT1052_OK=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y -CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_INTERRUPTSTACK=10240 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_DCACHE=y CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y From b92edeecee42b509087bdc8760eb3722f5ac174e Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Wed, 23 Mar 2022 14:30:05 +0800 Subject: [PATCH 15/25] add Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c add imxrt_serial.c to app_match_nuttx/nuttx/arch/arm/src/imxrt --- .../nuttx/arch/arm/src/imxrt/imxrt_serial.c | 1833 +++++++++++++++++ 1 file changed, 1833 insertions(+) create mode 100644 Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c new file mode 100644 index 000000000..2b9fc124d --- /dev/null +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c @@ -0,0 +1,1833 @@ +/**************************************************************************** + * arch/arm/src/imxrt/imxrt_serial.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_SERIAL_TERMIOS +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "chip.h" +#include "arm_arch.h" +#include "arm_internal.h" + +#include "hardware/imxrt_lpuart.h" +#include "imxrt_gpio.h" +#include "hardware/imxrt_pinmux.h" +#include "imxrt_config.h" +#include "imxrt_lowputc.h" + +#ifdef USE_SERIALDRIVER + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Which LPUART with be tty0/console and which tty1-7? The console will + * always be ttyS0. If there is no console then will use the lowest + * numbered UART. + */ + +/* First pick the console and ttys0. This could be any of LPUART1-8 */ + +#if defined(CONFIG_LPUART1_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart1port /* LPUART1 is console */ +# define TTYS0_DEV g_uart1port /* LPUART1 is ttyS0 */ +# define UART1_ASSIGNED 1 +#elif defined(CONFIG_LPUART2_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart2port /* LPUART2 is console */ +# define TTYS0_DEV g_uart2port /* LPUART2 is ttyS0 */ +# define UART2_ASSIGNED 1 +#elif defined(CONFIG_LPUART3_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart3port /* LPUART3 is console */ +# define TTYS0_DEV g_uart3port /* LPUART3 is ttyS0 */ +# define UART3_ASSIGNED 1 +#elif defined(CONFIG_LPUART4_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart4port /* LPUART4 is console */ +# define TTYS0_DEV g_uart4port /* LPUART4 is ttyS0 */ +# define UART4_ASSIGNED 1 +#elif defined(CONFIG_LPUART5_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart5port /* LPUART5 is console */ +# define TTYS0_DEV g_uart5port /* LPUART5 is ttyS0 */ +# define UART5_ASSIGNED 1 +#elif defined(CONFIG_LPUART6_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart6port /* LPUART6 is console */ +# define TTYS0_DEV g_uart6port /* LPUART6 is ttyS0 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_LPUART7_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart7port /* LPUART7 is console */ +# define TTYS0_DEV g_uart7port /* LPUART7 is ttyS0 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_LPUART8_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart8port /* LPUART8 is console */ +# define TTYS0_DEV g_uart8port /* LPUART8 is ttyS0 */ +# define UART8_ASSIGNED 1 +#else +# undef CONSOLE_DEV /* No console */ +# if defined(CONFIG_IMXRT_LPUART1) +# define TTYS0_DEV g_uart1port /* LPUART1 is ttyS0 */ +# define UART1_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART2) +# define TTYS0_DEV g_uart2port /* LPUART2 is ttyS0 */ +# define UART2_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART3) +# define TTYS0_DEV g_uart3port /* LPUART3 is ttyS0 */ +# define UART3_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART4) +# define TTYS0_DEV g_uart4port /* LPUART4 is ttyS0 */ +# define UART4_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART5) +# define TTYS0_DEV g_uart5port /* LPUART5 is ttyS0 */ +# define UART5_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART6) +# define TTYS0_DEV g_uart6port /* LPUART6 is ttyS0 */ +# define UART6_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART7) +# define TTYS0_DEV g_uart7port /* LPUART7 is ttyS0 */ +# define UART7_ASSIGNED 1 +# elif defined(CONFIG_IMXRT_LPUART8) +# define TTYS0_DEV g_uart8port /* LPUART8 is ttyS0 */ +# define UART8_ASSIGNED 1 +# endif +#endif + +/* Pick ttys1. This could be any of UART1-8 excluding the console UART. + * One of UART1-8 could be the console; one of UART1-8 has already been + * assigned to ttys0. + */ + +#if defined(CONFIG_IMXRT_LPUART1) && !defined(UART1_ASSIGNED) +# define TTYS1_DEV g_uart1port /* LPUART1 is ttyS1 */ +# define UART1_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART2) && !defined(UART2_ASSIGNED) +# define TTYS1_DEV g_uart2port /* LPUART2 is ttyS1 */ +# define UART2_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART3) && !defined(UART3_ASSIGNED) +# define TTYS1_DEV g_uart3port /* LPUART3 is ttyS1 */ +# define UART3_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART4) && !defined(UART4_ASSIGNED) +# define TTYS1_DEV g_uart4port /* LPUART4 is ttyS1 */ +# define UART4_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART5) && !defined(UART5_ASSIGNED) +# define TTYS1_DEV g_uart5port /* LPUART5 is ttyS1 */ +# define UART5_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART6) && !defined(UART6_ASSIGNED) +# define TTYS1_DEV g_uart6port /* LPUART6 is ttyS1 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS1_DEV g_uart7port /* LPUART7 is ttyS1 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS1_DEV g_uart8port /* LPUART8 is ttyS1 */ +# define UART8_ASSIGNED 1 +#endif + +/* Pick ttys2. This could be one of UART2-8. It can't be UART1 because that + * was either assigned as ttyS0 or ttys1. One of UART 1-8 could be the + * console. One of UART2-8 has already been assigned to ttys0 or ttyS1. + */ + +#if defined(CONFIG_IMXRT_LPUART2) && !defined(UART2_ASSIGNED) +# define TTYS2_DEV g_uart2port /* LPUART2 is ttyS2 */ +# define UART2_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART3) && !defined(UART3_ASSIGNED) +# define TTYS2_DEV g_uart3port /* LPUART3 is ttyS2 */ +# define UART3_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART4) && !defined(UART4_ASSIGNED) +# define TTYS2_DEV g_uart4port /* LPUART4 is ttyS2 */ +# define UART4_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART5) && !defined(UART5_ASSIGNED) +# define TTYS2_DEV g_uart5port /* LPUART5 is ttyS2 */ +# define UART5_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART6) && !defined(UART6_ASSIGNED) +# define TTYS2_DEV g_uart6port /* LPUART6 is ttyS2 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS2_DEV g_uart7port /* LPUART7 is ttyS2 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS2_DEV g_uart8port /* LPUART8 is ttyS2 */ +# define UART8_ASSIGNED 1 +#endif + +/* Pick ttys3. This could be one of UART3-8. It can't be UART1-2 because + * those have already been assigned to ttsyS0, 1, or 2. One of + * UART3-8 could also be the console. One of UART3-8 has already + * been assigned to ttys0, 1, or 3. + */ + +#if defined(CONFIG_IMXRT_LPUART3) && !defined(UART3_ASSIGNED) +# define TTYS3_DEV g_uart3port /* LPUART3 is ttyS3 */ +# define UART3_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART4) && !defined(UART4_ASSIGNED) +# define TTYS3_DEV g_uart4port /* LPUART4 is ttyS3 */ +# define UART4_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART5) && !defined(UART5_ASSIGNED) +# define TTYS3_DEV g_uart5port /* LPUART5 is ttyS3 */ +# define UART5_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART6) && !defined(UART6_ASSIGNED) +# define TTYS3_DEV g_uart6port /* LPUART6 is ttyS3 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS3_DEV g_uart7port /* LPUART7 is ttyS3 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS3_DEV g_uart8port /* LPUART8 is ttyS3 */ +# define UART8_ASSIGNED 1 +#endif + +/* Pick ttys4. This could be one of UART4-8. It can't be UART1-3 because + * those have already been assigned to ttsyS0, 1, 2 or 3. One of + * UART 4-8 could be the console. One of UART4-8 has already been + * assigned to ttys0, 1, 3, or 4. + */ + +#if defined(CONFIG_IMXRT_LPUART4) && !defined(UART4_ASSIGNED) +# define TTYS4_DEV g_uart4port /* LPUART4 is ttyS4 */ +# define UART4_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART5) && !defined(UART5_ASSIGNED) +# define TTYS4_DEV g_uart5port /* LPUART5 is ttyS4 */ +# define UART5_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART6) && !defined(UART6_ASSIGNED) +# define TTYS4_DEV g_uart6port /* LPUART6 is ttyS4 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS4_DEV g_uart7port /* LPUART7 is ttyS4 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS4_DEV g_uart8port /* LPUART8 is ttyS4 */ +# define UART8_ASSIGNED 1 +#endif + +/* Pick ttys5. This could be one of UART5-8. It can't be UART1-4 because + * those have already been assigned to ttsyS0, 1, 2, 3 or 4. One of + * UART 5-8 could be the console. One of UART5-8 has already been + * assigned to ttys0, 1, 2, 3, or 4. + */ + +#if defined(CONFIG_IMXRT_LPUART5) && !defined(UART5_ASSIGNED) +# define TTYS5_DEV g_uart5port /* LPUART5 is ttyS5 */ +# define UART5_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART6) && !defined(UART6_ASSIGNED) +# define TTYS5_DEV g_uart6port /* LPUART6 is ttyS5 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS5_DEV g_uart7port /* LPUART7 is ttyS5 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS5_DEV g_uart8port /* LPUART8 is ttyS5 */ +# define UART8_ASSIGNED 1 +#endif + +/* Pick ttys6. This could be one of UART6-8. It can't be UART1-5 because + * those have already been assigned to ttsyS0, 1, 2, 3, 4 or 5. One of + * UART 6-8 could be the console. One of UART6-8 has already been + * assigned to ttys0, 1, 2, 3, 4 or 5. + */ + +#if defined(CONFIG_IMXRT_LPUART6) && !defined(UART6_ASSIGNED) +# define TTYS6_DEV g_uart6port /* LPUART6 is ttyS5 */ +# define UART6_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS6_DEV g_uart7port /* LPUART7 is ttyS5 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS6_DEV g_uart8port /* LPUART8 is ttyS5 */ +# define UART8_ASSIGNED 1 +#endif + +/* Pick ttys7. This could be one of UART7-8. It can't be UART1-6 because + * those have already been assigned to ttsyS0, 1, 2, 3, 4, 5 or 6. One of + * UART 7-8 could be the console. One of UART7-8 has already been + * assigned to ttys0, 1, 2, 3, 4, 5 or 6. + */ + +#if defined(CONFIG_IMXRT_LPUART7) && !defined(UART7_ASSIGNED) +# define TTYS7_DEV g_uart7port /* LPUART7 is ttyS5 */ +# define UART7_ASSIGNED 1 +#elif defined(CONFIG_IMXRT_LPUART8) && !defined(UART8_ASSIGNED) +# define TTYS7_DEV g_uart8port /* LPUART8 is ttyS5 */ +# define UART8_ASSIGNED 1 +#endif + +/* UART, if available, should have been assigned to ttyS0-7. */ + +/* Power management definitions */ + +#if defined(CONFIG_PM) && !defined(CONFIG_IMXRT_PM_SERIAL_ACTIVITY) +# define CONFIG_IMXRT_PM_SERIAL_ACTIVITY 10 +#endif + +#if defined(CONFIG_PM) +# define PM_IDLE_DOMAIN 0 /* Revisit */ +#endif + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct imxrt_uart_s +{ + uint32_t uartbase; /* Base address of UART registers */ + uint32_t baud; /* Configured baud */ + uint32_t ie; /* Saved enabled interrupts */ + uint8_t irq; /* IRQ associated with this UART */ + uint8_t parity; /* 0=none, 1=odd, 2=even */ + uint8_t bits; /* Number of bits (7 or 8) */ +#if defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL) + uint8_t inviflow:1; /* Invert RTS sense */ + const uint32_t rts_gpio; /* U[S]ART RTS GPIO pin configuration */ +#endif +#ifdef CONFIG_SERIAL_OFLOWCONTROL + const uint32_t cts_gpio; /* U[S]ART CTS GPIO pin configuration */ +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + const uint32_t tx_gpio; /* TX GPIO pin configuration */ +#endif + + uint8_t stopbits2:1; /* 1: Configure with 2 stop bits vs 1 */ +#ifdef CONFIG_SERIAL_IFLOWCONTROL + uint8_t iflow:1; /* input flow control (RTS) enabled */ +#endif +#ifdef CONFIG_SERIAL_OFLOWCONTROL + uint8_t oflow:1; /* output flow control (CTS) enabled */ +#endif +#ifdef CONFIG_SERIAL_RS485CONTROL + uint8_t rs485mode:1; /* We are in RS485 (RTS on TX) mode */ +#endif +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static inline uint32_t imxrt_serialin(struct imxrt_uart_s *priv, + uint32_t offset); +static inline void imxrt_serialout(struct imxrt_uart_s *priv, + uint32_t offset, uint32_t value); +static inline void imxrt_disableuartint(struct imxrt_uart_s *priv, + uint32_t *ie); +static inline void imxrt_restoreuartint(struct imxrt_uart_s *priv, + uint32_t ie); + +static int imxrt_setup(struct uart_dev_s *dev); +static void imxrt_shutdown(struct uart_dev_s *dev); +static int imxrt_attach(struct uart_dev_s *dev); +static void imxrt_detach(struct uart_dev_s *dev); +static int imxrt_interrupt(int irq, void *context, FAR void *arg); +static int imxrt_ioctl(struct file *filep, int cmd, unsigned long arg); +static int imxrt_receive(struct uart_dev_s *dev, unsigned int *status); +static void imxrt_rxint(struct uart_dev_s *dev, bool enable); +static bool imxrt_rxavailable(struct uart_dev_s *dev); +static void imxrt_send(struct uart_dev_s *dev, int ch); +static void imxrt_txint(struct uart_dev_s *dev, bool enable); +static bool imxrt_txready(struct uart_dev_s *dev); +static bool imxrt_txempty(struct uart_dev_s *dev); + +#ifdef CONFIG_PM +static void up_pm_notify(struct pm_callback_s *cb, int dowmin, + enum pm_state_e pmstate); +static int up_pm_prepare(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Serial driver UART operations */ + +static const struct uart_ops_s g_uart_ops = +{ + .setup = imxrt_setup, + .shutdown = imxrt_shutdown, + .attach = imxrt_attach, + .detach = imxrt_detach, + .ioctl = imxrt_ioctl, + .receive = imxrt_receive, + .rxint = imxrt_rxint, + .rxavailable = imxrt_rxavailable, +#ifdef CONFIG_SERIAL_IFLOWCONTROL + .rxflowcontrol = NULL, +#endif + .send = imxrt_send, + .txint = imxrt_txint, + .txready = imxrt_txready, + .txempty = imxrt_txempty, +}; + +/* I/O buffers */ + +#ifdef CONFIG_IMXRT_LPUART1 +static char g_uart1rxbuffer[CONFIG_LPUART1_RXBUFSIZE]; +static char g_uart1txbuffer[CONFIG_LPUART1_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART2 +static char g_uart2rxbuffer[CONFIG_LPUART2_RXBUFSIZE]; +static char g_uart2txbuffer[CONFIG_LPUART2_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART3 +static char g_uart3rxbuffer[CONFIG_LPUART3_RXBUFSIZE]; +static char g_uart3txbuffer[CONFIG_LPUART3_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART4 +static char g_uart4rxbuffer[CONFIG_LPUART4_RXBUFSIZE]; +static char g_uart4txbuffer[CONFIG_LPUART4_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART5 +static char g_uart5rxbuffer[CONFIG_LPUART5_RXBUFSIZE]; +static char g_uart5txbuffer[CONFIG_LPUART5_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART6 +static char g_uart6rxbuffer[CONFIG_LPUART6_RXBUFSIZE]; +static char g_uart6txbuffer[CONFIG_LPUART6_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART7 +static char g_uart7rxbuffer[CONFIG_LPUART7_RXBUFSIZE]; +static char g_uart7txbuffer[CONFIG_LPUART7_TXBUFSIZE]; +#endif + +#ifdef CONFIG_IMXRT_LPUART8 +static char g_uart8rxbuffer[CONFIG_LPUART8_RXBUFSIZE]; +static char g_uart8txbuffer[CONFIG_LPUART8_TXBUFSIZE]; +#endif + +/* This describes the state of the IMXRT lpuart1 port. */ + +#ifdef CONFIG_IMXRT_LPUART1 +static struct imxrt_uart_s g_uart1priv = +{ + .uartbase = IMXRT_LPUART1_BASE, + .baud = CONFIG_LPUART1_BAUD, + .irq = IMXRT_IRQ_LPUART1, + .parity = CONFIG_LPUART1_PARITY, + .bits = CONFIG_LPUART1_BITS, + .stopbits2 = CONFIG_LPUART1_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART1_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART1_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART1_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART1_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART1_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART1_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART1_TX, +#endif + +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART1_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART1_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart1port = +{ + .recv = + { + .size = CONFIG_LPUART1_RXBUFSIZE, + .buffer = g_uart1rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART1_TXBUFSIZE, + .buffer = g_uart1txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart1priv, +}; +#endif + +/* This describes the state of the IMXRT lpuart2 port. */ + +#ifdef CONFIG_IMXRT_LPUART2 +static struct imxrt_uart_s g_uart2priv = +{ + .uartbase = IMXRT_LPUART2_BASE, + .baud = CONFIG_LPUART2_BAUD, + .irq = IMXRT_IRQ_LPUART2, + .parity = CONFIG_LPUART2_PARITY, + .bits = CONFIG_LPUART2_BITS, + .stopbits2 = CONFIG_LPUART2_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART2_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART2_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART2_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART2_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART2_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART2_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART2_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART2_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART2_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart2port = +{ + .recv = + { + .size = CONFIG_LPUART2_RXBUFSIZE, + .buffer = g_uart2rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART2_TXBUFSIZE, + .buffer = g_uart2txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart2priv, +}; +#endif + +#ifdef CONFIG_IMXRT_LPUART3 +static struct imxrt_uart_s g_uart3priv = +{ + .uartbase = IMXRT_LPUART3_BASE, + .baud = CONFIG_LPUART3_BAUD, + .irq = IMXRT_IRQ_LPUART3, + .parity = CONFIG_LPUART3_PARITY, + .bits = CONFIG_LPUART3_BITS, + .stopbits2 = CONFIG_LPUART3_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART3_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART3_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART3_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART3_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART3_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART3_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART3_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART3_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART3_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart3port = +{ + .recv = + { + .size = CONFIG_LPUART3_RXBUFSIZE, + .buffer = g_uart3rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART3_TXBUFSIZE, + .buffer = g_uart3txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart3priv, +}; +#endif + +#ifdef CONFIG_IMXRT_LPUART4 +static struct imxrt_uart_s g_uart4priv = +{ + .uartbase = IMXRT_LPUART4_BASE, + .baud = CONFIG_LPUART4_BAUD, + .irq = IMXRT_IRQ_LPUART4, + .parity = CONFIG_LPUART4_PARITY, + .bits = CONFIG_LPUART4_BITS, + .stopbits2 = CONFIG_LPUART4_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART4_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART4_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART4_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART4_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART4_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART4_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART4_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART4_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART4_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart4port = +{ + .recv = + { + .size = CONFIG_LPUART4_RXBUFSIZE, + .buffer = g_uart4rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART4_TXBUFSIZE, + .buffer = g_uart4txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart4priv, +}; +#endif + +#ifdef CONFIG_IMXRT_LPUART5 +static struct imxrt_uart_s g_uart5priv = +{ + .uartbase = IMXRT_LPUART5_BASE, + .baud = CONFIG_LPUART5_BAUD, + .irq = IMXRT_IRQ_LPUART5, + .parity = CONFIG_LPUART5_PARITY, + .bits = CONFIG_LPUART5_BITS, + .stopbits2 = CONFIG_LPUART5_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART5_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART5_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART5_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART5_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART5_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART5_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART5_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART5_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART5_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart5port = +{ + .recv = + { + .size = CONFIG_LPUART5_RXBUFSIZE, + .buffer = g_uart5rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART5_TXBUFSIZE, + .buffer = g_uart5txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart5priv, +}; +#endif + +#ifdef CONFIG_IMXRT_LPUART6 +static struct imxrt_uart_s g_uart6priv = +{ + .uartbase = IMXRT_LPUART6_BASE, + .baud = CONFIG_LPUART6_BAUD, + .irq = IMXRT_IRQ_LPUART6, + .parity = CONFIG_LPUART6_PARITY, + .bits = CONFIG_LPUART6_BITS, + .stopbits2 = CONFIG_LPUART6_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART6_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART6_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART6_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART6_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART6_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART6_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART6_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART6_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART6_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart6port = +{ + .recv = + { + .size = CONFIG_LPUART6_RXBUFSIZE, + .buffer = g_uart6rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART6_TXBUFSIZE, + .buffer = g_uart6txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart6priv, +}; +#endif + +#ifdef CONFIG_IMXRT_LPUART7 +static struct imxrt_uart_s g_uart7priv = +{ + .uartbase = IMXRT_LPUART7_BASE, + .baud = CONFIG_LPUART7_BAUD, + .irq = IMXRT_IRQ_LPUART7, + .parity = CONFIG_LPUART7_PARITY, + .bits = CONFIG_LPUART7_BITS, + .stopbits2 = CONFIG_LPUART7_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART7_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART7_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART7_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART7_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART7_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART7_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART7_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART7_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART7_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart7port = +{ + .recv = + { + .size = CONFIG_LPUART7_RXBUFSIZE, + .buffer = g_uart7rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART7_TXBUFSIZE, + .buffer = g_uart7txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart7priv, +}; +#endif + +#ifdef CONFIG_IMXRT_LPUART8 +static struct imxrt_uart_s g_uart8priv = +{ + .uartbase = IMXRT_LPUART8_BASE, + .baud = CONFIG_LPUART8_BAUD, + .irq = IMXRT_IRQ_LPUART8, + .parity = CONFIG_LPUART8_PARITY, + .bits = CONFIG_LPUART8_BITS, + .stopbits2 = CONFIG_LPUART8_2STOP, +#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_LPUART8_OFLOWCONTROL) + .oflow = 1, + .cts_gpio = GPIO_LPUART8_CTS, +#endif +#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART8_IFLOWCONTROL) + .iflow = 1, +#endif +# if ((defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART8_RS485RTSCONTROL)) \ + || (defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_LPUART8_IFLOWCONTROL))) + .rts_gpio = GPIO_LPUART8_RTS, +#endif +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + .tx_gpio = GPIO_LPUART8_TX, +#endif +#if (((defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL))) \ + && defined(CONFIG_LPUART8_INVERTIFLOWCONTROL)) + .inviflow = 1, +#endif + +#if defined(CONFIG_SERIAL_RS485CONTROL) && defined(CONFIG_LPUART8_RS485RTSCONTROL) + .rs485mode = 1, +#endif +}; + +static struct uart_dev_s g_uart8port = +{ + .recv = + { + .size = CONFIG_LPUART8_RXBUFSIZE, + .buffer = g_uart8rxbuffer, + }, + .xmit = + { + .size = CONFIG_LPUART8_TXBUFSIZE, + .buffer = g_uart8txbuffer, + }, + .ops = &g_uart_ops, + .priv = &g_uart8priv, +}; +#endif + +#ifdef CONFIG_PM +static struct pm_callback_s g_serial_pmcb = +{ + .notify = up_pm_notify, + .prepare = up_pm_prepare, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_serialin + ****************************************************************************/ + +static inline uint32_t imxrt_serialin(struct imxrt_uart_s *priv, + uint32_t offset) +{ + return getreg32(priv->uartbase + offset); +} + +/**************************************************************************** + * Name: imxrt_serialout + ****************************************************************************/ + +static inline void imxrt_serialout(struct imxrt_uart_s *priv, + uint32_t offset, uint32_t value) +{ + putreg32(value, priv->uartbase + offset); +} + +/**************************************************************************** + * Name: imxrt_disableuartint + ****************************************************************************/ + +static inline void imxrt_disableuartint(struct imxrt_uart_s *priv, + uint32_t *ie) +{ + irqstate_t flags; + uint32_t regval; + + flags = spin_lock_irqsave(NULL); + regval = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET); + + /* Return the current Rx and Tx interrupt state */ + + if (ie != NULL) + { + *ie = regval & LPUART_ALL_INTS; + } + + regval &= ~LPUART_ALL_INTS; + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, regval); + spin_unlock_irqrestore(NULL, flags); +} + +/**************************************************************************** + * Name: imxrt_restoreuartint + ****************************************************************************/ + +static inline void imxrt_restoreuartint(struct imxrt_uart_s *priv, + uint32_t ie) +{ + irqstate_t flags; + uint32_t regval; + + /* Enable/disable any interrupts that are currently disabled but should be + * enabled/disabled. + */ + + flags = spin_lock_irqsave(NULL); + regval = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET); + regval &= ~LPUART_ALL_INTS; + regval |= ie; + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, regval); + spin_unlock_irqrestore(NULL, flags); +} + +/**************************************************************************** + * Name: imxrt_setup + * + * Description: + * Configure the UART baud, bits, parity, fifos, etc. This + * method is called the first time that the serial port is + * opened. + * + ****************************************************************************/ + +static int imxrt_setup(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; +#ifndef CONFIG_SUPPRESS_LPUART_CONFIG + int ret; + struct uart_config_s config = + { + 0 + }; + + /* Configure the UART */ + + config.baud = priv->baud; /* Configured baud */ + config.parity = priv->parity; /* 0=none, 1=odd, 2=even */ + config.bits = priv->bits; /* Number of bits (5-9) */ + config.stopbits2 = priv->stopbits2; /* true: Configure with 2 stop bits instead of 1 */ +#ifdef CONFIG_SERIAL_IFLOWCONTROL + config.usects = priv->iflow; /* Flow control on inbound side */ +#endif +#ifdef CONFIG_SERIAL_OFLOWCONTROL + config.userts = priv->oflow; /* Flow control on outbound side */ +#endif +#ifdef CONFIG_SERIAL_RS485CONTROL + config.users485 = priv->rs485mode; /* Switch into RS485 mode */ +#endif +#if defined(CONFIG_SERIAL_RS485CONTROL) || defined(CONFIG_SERIAL_IFLOWCONTROL) + config.invrts = priv->inviflow; /* Inversion of outbound flow control */ +#endif + + ret = imxrt_lpuart_configure(priv->uartbase, &config); + + priv->ie = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET) & \ + LPUART_ALL_INTS; + return ret; + +#else + priv->ie = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET) & \ + LPUART_ALL_INTS; + return OK; +#endif +} + +/**************************************************************************** + * Name: imxrt_shutdown + * + * Description: + * Disable the UART. This method is called when the serial + * port is closed + * + ****************************************************************************/ + +static void imxrt_shutdown(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + + /* Disable the UART */ + + imxrt_serialout(priv, IMXRT_LPUART_GLOBAL_OFFSET, LPUART_GLOBAL_RST); +} + +/**************************************************************************** + * Name: imxrt_attach + * + * Description: + * Configure the UART to operation in interrupt driven mode. This method + * is called when the serial port is opened. Normally, this is just after + * the setup() method is called, however, the serial console may operate + * in a non-interrupt driven mode during the boot phase. + * + * RX and TX interrupts are not enabled when by the attach method (unless + * the hardware supports multiple levels of interrupt enabling). The RX + * and TX interrupts are not enabled until the txint() and rxint() methods + * are called. + * + ****************************************************************************/ + +static int imxrt_attach(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + int ret; + + /* Attach and enable the IRQ */ + + ret = irq_attach(priv->irq, imxrt_interrupt, dev); + if (ret == OK) + { + /* Enable the interrupt (RX and TX interrupts are still disabled + * in the UART + */ + + up_enable_irq(priv->irq); + } + + return ret; +} + +/**************************************************************************** + * Name: imxrt_detach + * + * Description: + * Detach UART interrupts. This method is called when the serial port is + * closed normally just before the shutdown method is called. The + * exception is the serial console which is never shutdown. + * + ****************************************************************************/ + +static void imxrt_detach(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + + up_disable_irq(priv->irq); + irq_detach(priv->irq); +} + +/**************************************************************************** + * Name: imxrt_interrupt (and front-ends) + * + * Description: + * This is the common UART interrupt handler. It should call + * uart_transmitchars or uart_receivechar to perform the appropriate data + * transfers. + * + ****************************************************************************/ + +static int imxrt_interrupt(int irq, void *context, FAR void *arg) +{ + struct uart_dev_s *dev = (struct uart_dev_s *)arg; + struct imxrt_uart_s *priv; + uint32_t usr; + int passes = 0; + bool handled; + + DEBUGASSERT(dev != NULL && dev->priv != NULL); + priv = (struct imxrt_uart_s *)dev->priv; + +#if defined(CONFIG_PM) && CONFIG_IMXRT_PM_SERIAL_ACTIVITY > 0 + /* Report serial activity to the power management logic */ + + pm_activity(PM_IDLE_DOMAIN, CONFIG_IMXRT_PM_SERIAL_ACTIVITY); +#endif + + /* Loop until there are no characters to be transferred or, + * until we have been looping for a long time. + */ + + handled = true; + for (passes = 0; passes < 256 && handled; passes++) + { + handled = false; + + /* Get the current UART status and check for loop + * termination conditions + */ + + usr = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET); + usr &= (LPUART_STAT_RDRF | LPUART_STAT_TDRE | LPUART_STAT_OR | + LPUART_STAT_FE); + + /* Clear serial overrun and framing errors */ + + if ((usr & LPUART_STAT_OR) != 0) + { + imxrt_serialout(priv, IMXRT_LPUART_STAT_OFFSET, LPUART_STAT_OR); + } + + if ((usr & LPUART_STAT_FE) != 0) + { + imxrt_serialout(priv, IMXRT_LPUART_STAT_OFFSET, LPUART_STAT_FE); + } + + /* Handle incoming, receive bytes */ + + if ((usr & LPUART_STAT_RDRF) != 0 && + (priv->ie & LPUART_CTRL_RIE) != 0) + { + uart_recvchars(dev); + handled = true; + } + + /* Handle outgoing, transmit bytes */ + + if ((usr & LPUART_STAT_TDRE) != 0 && + (priv->ie & LPUART_CTRL_TIE) != 0) + { + uart_xmitchars(dev); + handled = true; + } + } + + return OK; +} + +/**************************************************************************** + * Name: imxrt_ioctl + * + * Description: + * All ioctl calls will be routed through this method + * + ****************************************************************************/ + +static int imxrt_ioctl(struct file *filep, int cmd, unsigned long arg) +{ +#if defined(CONFIG_SERIAL_TIOCSERGSTRUCT) || defined(CONFIG_SERIAL_TERMIOS) + struct inode *inode = filep->f_inode; + struct uart_dev_s *dev = inode->i_private; + irqstate_t flags; +#endif + int ret = OK; + + switch (cmd) + { +#ifdef CONFIG_SERIAL_TIOCSERGSTRUCT + case TIOCSERGSTRUCT: + { + struct imxrt_uart_s *user = (struct imxrt_uart_s *)arg; + if (!user) + { + ret = -EINVAL; + } + else + { + memcpy(user, dev, sizeof(struct imxrt_uart_s)); + } + } + break; +#endif + +#ifdef CONFIG_SERIAL_TERMIOS + case TCGETS: + { + struct termios *termiosp = (struct termios *)arg; + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + + if (!termiosp) + { + ret = -EINVAL; + break; + } + + /* Return parity */ + + termiosp->c_cflag = ((priv->parity != 0) ? PARENB : 0) | + ((priv->parity == 1) ? PARODD : 0); + + /* Return stop bits */ + + termiosp->c_cflag |= (priv->stopbits2) ? CSTOPB : 0; + + /* Return flow control */ + +#ifdef CONFIG_SERIAL_OFLOWCONTROL + termiosp->c_cflag |= ((priv->oflow) ? CCTS_OFLOW : 0); +#endif +#ifdef CONFIG_SERIAL_IFLOWCONTROL + termiosp->c_cflag |= ((priv->iflow) ? CRTS_IFLOW : 0); +#endif + /* Return baud */ + + cfsetispeed(termiosp, priv->baud); + + /* Return number of bits */ + + switch (priv->bits) + { + case 5: + termiosp->c_cflag |= CS5; + break; + + case 6: + termiosp->c_cflag |= CS6; + break; + + case 7: + termiosp->c_cflag |= CS7; + break; + + default: + case 8: + termiosp->c_cflag |= CS8; + break; + +#if defined(CS9) + case 9: + termiosp->c_cflag |= CS9; + break; +#endif + } + } + break; + + case TCSETS: + { + struct termios *termiosp = (struct termios *)arg; + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + uint32_t baud; + uint32_t ie; + uint8_t parity; + uint8_t nbits; + bool stop2; + + if ((!termiosp) +#ifdef CONFIG_SERIAL_OFLOWCONTROL + || ((termiosp->c_cflag & CCTS_OFLOW) && (priv->cts_gpio == 0)) +#endif +#ifdef CONFIG_SERIAL_IFLOWCONTROL + || ((termiosp->c_cflag & CRTS_IFLOW) && (priv->rts_gpio == 0)) +#endif + ) + { + ret = -EINVAL; + break; + } + + /* Decode baud. */ + + ret = OK; + baud = cfgetispeed(termiosp); + + /* Decode number of bits */ + + switch (termiosp->c_cflag & CSIZE) + { + case CS5: + nbits = 5; + break; + + case CS6: + nbits = 6; + break; + + case CS7: + nbits = 7; + break; + + case CS8: + nbits = 8; + break; + +#if defined(CS9) + case CS9: + nbits = 9; + break; +#endif + default: + ret = -EINVAL; + break; + } + + /* Decode parity */ + + if ((termiosp->c_cflag & PARENB) != 0) + { + parity = (termiosp->c_cflag & PARODD) ? 1 : 2; + } + else + { + parity = 0; + } + + /* Decode stop bits */ + + stop2 = (termiosp->c_cflag & CSTOPB) != 0; + + /* Verify that all settings are valid before committing */ + + if (ret == OK) + { + /* Commit */ + + priv->baud = baud; + priv->parity = parity; + priv->bits = nbits; + priv->stopbits2 = stop2; +#ifdef CONFIG_SERIAL_OFLOWCONTROL + priv->oflow = (termiosp->c_cflag & CCTS_OFLOW) != 0; +#endif +#ifdef CONFIG_SERIAL_IFLOWCONTROL + priv->iflow = (termiosp->c_cflag & CRTS_IFLOW) != 0; +#endif + /* effect the changes immediately - note that we do not + * implement TCSADRAIN / TCSAFLUSH + */ + + flags = spin_lock_irqsave(NULL); + imxrt_disableuartint(priv, &ie); + ret = imxrt_setup(dev); + + /* Restore the interrupt state */ + + imxrt_restoreuartint(priv, ie); + priv->ie = ie; + spin_unlock_irqrestore(NULL, flags); + } + } + break; +#endif /* CONFIG_SERIAL_TERMIOS */ + +#ifdef CONFIG_IMXRT_LPUART_SINGLEWIRE + case TIOCSSINGLEWIRE: + { + uint32_t regval; + irqstate_t flags; + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + + flags = spin_lock_irqsave(NULL); + regval = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET); + + if ((arg & SER_SINGLEWIRE_ENABLED) != 0) + { + uint32_t gpio_val = IOMUX_OPENDRAIN; + gpio_val |= (arg & SER_SINGLEWIRE_PULL_MASK) == + SER_SINGLEWIRE_PULLUP ? + IOMUX_PULL_UP_47K : IOMUX_PULL_NONE; + gpio_val |= (arg & SER_SINGLEWIRE_PULL_MASK) == + SER_SINGLEWIRE_PULLDOWN ? + IOMUX_PULL_DOWN_100K : IOMUX_PULL_NONE; + imxrt_config_gpio((priv->tx_gpio & + ~(IOMUX_PULL_MASK | IOMUX_OPENDRAIN)) | gpio_val); + regval |= LPUART_CTRL_LOOPS | LPUART_CTRL_RSRC; + } + else + { + imxrt_config_gpio((priv->tx_gpio & ~(IOMUX_PULL_MASK | + IOMUX_OPENDRAIN)) | + IOMUX_PULL_NONE); + regval &= ~(LPUART_CTRL_LOOPS | LPUART_CTRL_RSRC); + } + + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, regval); + + spin_unlock_irqrestore(NULL, flags); + } + break; +#endif + +#ifdef CONFIG_IMXRT_LPUART_INVERT + case TIOCSINVERT: + { + uint32_t ctrl; + uint32_t stat; + uint32_t regval; + irqstate_t flags; + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + + flags = spin_lock_irqsave(NULL); + ctrl = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET); + stat = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET); + regval = ctrl; + + /* {R|T}XINV bit field can only be written when the receiver + * is disabled (RE=0). + */ + + regval &= ~LPUART_CTRL_RE; + + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, regval); + + /* Enable/disable signal inversion. */ + + if (arg & SER_INVERT_ENABLED_RX) + { + stat |= LPUART_STAT_RXINV; + } + else + { + stat &= ~LPUART_STAT_RXINV; + } + + if (arg & SER_INVERT_ENABLED_TX) + { + ctrl |= LPUART_CTRL_TXINV; + } + else + { + ctrl &= ~LPUART_CTRL_TXINV; + } + + imxrt_serialout(priv, IMXRT_LPUART_STAT_OFFSET, stat); + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, ctrl); + + spin_unlock_irqrestore(NULL, flags); + } + break; +#endif + + case TIOCSBRK: /* BSD compatibility: Turn break on, unconditionally */ + case TIOCCBRK: /* BSD compatibility: Turn break off, unconditionally */ + default: + ret = -ENOTTY; + break; + } + + return ret; +} + +/**************************************************************************** + * Name: imxrt_receive + * + * Description: + * Called (usually) from the interrupt level to receive one + * character from the UART. Error bits associated with the + * receipt are provided in the return 'status'. + * + ****************************************************************************/ + +static int imxrt_receive(struct uart_dev_s *dev, unsigned int *status) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + uint32_t rxd; + + rxd = imxrt_serialin(priv, IMXRT_LPUART_DATA_OFFSET); + *status = rxd >> LPUART_DATA_STATUS_SHIFT; + return (rxd & LPUART_DATA_MASK) >> LPUART_DATA_SHIFT; +} + +/**************************************************************************** + * Name: imxrt_rxint + * + * Description: + * Call to enable or disable RX interrupts + * + ****************************************************************************/ + +static void imxrt_rxint(struct uart_dev_s *dev, bool enable) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + irqstate_t flags; + uint32_t regval; + + /* Enable interrupts for data available at Rx */ + + flags = spin_lock_irqsave(NULL); + if (enable) + { +#ifndef CONFIG_SUPPRESS_SERIAL_INTS + priv->ie |= LPUART_CTRL_RIE | LPUART_CTRL_FEIE | LPUART_CTRL_ORIE; +#endif + } + else + { + priv->ie &= ~(LPUART_CTRL_RIE | LPUART_CTRL_FEIE | LPUART_CTRL_ORIE); + } + + regval = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET); + regval &= ~LPUART_ALL_INTS; + regval |= priv->ie; + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, regval); + spin_unlock_irqrestore(NULL, flags); +} + +/**************************************************************************** + * Name: imxrt_rxavailable + * + * Description: + * Return true if the receive fifo is not empty + * + ****************************************************************************/ + +static bool imxrt_rxavailable(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + uint32_t regval; + + /* Return true is data is ready in the Rx FIFO */ + + regval = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET); + return ((regval & LPUART_STAT_RDRF) != 0); +} + +/**************************************************************************** + * Name: imxrt_send + * + * Description: + * This method will send one byte on the UART + * + ****************************************************************************/ + +static void imxrt_send(struct uart_dev_s *dev, int ch) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + imxrt_serialout(priv, IMXRT_LPUART_DATA_OFFSET, (uint32_t)ch); +} + +/**************************************************************************** + * Name: imxrt_txint + * + * Description: + * Call to enable or disable TX interrupts + * + ****************************************************************************/ + +static void imxrt_txint(struct uart_dev_s *dev, bool enable) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + irqstate_t flags; + uint32_t regval; + + /* Enable interrupt for TX complete */ + + flags = spin_lock_irqsave(NULL); + if (enable) + { +#ifndef CONFIG_SUPPRESS_SERIAL_INTS + priv->ie |= LPUART_CTRL_TIE; +#endif + } + else + { + priv->ie &= ~LPUART_CTRL_TIE; + } + + regval = imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET); + regval &= ~LPUART_ALL_INTS; + regval |= priv->ie; + imxrt_serialout(priv, IMXRT_LPUART_CTRL_OFFSET, regval); + spin_unlock_irqrestore(NULL, flags); +} + +/**************************************************************************** + * Name: imxrt_txready + * + * Description: + * Return true if the transmit register is available to be written to + * + ****************************************************************************/ + +static bool imxrt_txready(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + uint32_t regval; + + regval = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET); + return ((regval & LPUART_STAT_TDRE) != 0); +} + +/**************************************************************************** + * Name: imxrt_txempty + * + * Description: + * Return true if the transmission has completed and been sent to line. + * + ****************************************************************************/ + +static bool imxrt_txempty(struct uart_dev_s *dev) +{ + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv; + uint32_t regval; + + regval = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET); + return ((regval & LPUART_STAT_TC) != 0); +} + +/**************************************************************************** + * Name: up_pm_notify + * + * Description: + * Notify the driver of new power state. This callback is called after + * all drivers have had the opportunity to prepare for the new power state. + * + * Input Parameters: + * + * cb - Returned to the driver. The driver version of the callback + * structure may include additional, driver-specific state data at + * the end of the structure. + * + * pmstate - Identifies the new PM state + * + * Returned Value: + * None - The driver already agreed to transition to the low power + * consumption state when when it returned OK to the prepare() call. + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static void up_pm_notify(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate) +{ + switch (pmstate) + { + case(PM_NORMAL): + { + /* Logic for PM_NORMAL goes here */ + } + break; + + case(PM_IDLE): + { + /* Logic for PM_IDLE goes here */ + } + break; + + case(PM_STANDBY): + { + /* Logic for PM_STANDBY goes here */ + } + break; + + case(PM_SLEEP): + { + /* Logic for PM_SLEEP goes here */ + } + break; + + default: + + /* Should not get here */ + + break; + } +} +#endif + +/**************************************************************************** + * Name: up_pm_prepare + * + * Description: + * Request the driver to prepare for a new power state. This is a warning + * that the system is about to enter into a new power state. The driver + * should begin whatever operations that may be required to enter power + * state. The driver may abort the state change mode by returning a + * non-zero value from the callback function. + * + * Input Parameters: + * + * cb - Returned to the driver. The driver version of the callback + * structure may include additional, driver-specific state data at + * the end of the structure. + * + * pmstate - Identifies the new PM state + * + * Returned Value: + * Zero - (OK) means the event was successfully processed and that the + * driver is prepared for the PM state change. + * + * Non-zero - means that the driver is not prepared to perform the tasks + * needed achieve this power setting and will cause the state + * change to be aborted. NOTE: The prepare() method will also + * be called when reverting from lower back to higher power + * consumption modes (say because another driver refused a + * lower power state change). Drivers are not permitted to + * return non-zero values when reverting back to higher power + * consumption modes! + * + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static int up_pm_prepare(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate) +{ + /* Logic to prepare for a reduced power state goes here. */ + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: imxrt_earlyserialinit + * + * Description: + * Performs the low level UART initialization early in debug so that the + * serial console will be available during bootup. This must be called + * before arm_serialinit. + * + ****************************************************************************/ + +void imxrt_earlyserialinit(void) +{ + /* NOTE: This function assumes that low level hardware configuration + * -- including all clocking and pin configuration -- was performed by the + * function imxrt_lowsetup() earlier in the boot sequence. + */ + + /* Enable the console UART. The other UARTs will be initialized if and + * when they are first opened. + */ + +#ifdef CONSOLE_DEV + CONSOLE_DEV.isconsole = true; + imxrt_setup(&CONSOLE_DEV); +#endif +} + +/**************************************************************************** + * Name: arm_serialinit + * + * Description: + * Register serial console and serial ports. This assumes + * that imxrt_earlyserialinit was called previously. + * + ****************************************************************************/ + +void arm_serialinit(void) +{ +#ifdef CONFIG_PM + int ret; + + /* Register to receive power management callbacks */ + + ret = pm_register(&g_serial_pmcb); + DEBUGASSERT(ret == OK); + UNUSED(ret); +#endif + +#ifdef CONSOLE_DEV + uart_register("/dev/console", &CONSOLE_DEV); +#endif + + /* Register all UARTs */ + + uart_register("/dev/ttyS0", &TTYS0_DEV); +#ifdef TTYS1_DEV + uart_register("/dev/ttyS1", &TTYS1_DEV); +#endif +#ifdef TTYS2_DEV + uart_register("/dev/ttyS2", &TTYS2_DEV); +#endif +#ifdef TTYS3_DEV + uart_register("/dev/ttyS3", &TTYS3_DEV); +#endif +#ifdef TTYS4_DEV + uart_register("/dev/ttyS4", &TTYS4_DEV); +#endif +#ifdef TTYS5_DEV + uart_register("/dev/ttyS5", &TTYS5_DEV); +#endif +#ifdef TTYS6_DEV + uart_register("/dev/ttyS6", &TTYS6_DEV); +#endif +#ifdef TTYS7_DEV + uart_register("/dev/ttyS7", &TTYS7_DEV); +#endif +} + +/**************************************************************************** + * Name: up_putc + * + * Description: + * Provide priority, low-level access to support OS debug writes + * + ****************************************************************************/ + +int up_putc(int ch) +{ +#ifdef CONSOLE_DEV + struct imxrt_uart_s *priv = (struct imxrt_uart_s *)CONSOLE_DEV.priv; + uint32_t ie; + + imxrt_disableuartint(priv, &ie); + + /* Check for LF */ + + if (ch == '\n') + { + /* Add CR */ + + imxrt_lowputc('\r'); + } + + imxrt_lowputc(ch); + imxrt_restoreuartint(priv, ie); +#endif + + return ch; +} + +#else /* USE_SERIALDRIVER */ + +/**************************************************************************** + * Name: up_putc + * + * Description: + * Provide priority, low-level access to support OS debug writes + * + ****************************************************************************/ + +int up_putc(int ch) +{ +#if CONSOLE_LPUART > 0 + /* Check for LF */ + + if (ch == '\n') + { + /* Add CR */ + + arm_lowputc('\r'); + } + + arm_lowputc(ch); +#endif + + return ch; +} + +#endif /* USE_SERIALDRIVER */ From 958ad986be52740e26e78df9b9a8f12164a0278b Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Wed, 23 Mar 2022 14:34:13 +0800 Subject: [PATCH 16/25] Register the character device according to the selected serial port number --- .../nuttx/arch/arm/src/imxrt/imxrt_serial.c | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c index 2b9fc124d..426ddd023 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c @@ -1746,27 +1746,29 @@ void arm_serialinit(void) /* Register all UARTs */ - uart_register("/dev/ttyS0", &TTYS0_DEV); -#ifdef TTYS1_DEV - uart_register("/dev/ttyS1", &TTYS1_DEV); +#ifdef CONFIG_IMXRT_LPUART1 + uart_register("/dev/ttyS1", &g_uart1port); #endif -#ifdef TTYS2_DEV - uart_register("/dev/ttyS2", &TTYS2_DEV); +#ifdef CONFIG_IMXRT_LPUART2 + uart_register("/dev/ttyS2", &g_uart2port); #endif -#ifdef TTYS3_DEV - uart_register("/dev/ttyS3", &TTYS3_DEV); +#ifdef CONFIG_IMXRT_LPUART3 + uart_register("/dev/ttyS3", &g_uart3port); #endif -#ifdef TTYS4_DEV - uart_register("/dev/ttyS4", &TTYS4_DEV); +#ifdef CONFIG_IMXRT_LPUART4 + uart_register("/dev/ttyS4", &g_uart4port); #endif -#ifdef TTYS5_DEV - uart_register("/dev/ttyS5", &TTYS5_DEV); +#ifdef CONFIG_IMXRT_LPUART5 + uart_register("/dev/ttyS5", &g_uart5port); #endif -#ifdef TTYS6_DEV - uart_register("/dev/ttyS6", &TTYS6_DEV); +#ifdef CONFIG_IMXRT_LPUART6 + uart_register("/dev/ttyS6", &g_uart6port); #endif -#ifdef TTYS7_DEV - uart_register("/dev/ttyS7", &TTYS7_DEV); +#ifdef CONFIG_IMXRT_LPUART7 + uart_register("/dev/ttyS7", &g_uart7port); +#endif +#ifdef CONFIG_IMXRT_LPUART8 + uart_register("/dev/ttyS8", &g_uart8port); #endif } From f14523331c7b104fe2ec0ddcc07725b9b7eeb7d3 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Wed, 23 Mar 2022 15:06:34 +0800 Subject: [PATCH 17/25] support mulan on nuttx --- Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h | 9 +++++++++ .../aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c | 9 +++++++++ .../aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c | 9 +++++++++ .../aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h | 9 +++++++++ .../imxrt1052-ok/src/imxrt_flexspi_nor_flash.c | 9 +++++++++ .../imxrt1052-ok/src/imxrt_flexspi_nor_flash.h | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c | 9 +++++++++ Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c | 9 +++++++++ .../aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c | 9 +++++++++ Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c | 9 +++++++++ .../Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c | 9 +++++++++ .../app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h | 9 +++++++++ .../nuttx/arch/arm/src/imxrt/imxrt_serial.c | 9 +++++++++ 21 files changed, 189 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h index 7c49fc26b..3d91a3643 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file board.h +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + #ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H #define __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c index a30557c6a..cf85a5146 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c @@ -22,6 +22,15 @@ * Included Files ****************************************************************************/ +/** +* @file imxrt_userspace.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + #include #include diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h index 8407404e2..18bf513fa 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt1052-ok.h +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + #ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H #define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c index bdd387ae4..370d1325a 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_appinit.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c index 0b18c711f..f42a25bef 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_autoleds.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /* There are four LED status indicators located on the EVK Board. The * functions of these LEDs include: * diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c index 813931cdf..487480207 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_boot.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c index 85f05794d..8a915e29e 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_bringup.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c index f6c3b2b30..b70436a9c 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_buttons.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c index 958aa2414..7056ce93a 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_ethernet.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c index b727cf579..db6ccf282 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_flexspi_nor_boot.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h index 807ab9b82..bcd2b5d0e 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_flexspi_nor_boot.h +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + #ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H #define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c index 0343860ab..0f6919425 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_flexspi_nor_flash.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h index 087a7e3ca..c94af6ee2 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_flexspi_nor_flash.h +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + #ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H #define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c index c904cd5aa..0b094844b 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_gpio.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c index bec6d715c..157a08dce 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_lcd.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c index 561a12283..40df26cf9 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_mmcsd_spi.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c index 556930feb..33af9d163 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c @@ -31,6 +31,15 @@ * POSSIBILITY OF SUCH DAMAGE. ****************************************************************************/ +/** +* @file imxrt_sdram_ini_dcd.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c index bb4702c99..a2239bb2f 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_spi.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c index d0e565c91..8213abedc 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_userleds.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /* There are four LED status indicators located on the EVK Board. The * functions of these LEDs include: * diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h index 73039331c..26a96acae 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/include/imxrt/chip.h @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file chip.h +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + #ifndef __ARCH_ARM_INCLUDE_IMXRT_CHIP_H #define __ARCH_ARM_INCLUDE_IMXRT_CHIP_H diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c index 426ddd023..895084b09 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_serial.c @@ -18,6 +18,15 @@ * ****************************************************************************/ +/** +* @file imxrt_serial.c +* @brief nuttx source code +* https://github.com/apache/incubator-nuttx.git +* @version 10.2.0 +* @author AIIT XUOS Lab +* @date 2022-03-23 +*/ + /**************************************************************************** * Included Files ****************************************************************************/ From 76db961420d909c5a28059eef2091b99dab0b895 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Thu, 24 Mar 2022 11:29:15 +0800 Subject: [PATCH 18/25] support sdio on imxrt1052-ok --- .../Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig | 1 + .../aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig | 1 + .../Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig | 1 + Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h | 7 +++++++ 5 files changed, 11 insertions(+) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig index 15a659983..94a65b6fb 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig @@ -37,6 +37,7 @@ CONFIG_NUTTX_USERSPACE=0x60200000 CONFIG_PASS1_BUILDIR="boards/arm/imxrt/imxrt1052-ok/kernel" CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 +CONFIG_SCHED_HPWORK=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=8 CONFIG_START_MONTH=6 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig index aca6fb61d..c5edee4f4 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig @@ -37,6 +37,7 @@ CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=536870912 CONFIG_RAM_START=0x20200000 CONFIG_SCHED_CPULOAD=y +CONFIG_SCHED_HPWORK=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig index 8cd6f8ecf..0d219ec93 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig @@ -57,6 +57,7 @@ CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_HPWORK=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig index 9b4920876..e263e52f7 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig @@ -35,6 +35,7 @@ CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 +CONFIG_SCHED_HPWORK=y CONFIG_SCHED_WAITPID=y CONFIG_START_DAY=14 CONFIG_START_MONTH=3 diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h index 3d91a3643..4064a2eda 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h +++ b/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h @@ -207,6 +207,13 @@ * sure shapes are square with minimal ringing. */ +#define GPIO_USDHC1_DATA0 GPIO_USDHC1_DATA0_1 /* GPIO_SD_B0_02 */ +#define GPIO_USDHC1_DATA1 GPIO_USDHC1_DATA1_1 /* GPIO_SD_B0_03 */ +#define GPIO_USDHC1_DATA2 GPIO_USDHC1_DATA2_1 /* GPIO_SD_B0_04 */ +#define GPIO_USDHC1_DATA3 GPIO_USDHC1_DATA3_1 /* GPIO_SD_B0_05 */ +#define GPIO_USDHC1_CLK GPIO_USDHC1_CLK_1 /* GPIO_SD_B0_01 */ +#define GPIO_USDHC1_CMD GPIO_USDHC1_CMD_1 /* GPIO_SD_B0_00 */ + #define PIN_USDHC1_D0 (GPIO_USDHC1_DATA0 | IOMUX_USDHC1_DATAX_DEFAULT) #define PIN_USDHC1_D1 (GPIO_USDHC1_DATA1 | IOMUX_USDHC1_DATAX_DEFAULT) #define PIN_USDHC1_D2 (GPIO_USDHC1_DATA2 | IOMUX_USDHC1_DATAX_DEFAULT) From 91594e0e879c60fe198c5c9de34d41d920331e89 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Thu, 24 Mar 2022 15:59:34 +0800 Subject: [PATCH 19/25] imxrt1052-ok rename as xidatong --- .../aiit_board/{imxrt1052-ok => xidatong}/Kconfig | 10 +++++----- .../configs/knsh/Make.defs | 2 +- .../configs/knsh/defconfig | 6 +++--- .../configs/libcxxtest/Make.defs | 2 +- .../configs/libcxxtest/defconfig | 4 ++-- .../configs/netnsh/defconfig | 4 ++-- .../{imxrt1052-ok => xidatong}/configs/nsh/defconfig | 4 ++-- .../{imxrt1052-ok => xidatong}/include/board.h | 8 ++++---- .../{imxrt1052-ok => xidatong}/kernel/Makefile | 2 +- .../kernel/imxrt_userspace.c | 2 +- .../{imxrt1052-ok => xidatong}/scripts/Make.defs | 2 +- .../scripts/flash-ocram.ld | 2 +- .../scripts/kernel-space.ld | 2 +- .../{imxrt1052-ok => xidatong}/scripts/memory.ld | 2 +- .../{imxrt1052-ok => xidatong}/scripts/user-space.ld | 2 +- .../{imxrt1052-ok => xidatong}/src/Makefile | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_appinit.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_autoleds.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_boot.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_bringup.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_buttons.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_ethernet.c | 4 ++-- .../src/imxrt_flexspi_nor_boot.c | 2 +- .../src/imxrt_flexspi_nor_boot.h | 12 ++++++------ .../src/imxrt_flexspi_nor_flash.c | 6 +++--- .../src/imxrt_flexspi_nor_flash.h | 8 ++++---- .../{imxrt1052-ok => xidatong}/src/imxrt_gpio.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_lcd.c | 4 ++-- .../{imxrt1052-ok => xidatong}/src/imxrt_mmcsd_spi.c | 2 +- .../src/imxrt_sdram_ini_dcd.c | 2 +- .../{imxrt1052-ok => xidatong}/src/imxrt_spi.c | 6 +++--- .../{imxrt1052-ok => xidatong}/src/imxrt_userleds.c | 4 ++-- .../src/imxrt1052-ok.h => xidatong/src/xidatong.h} | 10 +++++----- Ubiquitous/Nuttx/app_match_nuttx/build.sh | 2 +- .../Nuttx/app_match_nuttx/nuttx/boards/Kconfig | 12 ++++++------ 35 files changed, 78 insertions(+), 78 deletions(-) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/Kconfig (69%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/configs/knsh/Make.defs (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/configs/knsh/defconfig (90%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/configs/libcxxtest/Make.defs (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/configs/libcxxtest/defconfig (94%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/configs/netnsh/defconfig (96%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/configs/nsh/defconfig (94%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/include/board.h (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/kernel/Makefile (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/kernel/imxrt_userspace.c (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/scripts/Make.defs (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/scripts/flash-ocram.ld (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/scripts/kernel-space.ld (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/scripts/memory.ld (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/scripts/user-space.ld (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/Makefile (95%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_appinit.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_autoleds.c (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_boot.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_bringup.c (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_buttons.c (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_ethernet.c (99%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_flexspi_nor_boot.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_flexspi_nor_boot.h (92%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_flexspi_nor_flash.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_flexspi_nor_flash.h (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_gpio.c (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_lcd.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_mmcsd_spi.c (98%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_sdram_ini_dcd.c (99%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_spi.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok => xidatong}/src/imxrt_userleds.c (97%) rename Ubiquitous/Nuttx/aiit_board/{imxrt1052-ok/src/imxrt1052-ok.h => xidatong/src/xidatong.h} (96%) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig b/Ubiquitous/Nuttx/aiit_board/xidatong/Kconfig similarity index 69% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig rename to Ubiquitous/Nuttx/aiit_board/xidatong/Kconfig index c4fde44a1..9238d576f 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/Kconfig +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/Kconfig @@ -3,21 +3,21 @@ # see the file kconfig-language.txt in the NuttX tools repository. # -if ARCH_BOARD_IMXRT1052_OK +if ARCH_BOARD_XIDATONG choice prompt "Boot Flash" - default IMXRT1052_OK_HYPER_FLASH + default XIDATONG_HYPER_FLASH -config IMXRT1052_OK_HYPER_FLASH +config XIDATONG_HYPER_FLASH bool "HYPER Flash" -config IMXRT1052_OK_QSPI_FLASH +config XIDATONG_QSPI_FLASH bool "QSPI Flash" endchoice # Boot Flash -config IMXRT1052_OK_SDRAM +config XIDATONG_SDRAM bool "Enable SDRAM" default n select IMXRT_SEMC_INIT_DONE diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/knsh/Make.defs similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs rename to Ubiquitous/Nuttx/aiit_board/xidatong/configs/knsh/Make.defs index 9f16dfe9d..3b7371cf7 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/Make.defs +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/knsh/Make.defs @@ -1,5 +1,5 @@ ############################################################################ -# boards/arm/imxrt/imxrt1052-ok/configs/knsh/Make.defs +# boards/arm/imxrt/xidatong/configs/knsh/Make.defs # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/knsh/defconfig similarity index 90% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig rename to Ubiquitous/Nuttx/aiit_board/xidatong/configs/knsh/defconfig index 94a65b6fb..c09996397 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/knsh/defconfig @@ -8,8 +8,8 @@ # CONFIG_ARCH_RAMFUNCS is not set CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD="imxrt1052-ok" -CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_BOARD="xidatong" +CONFIG_ARCH_BOARD_XIDATONG=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y @@ -34,7 +34,7 @@ CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y CONFIG_NUTTX_USERSPACE=0x60200000 -CONFIG_PASS1_BUILDIR="boards/arm/imxrt/imxrt1052-ok/kernel" +CONFIG_PASS1_BUILDIR="boards/arm/imxrt/xidatong/kernel" CONFIG_RAM_SIZE=524288 CONFIG_RAM_START=0x20200000 CONFIG_SCHED_HPWORK=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/libcxxtest/Make.defs similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs rename to Ubiquitous/Nuttx/aiit_board/xidatong/configs/libcxxtest/Make.defs index 6e1d1be1c..8d5a217a8 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/Make.defs +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/libcxxtest/Make.defs @@ -1,5 +1,5 @@ ############################################################################ -# boards/arm/imxrt/imxrt1052-ok/configs/libcxxtest/Make.defs +# boards/arm/imxrt/xidatong/configs/libcxxtest/Make.defs # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/libcxxtest/defconfig similarity index 94% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig rename to Ubiquitous/Nuttx/aiit_board/xidatong/configs/libcxxtest/defconfig index c5edee4f4..415026558 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/libcxxtest/defconfig @@ -7,8 +7,8 @@ # CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD="imxrt1052-ok" -CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_BOARD="xidatong" +CONFIG_ARCH_BOARD_XIDATONG=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/netnsh/defconfig similarity index 96% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig rename to Ubiquitous/Nuttx/aiit_board/xidatong/configs/netnsh/defconfig index 0d219ec93..a20f54881 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/netnsh/defconfig @@ -8,8 +8,8 @@ # CONFIG_ARCH_LEDS is not set CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD="imxrt1052-ok" -CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_BOARD="xidatong" +CONFIG_ARCH_BOARD_XIDATONG=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/nsh/defconfig similarity index 94% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig rename to Ubiquitous/Nuttx/aiit_board/xidatong/configs/nsh/defconfig index e263e52f7..7a393d08d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/configs/nsh/defconfig @@ -7,8 +7,8 @@ # CONFIG_ADD_NUTTX_FETURES=y CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD="imxrt1052-ok" -CONFIG_ARCH_BOARD_IMXRT1052_OK=y +CONFIG_ARCH_BOARD="xidatong" +CONFIG_ARCH_BOARD_XIDATONG=y CONFIG_ARCH_CHIP="imxrt" CONFIG_ARCH_CHIP_IMXRT=y CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h b/Ubiquitous/Nuttx/aiit_board/xidatong/include/board.h similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h rename to Ubiquitous/Nuttx/aiit_board/xidatong/include/board.h index 4064a2eda..076157b7c 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/include/board.h +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/include/board.h @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/include/board.h + * boards/arm/imxrt/xidatong/include/board.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -27,8 +27,8 @@ * @date 2022-03-23 */ -#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H -#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H +#ifndef __BOARDS_ARM_IMXRT_XIDATONG_INCLUDE_BOARD_H +#define __BOARDS_ARM_IMXRT_XIDATONG_INCLUDE_BOARD_H /**************************************************************************** * Included Files @@ -364,4 +364,4 @@ extern "C" #endif #endif /* __ASSEMBLY__ */ -#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_INCLUDE_BOARD_H */ +#endif /* __BOARDS_ARM_IMXRT_XIDATONG_INCLUDE_BOARD_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile b/Ubiquitous/Nuttx/aiit_board/xidatong/kernel/Makefile similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile rename to Ubiquitous/Nuttx/aiit_board/xidatong/kernel/Makefile index 8315d342c..147b40f82 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/Makefile +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/kernel/Makefile @@ -1,5 +1,5 @@ ############################################################################ -# boards/arm/imxrt/imxrt1052-ok/kernel/Makefile +# boards/arm/imxrt/xidatong/kernel/Makefile # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c b/Ubiquitous/Nuttx/aiit_board/xidatong/kernel/imxrt_userspace.c similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/kernel/imxrt_userspace.c index cf85a5146..6735ddec2 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/kernel/imxrt_userspace.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/kernel/imxrt_userspace.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/kernel/imxrt_userspace.c + * boards/arm/imxrt/xidatong/kernel/imxrt_userspace.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/Make.defs similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs rename to Ubiquitous/Nuttx/aiit_board/xidatong/scripts/Make.defs index 431e865cd..c3fecc52d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/Make.defs +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/Make.defs @@ -1,5 +1,5 @@ ############################################################################ -# boards/arm/imxrt/imxrt1052-ok/scripts/Make.defs +# boards/arm/imxrt/xidatong/scripts/Make.defs # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/flash-ocram.ld similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld rename to Ubiquitous/Nuttx/aiit_board/xidatong/scripts/flash-ocram.ld index 4cd8da676..fb625d802 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/flash-ocram.ld +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/flash-ocram.ld @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/scripts/flash-ocram.ld + * boards/arm/imxrt/xidatong/scripts/flash-ocram.ld * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/kernel-space.ld similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld rename to Ubiquitous/Nuttx/aiit_board/xidatong/scripts/kernel-space.ld index b50660936..7ad3587d0 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/kernel-space.ld +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/kernel-space.ld @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/scripts/kernel-space.ld + * boards/arm/imxrt/xidatong/scripts/kernel-space.ld * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/memory.ld similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld rename to Ubiquitous/Nuttx/aiit_board/xidatong/scripts/memory.ld index 6486acda5..fea61bc8d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/memory.ld +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/memory.ld @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/scripts/memory.ld + * boards/arm/imxrt/xidatong/scripts/memory.ld * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/user-space.ld similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld rename to Ubiquitous/Nuttx/aiit_board/xidatong/scripts/user-space.ld index 5eb3f32dd..ed09f8110 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/scripts/user-space.ld +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/scripts/user-space.ld @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/scripts/user-space.ld + * boards/arm/imxrt/xidatong/scripts/user-space.ld * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile b/Ubiquitous/Nuttx/aiit_board/xidatong/src/Makefile similarity index 95% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/Makefile index b3d3dcf44..06e625952 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/Makefile +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/Makefile @@ -1,5 +1,5 @@ ############################################################################ -# boards/arm/imxrt/imxrt1052-ok/src/Makefile +# boards/arm/imxrt/xidatong/src/Makefile # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with @@ -62,7 +62,7 @@ ifeq ($(CONFIG_DEV_GPIO),y) CSRCS += imxrt_gpio.c endif -ifeq ($(CONFIG_IMXRT1052_OK_SDRAM),y) +ifeq ($(CONFIG_XIDATONG_SDRAM),y) CSRCS += imxrt_sdram_ini_dcd.c endif diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_appinit.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_appinit.c index 370d1325a..6070be4c9 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_appinit.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_appinit.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_appinit.c + * boards/arm/imxrt/xidatong/src/imxrt_appinit.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -37,7 +37,7 @@ #include -#include "imxrt1052-ok.h" +#include "xidatong.h" #ifdef CONFIG_BOARDCTL diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_autoleds.c similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_autoleds.c index f42a25bef..56ce9daeb 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_autoleds.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_autoleds.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_autoleds.c + * boards/arm/imxrt/xidatong/src/imxrt_autoleds.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -74,7 +74,7 @@ #include "imxrt_gpio.h" #include "imxrt_iomuxc.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" #include diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_boot.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_boot.c index 487480207..81d823f5d 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_boot.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_boot.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_boot.c + * boards/arm/imxrt/xidatong/src/imxrt_boot.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -37,7 +37,7 @@ #include #include "imxrt_start.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" /**************************************************************************** * Public Functions diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_bringup.c similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_bringup.c index 8a915e29e..eda38f3b0 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_bringup.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_bringup.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_bringup.c + * boards/arm/imxrt/xidatong/src/imxrt_bringup.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -47,7 +47,7 @@ # include "imxrt_usdhc.h" #endif -#include "imxrt1052-ok.h" +#include "xidatong.h" #include /* Must always be included last */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_buttons.c similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_buttons.c index b70436a9c..b5283cb71 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_buttons.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_buttons.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_buttons.c + * boards/arm/imxrt/xidatong/src/imxrt_buttons.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -45,7 +45,7 @@ #include "imxrt_config.h" #include "imxrt_irq.h" #include "imxrt_gpio.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" #ifdef CONFIG_ARCH_BUTTONS diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_ethernet.c similarity index 99% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_ethernet.c index 7056ce93a..dafbc9e4b 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_ethernet.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_ethernet.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_ethernet.c + * boards/arm/imxrt/xidatong/src/imxrt_ethernet.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -54,7 +54,7 @@ #include "imxrt_gpio.h" #include "imxrt_enet.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" #include diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_boot.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_boot.c index db6ccf282..c2ce4e2b1 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_boot.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_boot.c + * boards/arm/imxrt/xidatong/src/imxrt_flexspi_nor_boot.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_boot.h similarity index 92% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_boot.h index bcd2b5d0e..33b86eb40 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_boot.h @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_boot.h + * boards/arm/imxrt/xidatong/src/imxrt_flexspi_nor_boot.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -27,8 +27,8 @@ * @date 2022-03-23 */ -#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H -#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H +#ifndef __BOARDS_ARM_IMXRT_XIDATONG_SRC_IMXRT_FLEXSPI_NOR_BOOT_H +#define __BOARDS_ARM_IMXRT_XIDATONG_SRC_IMXRT_FLEXSPI_NOR_BOOT_H /**************************************************************************** * Included Files @@ -71,7 +71,7 @@ #define FLASH_END 0x7f7fffff #define SCLK 1 -#ifdef CONFIG_IMXRT1052_OK_SDRAM +#ifdef CONFIG_XIDATONG_SDRAM # define DCD_ADDRESS &g_dcd_data #else # define DCD_ADDRESS 0 @@ -144,8 +144,8 @@ struct boot_data_s extern const struct boot_data_s g_boot_data; -#ifdef CONFIG_IMXRT1052_OK_SDRAM +#ifdef CONFIG_XIDATONG_SDRAM extern const uint8_t g_dcd_data[]; #endif -#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_BOOT_H */ +#endif /* __BOARDS_ARM_IMXRT_XIDATONG_SRC_IMXRT_FLEXSPI_NOR_BOOT_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_flash.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_flash.c index 0f6919425..5ca83cd80 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_flash.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_flash.c + * boards/arm/imxrt/xidatong/src/imxrt_flexspi_nor_flash.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -37,7 +37,7 @@ * Public Data ****************************************************************************/ -#if defined (CONFIG_IMXRT1052_OK_HYPER_FLASH) +#if defined (CONFIG_XIDATONG_HYPER_FLASH) locate_data(".boot_hdr.conf") const struct flexspi_nor_config_s g_flash_config = { @@ -84,7 +84,7 @@ const struct flexspi_nor_config_s g_flash_config = .is_uniform_blocksize = 1, }; -#elif defined (CONFIG_IMXRT1052_OK_QSPI_FLASH) +#elif defined (CONFIG_XIDATONG_QSPI_FLASH) locate_data(".boot_hdr.conf") const struct flexspi_nor_config_s g_flash_config = { diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_flash.h similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_flash.h index c94af6ee2..3ea7a74d2 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_flexspi_nor_flash.h @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_flexspi_nor_flash.h + * boards/arm/imxrt/xidatong/src/imxrt_flexspi_nor_flash.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -27,8 +27,8 @@ * @date 2022-03-23 */ -#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H -#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H +#ifndef __BOARDS_ARM_IMXRT_XIDATONG_SRC_IMXRT_FLEXSPI_NOR_FLASH_H +#define __BOARDS_ARM_IMXRT_XIDATONG_SRC_IMXRT_FLEXSPI_NOR_FLASH_H /**************************************************************************** * Included Files @@ -356,4 +356,4 @@ struct flexspi_nor_config_s uint32_t reserve2[11]; /* Reserved for future use */ }; -#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT_FLEXSPI_NOR_FLASH_H */ +#endif /* __BOARDS_ARM_IMXRT_XIDATONG_SRC_IMXRT_FLEXSPI_NOR_FLASH_H */ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_gpio.c similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_gpio.c index 0b094844b..c5909edd2 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_gpio.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_gpio.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_gpio.c + * boards/arm/imxrt/xidatong/src/imxrt_gpio.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -46,7 +46,7 @@ #include "chip.h" #include -#include "imxrt1052-ok.h" +#include "xidatong.h" #if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_lcd.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_lcd.c index 157a08dce..8b8a6c7b4 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_lcd.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_lcd.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_lcd.c + * boards/arm/imxrt/xidatong/src/imxrt_lcd.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -39,7 +39,7 @@ #include "imxrt_lcd.h" #include "imxrt_gpio.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" /**************************************************************************** * Public Functions diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_mmcsd_spi.c similarity index 98% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_mmcsd_spi.c index 40df26cf9..1f495ec14 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_mmcsd_spi.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_mmcsd_spi.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_mmcsd_spi.c + * boards/arm/imxrt/xidatong/src/imxrt_mmcsd_spi.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_sdram_ini_dcd.c similarity index 99% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_sdram_ini_dcd.c index 33af9d163..10ffd2da3 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_sdram_ini_dcd.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_sdram_ini_dcd.c + * boards/arm/imxrt/xidatong/src/imxrt_sdram_ini_dcd.c * * Copyright (C) 2017, NXP Semiconductors, Inc. * diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_spi.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_spi.c index a2239bb2f..673eaec0b 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_spi.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_spi.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_spi.c + * boards/arm/imxrt/xidatong/src/imxrt_spi.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -46,7 +46,7 @@ #include "imxrt_config.h" #include "imxrt_lpspi.h" #include "imxrt_gpio.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" #if defined(CONFIG_IMXRT_LPSPI1) || defined(CONFIG_IMXRT_LPSPI2) || \ defined(CONFIG_IMXRT_LPSPI3) || defined(CONFIG_IMXRT_LPSPI4) @@ -59,7 +59,7 @@ * Name: imxrt_spidev_initialize * * Description: - * Called to configure SPI chip select GPIO pins for the imxrt1052-ok + * Called to configure SPI chip select GPIO pins for the xidatong * board. * ****************************************************************************/ diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_userleds.c similarity index 97% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_userleds.c index 8213abedc..1b5c187c9 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt_userleds.c +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/imxrt_userleds.c @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt_userleds.c + * boards/arm/imxrt/xidatong/src/imxrt_userleds.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -49,7 +49,7 @@ #include "imxrt_gpio.h" #include "imxrt_iomuxc.h" -#include "imxrt1052-ok.h" +#include "xidatong.h" #include diff --git a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h b/Ubiquitous/Nuttx/aiit_board/xidatong/src/xidatong.h similarity index 96% rename from Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h rename to Ubiquitous/Nuttx/aiit_board/xidatong/src/xidatong.h index 18bf513fa..d8828d756 100644 --- a/Ubiquitous/Nuttx/aiit_board/imxrt1052-ok/src/imxrt1052-ok.h +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/src/xidatong.h @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/imxrt/imxrt1052-ok/src/imxrt1052-ok.h + * boards/arm/imxrt/xidatong/src/xidatong.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -19,7 +19,7 @@ ****************************************************************************/ /** -* @file imxrt1052-ok.h +* @file xidatong.h * @brief nuttx source code * https://github.com/apache/incubator-nuttx.git * @version 10.2.0 @@ -27,8 +27,8 @@ * @date 2022-03-23 */ -#ifndef __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H -#define __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H +#ifndef __BOARDS_ARM_IMXRT_XIDATONG_SRC_XIDATONG_H +#define __BOARDS_ARM_IMXRT_XIDATONG_SRC_XIDATONG_H /**************************************************************************** * Included Files @@ -199,4 +199,4 @@ int imxrt_gpio_initialize(void); #endif #endif /* __ASSEMBLY__ */ -#endif /* __BOARDS_ARM_IMXRT_IMXRT1052_OK_SRC_IMXRT1052_OK_H */ +#endif /* __BOARDS_ARM_IMXRT_XIDATONG_SRC_XIDATONG_H */ diff --git a/Ubiquitous/Nuttx/app_match_nuttx/build.sh b/Ubiquitous/Nuttx/app_match_nuttx/build.sh index cb656dbdb..7b1c6a75d 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/build.sh +++ b/Ubiquitous/Nuttx/app_match_nuttx/build.sh @@ -18,6 +18,6 @@ cp -rf $current/nuttx $nuttx cp -rf $current/apps $nuttx cp -rf $nuttx/aiit_board/aiit-arm32-board $nuttx/nuttx/boards/arm/stm32 cp -rf $nuttx/aiit_board/aiit-riscv64-board $nuttx/nuttx/boards/risc-v/k210 -cp -rf $nuttx/aiit_board/imxrt1052-ok $nuttx/nuttx/boards/arm/imxrt +cp -rf $nuttx/aiit_board/xidatong $nuttx/nuttx/boards/arm/imxrt cd ../nuttx diff --git a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig index fb486dc23..5311f8b96 100644 --- a/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig +++ b/Ubiquitous/Nuttx/app_match_nuttx/nuttx/boards/Kconfig @@ -445,15 +445,15 @@ config ARCH_BOARD_IMXRT1050_EVK This is the board configuration for the port of NuttX to the NXP i.MXRT evaluation kit, MIMXRT1050-EVKB. This board features the MIMXRT1052DVL6A MCU. -config ARCH_BOARD_IMXRT1052_OK - bool "NXP i.MX RT 1052 OK" +config ARCH_BOARD_XIDATONG + bool "NXP i.MX RT 1052 XIDATONG" depends on ARCH_CHIP_MIMXRT1052CVL5B select ARCH_HAVE_LEDS select ARCH_HAVE_BUTTONS select ARCH_HAVE_IRQBUTTONS ---help--- This is the board configuration for the port of NuttX to the NXP i.MXRT - evaluation kit, MIMXRT1052-OK. This board features the MIMXRT1052CVL5B MCU. + evaluation kit, MIMXRT1052-XIDATONG. This board features the MIMXRT1052CVL5B MCU. config ARCH_BOARD_IMXRT1060_EVK bool "NXP i.MX RT 1060 EVK" @@ -2392,7 +2392,7 @@ config ARCH_BOARD default "hymini-stm32v" if ARCH_BOARD_HYMINI_STM32V default "imxrt1020-evk" if ARCH_BOARD_IMXRT1020_EVK default "imxrt1050-evk" if ARCH_BOARD_IMXRT1050_EVK - default "imxrt1052-ok" if ARCH_BOARD_IMXRT1052_OK + default "xidatong" if ARCH_BOARD_XIDATONG default "imxrt1060-evk" if ARCH_BOARD_IMXRT1060_EVK default "imxrt1064-evk" if ARCH_BOARD_IMXRT1064_EVK default "kwikstik-k40" if ARCH_BOARD_KWIKSTIK_K40 @@ -2671,8 +2671,8 @@ endif if ARCH_BOARD_IMXRT1050_EVK source "boards/arm/imxrt/imxrt1050-evk/Kconfig" endif -if ARCH_BOARD_IMXRT1052_OK -source "boards/arm/imxrt/imxrt1052-ok/Kconfig" +if ARCH_BOARD_XIDATONG +source "boards/arm/imxrt/xidatong/Kconfig" endif if ARCH_BOARD_IMXRT1060_EVK source "boards/arm/imxrt/imxrt1060-evk/Kconfig" From b0205abc95fdad6506ff927a978792dc67919e73 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Thu, 24 Mar 2022 16:54:29 +0800 Subject: [PATCH 20/25] add README.md for xidatong --- .../Nuttx/aiit_board/xidatong/README.md | 181 ++++++++++++++++++ .../xidatong/img/NXPBootUtility_1.png | Bin 0 -> 64966 bytes .../xidatong/img/NXPBootUtility_2.png | Bin 0 -> 64709 bytes .../aiit_board/xidatong/img/flashconfig.png | Bin 0 -> 72092 bytes .../aiit_board/xidatong/img/menuconfig.png | Bin 0 -> 31565 bytes .../aiit_board/xidatong/img/menuconfig1.png | Bin 0 -> 18959 bytes .../xidatong/img/menuconfigexit.png | Bin 0 -> 11206 bytes .../aiit_board/xidatong/img/terminal.png | Bin 0 -> 14116 bytes .../Nuttx/aiit_board/xidatong/img/vscode.jpg | Bin 0 -> 57472 bytes 9 files changed, 181 insertions(+) create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/README.md create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/NXPBootUtility_1.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/NXPBootUtility_2.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/flashconfig.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/menuconfig.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/menuconfig1.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/menuconfigexit.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/terminal.png create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/img/vscode.jpg diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/README.md b/Ubiquitous/Nuttx/aiit_board/xidatong/README.md new file mode 100644 index 000000000..1e2496329 --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/README.md @@ -0,0 +1,181 @@ +# 从零开始构建矽璓工业物联操作系统:使用ARM架构的矽达通 + +# xidatong + +[XiUOS](http://xuos.io/) (X Industrial Ubiquitous Operating System) 矽璓XiUOS是一款面向智慧车间的工业物联网操作系统,主要由一个极简的微型实时操作系统内核和其上的工业物联框架构成,通过高效管理工业物联网设备、支撑工业物联应用,在生产车间内实现智能化的“感知环境、联网传输、知悉识别、控制调整”,促进以工业设备和工业控制系统为核心的人、机、物深度互联,帮助提升生产线的数字化和智能化水平。 + +## 1. 简介 + +| 硬件 | 描述 | +| -- | -- | +|芯片型号| MIMXRT1052CVL5B | +|架构| cortex-m7 | +|主频| 600MHz | +|片内SRAM| 512KB shared with TCM | +|外设支持| UART | + +XiUOS板级当前支持使用UART。 + +## 2. 开发环境搭建 + +### 推荐使用: + +**操作系统:** ubuntu18.04 [https://ubuntu.com/download/desktop](https://ubuntu.com/download/desktop) + +更新`ubuntu 18.04`源的方法:(根据自身情况而定,可以不更改) + +第一步:打开sources.list文件 + +```c +sudo vim /etc/apt/sources.list +``` + +第二步:将以下内容复制到sources.list文件 + +```c +deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse +``` + +第三步:更新源和系统软件 + +```c +sudo apt-get update +sudo apt-get upgrade +``` + +**开发工具推荐使用 VSCode ,VScode下载地址为:** VSCode [https://code.visualstudio.com/](https://code.visualstudio.com/),推荐下载地址为 [http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb](http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb) + +### 依赖包安装: + +``` +$ sudo apt install build-essential pkg-config git +$ sudo apt install gcc make libncurses5-dev openssl libssl-dev bison flex libelf-dev autoconf libtool gperf libc6-dev +``` + +**XiUOS操作系统源码下载:** XiUOS [https://www.gitlink.org.cn/xuos/xiuos](https://www.gitlink.org.cn/xuos/xiuos) + +新建一个空文件夹并进入文件夹中,并下载源码,具体命令如下: + +```c +mkdir test && cd test +git clone https://gitlink.org.cn/xuos/xiuos.git +``` + +1、打开XiUOS源码文件包可以看到以下目录: +| 名称 | 说明 | +| -- | -- | +| APP_Framework | 应用代码 | +| Ubiquitous | 板级支持包,支持NuttX、RT-Thread和XiZi内核 | + +2、打开XiZi内核源码文件包可以看到以下目录: +| 名称 | 说明 | +| -- | -- | +| arch | 架构代码 | +| board | 板级支持包 | +| fs | 文件系统 | +| kernel | 内核源码 | +| lib | 第三方库源码 | +| resources | 驱动文件 | +| tool | 系统工具 | + +使用VScode打开代码,具体操作步骤为:在源码文件夹下打开系统终端,输入`code .`即可打开VScode开发环境,如下图所示: + +
+ +
+ +### 裁减配置工具的下载 + +裁减配置工具: + +**工具地址:** kconfig-frontends [https://www.gitlink.org.cn/xuos/kconfig-frontends](https://www.gitlink.org.cn/xuos/kconfig-frontends),下载与安装的具体命令如下: + +```c +mkdir kfrontends && cd kfrontends +git clone https://gitlink.org.cn/xuos/kconfig-frontends.git +``` + +下载源码后按以下步骤执行软件安装: + +```c +cd kconfig-frontends +./xs_build.sh +``` + +### 编译工具链: + +ARM: arm-none-eabi(`gcc version 6.3.1`),默认安装到Ubuntu的/usr/bin/arm-none-eabi-,使用如下命令行下载和安装。 + +```shell +$ sudo apt install gcc-arm-none-eabi +``` + +## 编译说明 + +### 编辑环境:`Ubuntu18.04` + +### 编译工具链:`arm-none-eabi-gcc` +使用`VScode`打开工程的方法有多种,本文介绍一种快捷键,在项目目录下将`code .`输入linux系统命令终端即可打开目标项目 + + +编译步骤: + +1.在VScode命令终端中执行以下命令,生成配置文件 + +```shell +cd ./Ubiquitous/Nuttx/app_match_nuttx +source build.sh + +执行完毕会自动进入./Ubiquitous/Nuttx/nuttx下,继续执行 + +sudo ./tools/configure.sh xidatong:nsh +sudo make menuconfig +``` + +2.在menuconfig界面配置需要关闭和开启的功能,按回车键进入下级菜单,按Y键选中需要开启的功能,按N键选中需要关闭的功能,配置结束后保存并退出(本例旨在演示简单的输出例程,所以没有需要配置的选项,双击快捷键ESC退出配置) + +![menuconfig](./img/menuconfig.png) + +退出时选择`yes`保存上面所配置的内容,如下图所示: + +![menuconfig1](./img/menuconfigexit.png) + +3.继续执行以下命令,进行编译 + +```shell +sudo make +或 +sudo make -j8 +``` + +make时加上V=1参数可以看到较为详细的编译信息,但是编译过程会比较慢。 + +4.如果编译正确无误,会在当前目录下产生nuttx、nuttx.hex等文件。 + +## 3. 烧写及运行 + +### 3.1 烧写 +1、烧写工具:NXP MCU Boot Utility,可参考[https://github.com/JayHeng/NXP-MCUBootUtility](https://github.com/JayHeng/NXP-MCUBootUtility) + +2、xidatong开发板支持UART串口烧写程序,打开NXP MCU Boot Utility后,选择好芯片类型为i.MXRT105x,开发板上电,使用串口转USB线将开发板和PC连接,拨码开关设置为1 on 2 on 3 off 4 off,重新上电,选择对应的COM口和波特率(需关闭串口终端连接,确保该COM口空闲,否则会导致Utility工具连接失败),连接成功后,点击reconnect,等待NXP MCU Boot Utility中红色显示变成蓝色显示,则表示已正确识别并连接到了开发板。如下图所示: +![NXPBootUtility_1](./img/NXPBootUtility_1.png) + +3、同时需要匹配xidatong开发板所使用的Flash型号,点击Boot Device Configuration,在Use Typical Device中选择Winbond_W25QxxxJV,然后点击ok。如下图所示: +![flashconfig](./img/flashconfig.png) + +4、选择编译生成的nuttx文件路径(nuttx不带任何后缀,是一个elf文件),按照图示步骤,将文件烧写至Flash中(若烧写无误,则下列绿色进度条会执行到底)。如下图所示: +![NXPBootUtility_2](./img/NXPBootUtility_2.png) + +### 3.2 运行结果 + +按照3.1烧写步骤执行后,将拨码开关设置为1 off 2 off 3 off 4 off,重新上电后,重新打开该COM口串口终端,若程序正常,则串口终端上会显示启动信息打印输出。如下图所示: +![terminal](./img/terminal.png) diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/img/NXPBootUtility_1.png b/Ubiquitous/Nuttx/aiit_board/xidatong/img/NXPBootUtility_1.png new file mode 100644 index 0000000000000000000000000000000000000000..939f60f23024d825b0d0b78c78bbf13864fd5723 GIT binary patch literal 64966 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 literal 0 HcmV?d00001 diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/img/NXPBootUtility_2.png b/Ubiquitous/Nuttx/aiit_board/xidatong/img/NXPBootUtility_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ad7417eb5d4b303bd4b84fe7e18dc0814b8988 GIT binary patch literal 64709 zcmbTd2UL@5(>975MJxz{Qlu$pPzk;Fjf#kX2uKNC2%UiRPE=4qni`}EQEAd4l+Yte z3tg&|fQk?x5+o1;Bq9HUZr^u*-}=uvYn`m6EXecRW#*o1X0Dk#?)EKRwxef`GBGi+ z>D{8~C@Tx_mm#OszknYH{7rPPFqIDoECatBbk#Q0W@4&JK1REH2>AWT zy&DjJCZ-b~_x~N}@_7ekVxn2;UDLi3V)ui7tXV=2GMBif)Y@r%r7vsyXag*FB@G9FpzWbTu z(We8(-rx8nMR{~2{kU}S26XB&(TY&CQrH+?Hdbq1QQL|c#D@n3YnY9Vwd|UZ)y6zm zBfg6Y`)X~-Y0Yz7VLcb~>%ZGt^e-Rboh@sTYyQH!Lr-Rq^hsocQN%YcZ@kgocOz-Y zf1h<3Qi>c=YB(lY|6XHhVwR}6`zg6m3r^XX891!9t!=>ldr07gH+<*iAhR1elzIw= zK_^}n-n|;U{p?AjAfyed{by>96)73W?9M=NW0rR#7HfS)Hp^LeR`|pJdSdS=IkaffG0?I9?huYONS$NQ=YrRw zC{4Wc_VjCooaB8;G7EaRyN{gwKv=qv#oSX_a70~5T_<5mpeY6hjEUGUWj9x^p=4{ ztx=*XXe8^5_ad0tX3@11WI)K<1#?00%`Ra-qlf_l4iQCHrF_S?4%qJTPc#;`{;Vb9 z)}k=fQ8BHrd*2tc^fe)1E$YggxVsW$pux0j;iC-8vMU8Qux_f86xQ%umt|LHGLmnF z8di{kEwHMC6qirY!veY`k_*L zZm$o6^c&8cIf=g|XhASZJ|m4jK`Vg?Ns+9X*HLzS_X%4mAS39^DR;9SmE-YOP+DQs zg}wajH+*Ko6VSlOsTuPpDd^+L<*Ngii+mchHM_duQFT}o_?D)5RC#0q|38O*N~o*^ zD}w4fB@SbaOCzPCn>$+Qt3Jqx9heVdp|+x_RUWd}wP80ewBDCiFHB#!O8Gb#l1lyR zs?nkd(Ik4e?kqlJPX+aE%x;4yALha%wGazl^4q6%K>7-m6^DPaaq09tDbV(EG%)ko zNEtoJUP%bMwG1m+%{b+np)_{rbq z;Ko)v0E)knb-Cd<_j6jrhEmkLQlr}JI(|lfq1R_HI|~PGm|Gb1oujwg2T?RbdvJI@ zBVS7R7MGYDq}^d%4sr`KZ$@09G&dJwMdD?d%$e;x|F#`aSGGHzH?LhYDwm5j@hW`Y zNIQ0iB0;ybQ?FsjZ-wt!%QR4++Uvhd>ri>#Z>(iWA{wB~L0J`AaY zdf|;UcVakvIflAt-!emgUtzl#wG^71-3R?tajb=4G-ozE4SilqGD{BonIo+Pz3s(5 z`qKUO2^t&Mo0O>nFDFNVYs*pmaX|)S&X%7qQ$(dN1kCnSy78WRfc?bHp6qEFIVCXm z$sLs1&?rG6zjOD0Jon%SFRHN&2SW*XOujB>9fE#0XB1XbL*FetY z#`chna>Kuhx}@0*bf!xWFSSuZ z4n_yTPFc!sX+zJPGgUZD@lbPt)F#`m`%SuyTm$5_kkJc$evf?UBMH5#=1N=txdVeB zb!z*I+6rQmjpyqF1;zeYjwUvwSU-|fdL^~UF`w;Che0Y~_RHSS>@|O*sO5Ovf(52q zgPh4zkEn=frRG~`OwfsIdv_gB5#Q#8gOT*ULY$b^4tCNo^@{A!iNjd(-&W4xjf3lo zqSwS{3y#k?-!6ACx)!}&tYJ*o5%OWVxUTUDXhT(pfqQ&^$s>bQ3;XaE z>NJMVPnjHy=!x7KIgOX$&vLHPwqW;%H`F}dUbld~;^aO1_#3UCUSg0OI=`T) z7Zx8kG`9FUX}I*~^ojPEjw* z+e^myydt!TM;5T*&CFqGJzpIE?Dul`yiXIM9PadN&sr+9h&rN09|62h;!y+kKi=Gp zx#k&`^hhe=jl4e8ya#-P?^1l-olgcl|9OB5c;MksDXBtK$A{_9%vU_6{v8n0Yx(LeOA&1QH$SCDv7I z$HV4Vs_TThgAbn1y+kP+^zHl;_PlZSxQob-^lBAAS+ z_L7a7O&ly&EmwQ~T*RfXO2-!b-<|ujBJxLXUyuFabH`}yz&fhd1*GrfaaC%p?v*(DdCXi08>zu-jo3yrmo8XUj zqK3p&%M`04E_*UN`0BNcGpTF3_~z7wSh_Z>VZ&U^HX*&f7tLREp?!sf{Kbs8omaME z@OI5chaO;G%;KAoX7-2+UiP1bkb@Ja7h$7+{J)#GgcoYNZ3=pCf_LURGY;Eb+k197 z*M+};MOPtxl$^$L<0JHv1&f=0SzTD!1B|cwU-Ped-wCS)dCA@r`W~2WvRl1goCLXz z;XS0C)%1<*_mS1oX1BiE_acw8+MZllVwy>!Q`tbG>|%1{>5X&7_i{$pM>X;E(u9rh zhqLI>zF6}^ouRw2*J}&IaqV%=CYC{MwI_mJ zyOV5f;KRo1%D05r-IHY;w5(HvfAFpx2$85ZY?bJ6w3sQbPGEPg8zuMp-dTO;Qo9s% z%H!3OFsdLmZ$y=*=eSJFR;-CX~txvaFzuux;-S^ zY!-W8-VOggx*tV!S||~HP&K5ixIBN3B{78pO0>84T1-ye^J*?uJT%S9vL5*@FuS8Q z=hYp}nRN-am*12Xrf%n%fpp6{tHzO!YPu>cs4413DXVV7Fl6GH0q)^e|$F;N` z%gpn6k0S3aLFvq?6{dUPsMk;^Q4YuPt`qo(7dYVVrj`VKdvQhW^QZfT1HW%CMn z#uXZ*UV-8DijtgOtX8l1C!Q`wuT3lUS7;?SmPfW!e2V%5BUU$#0dVt%Z2X~eKL;4P z*SHskKXHO-R}_Ezid!y#U_<7=A*e@^Pk!wO)28kKU(C?;BZxz9%6?l`ift{{kAPd# z%r0VbxSb;kj0em619oSw$U3-uN!X3`KlCQitOQG%9E{=yvPLGRu%8{enkWI~UVHHq zU%uKL_-tbZ#0K!)kzd~qMPv3l?7@czNE1()LzFF;6w}QAAmONK^Is2lpYD%%`VWj= zjeQ`uB0g|BM$!Bae6pQm8F*KrY{4;Q`3E-TV|bNwTff<8yE#4j2b+gD9D(Ki8f>f& z)EhoWwX@`8Jy+AO8o4Xa^nU3``+Gj}Y5dVE{3Q(r+$r_~t}#P(`YcjPa}jb(@7*%S zpr00xdr7wJORDoI!a47ovS>`5?XYnzivkmq(;J!B#Jea<^83a6z=R*5d_~FwtfATd zVwB|5^k>;ey0(nCiwJqu#P3z^)ItG&vBNXZtHl=IcQx&>8L)G~bnBISG zgFfKh$30N*jSk=IH@^2jhzuTYV#42QbP`o$@yZUQ`ew=f=$edFF}LkB#Bq-#@TKwo z^I|$o4l;nj>k(;dd$DTp`KwpGKl`Jjz9_BO&;vGv)jzgu_pvvYRO~#zpN63w#>H1) zdgz_jjA44e1bVz-M3sIR=|89$7TrXe(rpsAr_|qfZQWfb*1~`CQgq?F{={tIy&WN1 zY51V7FhTR@x_vNmdnOAffoBxV9=+mz7nN`akleM$D#lAQ*vMe8G#FaY9Z;w5U!X6~ zznCryTY(9f4zxEoT#xnn*g9R|8ZDp(ndZu#CZo2l^4$o$ncFJDsL6h0_3dSwtj?Oz z#cAjz*EY-5X(_+4$3s;JF|n?{lXNTNX1m^Eer*~u3T>d`)=u!>-!nk>LmL)$ef-h1 z@ua4O&9ukO-x>GNuXb(*6Q0;Z@IS`wTbB>xMx>^F8T2YOVwF)kX}fE+URQ(4gJaiV z4B`~lwxQY6D9FCKaq8|}vEQ6of^~T;%46eW^Grd0C29M%_t^e6R7N1HLF3 z+UAeDFsMqD4BgTI(Y7mQMl{xzwCd*?mKnYi7`*l3m$~|h76Si_=j=MeA5L>MDnmcL zZ5o{gUS|~Cy3L%v-p#IfxpVXyaQvGGPE%ewkyjuEe_mWkVy-)z~)0I&P9ZgnVMkD6ZCBP>`gJAJa} z_e2Q@*5k5mgYQAx{ru|jK|$;@&rdVoZ+H)#6#6YZ=S(nqj|#WXJe3bQM_RmTyjBLV zD`r+#Y}Z?FW`S!zk%lV*(9J9MYLuNU0;j1S)ra1I^e5&DOH2%6zEN>ybDI~OsmR?W zDOfsK%Xbk$JckKIgirAo)2dF)kz^=ecxJv!s?e(*V@dNEKXytz54|Fqk zp5^-!ZDd|k9_xn+jx*ChWU>I?Nj9V==z@bHODsEOmu>kk0$mbjw?8lrI_{Ncn(*PM?nj-hL}7s`}XKO3gAKk*)v zz1n^r(q772gca#>rF`j5NPI++8%0VKoGj%vNL_8)eWkuDXPb#7(eQq zG}?s>@CV?e4bW_ZdkL8S2B~qEXG@*@C3MW*u4-GuhR>uwaRO6gfLWi$^wBE{BOo84 z4c{-U1+(wYn*rtlKk7)@9EI)LZ_HDSAe@7TFe7W26wtA_BPOI9jc#jp?3U(H1QT9-@nN!Q1Aiv+w|A9BO~ft!Q}xR@dC#(!6T8$-x8fTeZo@# z%WW~>e)Ed&TR%c_G{CTyGvj+uL@fO;PhPoOUmtI$oR zDVkYWzryL&`stakSLDXChHIWtF|NGKqJ|!G;i#`5{hi|e(#G8tzouRVh=(01cxGpg z;S-20XvX^OrT;ul+`*8NXXbNg&TI&skfCD(4R{6-nYQq~_ntGZs|HJ|v~PJr?Z8K- zh0~kXekASPXf<81Z{nY&d?fnA$*m`5*EBaCY557$+WqzA@>NRmiwRsvYBq|E)m>r| zs)E0@D*iE-HaF-lW_vuY($tQP#ZeR_?~v3q%(%E8n+W*2Us#r%M8W%VxVAo(!$ z6*mw7)qdB%GgdLqx&ThWk|FQp?e63x*|)~cFGvxVEE|XwBR!)Tw71X9CxXOCowxgB z&=tq7k^4!6EBQ5gB2}s?qoW*EnO1xXhjtes6XF=&QOd-lVZe`uWr4NBsDG>E>n89tIfy;K%xsdBJ}&np#=&|) z(-6%i#Hgdk&#!C7#K3Aa2_Z-)W{K0u!`4Y$UXsI%mZi7xGp8+VKE>)~wx3VFW&ac_ za=i`aJ?}jtZJg?bnpqC&DA#$c18bZi-ntCC@q(K3R@T|Crt3GTq+-8e!t*ISGd-m| zSfq%8_;ou8PPxJXi`K_^cIzh*3pCSKFHS8+C1z~^NyE(S_!QewFO5WPmdr?4L?$*Z zEHLV63vV{o=nIVj?}nkF19N3Pw!7>zx^|?&87?G=GJ`<%Fpf_Lx6!S$E2`p;EAp;aYijn24b{FLx0?linb#7y2U+O=mg@X`#WhBUJ}( zi!N9h{)Mq)Tj`zTZ#>ar%lEyjQ}@}p3EZ9I;>R}y@+VaZFvkICh8NmXL&mePL=Z-O z-8&is17GY#d+EbxZPy+6>iA$aHGJSJQ3xG_=&-HWbUt)LbkjXf>vrgKnodhFM|55z z(TXj-vrZwq`0t;P%d&>4 zCQ7rGd?1swA(DoKU8G^EERuZl1@iPp!{DKcV|r8V2G7^-hK?!KTbJ)0CZ^)YS^9G0 zo%Jxgiia5JCi1*e3|TK{jrzi4T;I5>tYZ5NW~}hM%MFf{#-xb~*8bZ*?#0`FsHqt-jaAKr!u^cPDu)(a$~qq0D8Clhd)o(b zfmc14J%uiQ1viKPdrGT8*KOD8-}{4vnXVf6*GW9pQ8IR+nJ#{b!tQ!5}?-C z*qD^I*IYaZmG}+6{JqxXfJfV+Okw8jxjt%sPM@I zvs0-6NsPkaz3E?$&Fm=Q(6qoeeu}*sv|w}u>?Gr6aPMSAFwuXlLOhU2i(j+N1e+MC za9v+fr`8fRq_!_pmh9oB;W2kn>96+Esp}u{P2%PBU}CU$<{9t@fXdg^3@nIHxG^Dm z2c++R{lpbOvdzo4ZInN()9FbN;YT;QKBlS6(!Ncf6-q@mv!tZIl#Szeb}h1)a3Y%0 z^#xDkSmO6H^qSQbXH@t5hPzh+j;H8zIZUi7_B{iQ{YaRSzW7`_GK=pG%W6l^3DD~8 z)nU*z+qs$+v(_TMArp9RX*x$F0Va#aa%S*+l_7ZO3QSOk@&ZBnwicp7FmXW(-x38q&OiyzWgsg0}<3!zC_Wh|{1iyCW9*(i*K9v@rbM%KSn?>P9gA z#frk)VQ5hz_l`TB@H8lDUC#L>evb5UjAw3kUVNsE@m;?s0$;In25+}+MpUx*%LrdG z6Gj`pjD3RHb|QXR81(m{<@yBpZ0CN4HbjRL4hvg(S5(aIwjFNroFkL9H6HRx!M8Fr zMb&CxJ#Hwd386&Y$@GKr$~hpt7^)L@MjaH~eC+P<{Yc+|mxadT*IBk2TOFR2_doWt zUCAjw?A*U5w@%QsHy+>pHhqnLce4BJMYh;GEryGVkhe~)O=zW$dmZaR2+=+86=s8H zLH)wWX42@!3{$r!%B}h;Le`vyGK3>K-g?BV5b|XB&l~%c7;~Azq#D+uGr_Gbt6lBC z-CF}z74M`C&ae-ex<6OM#H#>$W(C2H^=y||sGJ><)Vx4+~yx7Q|u z@W;a`+GC|@2!@5(L@q^!tKBrOGDe{wkR&QHRXi)GKVz>X$M8Ny>JWNdI_g55s7B43dS>P_Y7 zKR&6f7|C!b>GnV!TzsUPC5S5RPgM5lb_D5@FVx^LlB4Do-r*hD-f3?B6_M=d@F#wA zRtBk!2Gaf@X}hT@O-;nY_>&sOm0Rv_V~ri%K#2UStDxS|?+s+Tu9=;t2t9HKnhTMC zJt0*qq(%+?k-4W41kyK7Qwz7I)ZrsvhL67NmufZi+ja70{0t@Xxvs55;R{xd`4rNo zN%-^yGo)rWLFewyQy_i%i}F~jaVYX@JltyS+!fPAI7okUYG9WaEV9q4WLiw$MRkKY zG_u}ix}O|Kg}CnTY#Qs1ioGPe6UEUXZ)@;iAp?A&wn#P`!kM=GPU&(58;>ESm4~2h zI}%yZ_gciT5Ahy)GB2{#z_PsLAKV@`;Fi(*KK44sMG^9SBAO<}8n-f$G}St-Gdd03 z*{ul13zM=JjFfwgRFDjN`!W(7h)Y)BOWvU!S`uk3*l$r=YfVO&AIOG64f0xj^vABx z_7VIH)U$iLPDHV&`3B+(S6qJ!t*i^jFt?9TJLUMk8P++GG_>VL19bFsK7nH@2=)YP z!qFmG?aR_$uqN!Kpkm0)%k$f>pn&z=?pd?_)ES$`aGYunxe_Jw?k+0!9M_oHo_xTE zcfLj;R~oW`#FTD7DGw>fw0aCCDm8BSz*CwQF4%t?(E71vw$p1b@Pbc*Q7>-~g{)lM zK<A$9F0pV%AO?l3Qhyuw-D8ua?fXXo)Jvq8n}A4+Oj+nkMR>` z%w!eQuU_Q*O^>j`n(8{C2kzG%LO6$4YKkTA8Kk+OM(qu(&qz2rhF~j>>t&{&y@U;} z?XII6@a}jnq^-w(=gRFEbbF3@fmXD4MCe>}Eu^`?P@~hCv{N+^l%6a`b<@Jc-mRAw z1{rws#iuk0`;#xiBDm8)V9G!UAql!O66Rb z{eA`t>B1#5dNgqUb3cXoF|zW)Bn|M~7rTulIB|eJS>yrdkd490n)tptd1YGCfSZX| zEgd`^O;!orbZwMJ=p>w!k%n%?r3;x@XuDUQZ~dwGOj493RzdXoodms}HTZg{b5K05 zdTr^%qXEXmbiK6?1)jd6Pw&U$Bqrcbnif>-RkLeNO!rVjMewD)#Z35O`SwCZP%?(r zJ7anrv7jxbjJMm}GD;b1`I@X{TRI2L1SfBgh1Vmg(6M6hk{QV>m;RyZhU$(X4l#9}0QGJ;MBWmjXGr!#`Qmn?#PqKs8I?^7 zV{*=l$X==DTB5PWK=w^e2j2<`N3fdXUdfJ|U@J<{C zFB#sGrewgq^LAP|{Hr06U5m8Sn0ix~_T9cgcYDn>&L9;TF|GkbJfTLxyN`VWb=T-= z#4_RSs>V}SLiZJk^=0`i&ylG!Y5u^XzwNRcYp()rW{J&D_W zZUKb1yZgKu!z0+vAhnv&-m(p`pBJ(obc{1hJ&gGRqP$Xqmr4q*T);5mND6O1Lr)5A ziBs+|=9MtLEql1RrF|zgdV!-ybl(%1w6`z=jC`l(b;KdXWSBgJM!0f7!;t$^nUY2m z&E1vK1OG8g{s8|bMEx!mY*fs~4MY9FeCHy%+V38q@W6M_f!N#j+uuSdOBORfw%`OK zeo%ZRBO$!ewRLNNC@2gxCWZbA%AVE-1NDHZkh>@^4Qp4F4P%v(XhK5jbR)Q-kQ>FAlShe zdcV~Hb+*R$19UmpUkq23?L_?E5EjWCgZ=Aj^nRhjjSxsDBQlOMwLJ4@Iag!c1N~El z&6DvRUtK%3?j#of$||tYl~HAP1Ym=Qj{K>TxJ|ztgQ^7mNLO=F z=EC0+DoJ36J$r@oIde|O$}CCUl!6K04bxewzOn`yx+PCnz`=M{F||jS8r=7L5LU(U{Cu6oS>d- zkJrzw$h+2DX3i_kt+inXZ&*AdXItqA6sBSnbzTkro}*$R9gN@;S~1J)E`8^cb*@u7J66HA+5=8^U@`DQ-68ZtWYfVV*N6vrYy+M*eS0c?Mn(^j{{7Q3U}LrV z1FlR=_X7`~8!ZQD-fwaOS*_)wD3_QUR_>jn2X8%zF)KamUO9Rc6EiM*tJE?LYjP2y z=#k6r6^k|D6Vo(G5y}D|TKBx#*ou|$pqKL)q?$SMNnDE7c@NcoXX~d46bX?mmX}`z zSF*m+;EM(}jLK^n1Yqp!y1qFn2@ZjnW4Ut|hMUDjj1?uG;x~`wqCIXzN zQArl@%A?9_4kwl2XCJrnUBP{TPMY+)qE3xI?s*UuxF7szn+)DwrrqMkmP`by0x$pk ze}B0)6Z}BNF-v4*;_=bH5cxe7u7v^g#@oCU2UNn51~GsO09NpLdFE1Z1ioHP;q8RL zgza&2htv0F+eGf|{e3)AE~fDj7L}hl2Q4x@Nq?Fw3+b7FpIMAmw96zzI*)^TcdITV zbXpHDZ(AuJz|R!T`$dLq@`NVeh8S`)oR?0w1v|hhc}w44{?Z(+^M&>xJ#^Qf6_&LR zM{I~g4%*TXt2<}7t1|A5uL^6Oj@qHzG|TvVhb?)VXA0URs`QG5Gy3I;^03#_4L@Zm zijb&jXX1zKV>oA@c+&g6d$Z0C26)$@)RGzIV4){~*SBM4`G z0A&E6dNGXZi`S{m3wruh{<6P&=uI~B@~|&SO+QiSj4I!siouhQ)QAr(AXNt-nOG6# zPs;|yKd7~iCU{$=F+4HZG>#FGsvUY_X*JnxC~K9L;y?1vqApE!OWQit2h~mYbjHU9 zChgMgW7@Rr=LYU%lQrCny1b(nmj}<)0Kvkf$z9a@p@fgn=Mc^=Tv7E{-^t~BFAE;* zhHk%qR^*z#ZRsYxWMTDG)#!BK!NtF~d-R8wmSLCkR!S&(bw1wWW&>HEz!`Mg48Af+ z)+fVgP&$qz?+Am97O&`KseBEZ+NwSOS&D8-U0t=OZP(R~n0r({#G2$9rh46p&RA~k zZe^3c$S+g0QJ!@nlF02R+0H!d_oeBwsTZW{Z8COv90+|5_RZ~;Z-}+RUl#N-R~#kv z8Cf(XhJ+Hq^VOM;inDp_Lf(W{z^9#g%m+F5t@?U8*!r>oH*e;8I#@@ygT1+>;hXMe z+k5IOwc3ilWZ8;jGqOSA{hrG7OfdOzfmhRZA%1!V=r95uCY{>ma{(C1hXMDA}&m*n< z=^zc|oZk0Q+6aE)4U7xOL5>36!R3w|1Qb129>`}ZTydD@F(k|{DgyAGN3Qfu9yhnm z&y(;7$L^LMh-{g)lGOOAL{S;2Fg)rn?3gR^sgv7q>Z{UJot8O&fK?WDIP8^bQU!Uk zc03JG0Otvl7431eVZMqLiNhRZ#=y}B=S&%Et;vs~6Fn-eI!bRfC!zT?V9eQ-Nu5mf z!Bme3>O*alNP|3jU~6TWEw!kKG({DOf!*{e?DVRr$|mp1qWs&5O-H-1p(`#t(6@}%aK}5 z<=TGMw&W^svYF0gYF%Wa6PJryb%Z8%aL@xeWj8NCm{P)xi%5jFuAmMj4x(38-+kM1 z72rZQT<cR$R5 zs39(#xoA;+nReEejiztL(k>4dNLv|Y(lRkadq26casy^GQ8;CDSy9Pkp;(b%N!8Td zVIFxqbxYb*^j%3=;`6-OO5Am)Rll?z>j{QT4;yPgbQU2 zIPsv>K&R6-!x&bB%z*-%>npSf!X~uE*v<*r6VXTvQGo^1TJ?AV*N_LW$k^J+htYmD$P0p{Ao@-Wrsjf6-~aix8^ zjc@hU`&{viGz6TCo~LcxU<=G%?2faTORoXU9H}RO2m?){rV58$aA-d*PQ2$U%*Mt` z+MYjbCm~u^)8$8aCD5OrGF_ZDJ!OB^<;4$A_sgNVpI(z`m)z39VeqCTLwuFKK=N6i zu60?oOb2>SI9ax3V*{qA6gLG)YcUXRnuR3|7N!PP=Md+o1OIdK04n_HVncAkN|YR4 zT;yWz_zyWfHuHT3@kGGnxf3kbjT<(B1%*5F^)(;U67`NlS5ymNQf_<~`$k(k-x~`v zYus3x8e}a};+0=&oNwHeSss~n=bxr1l%v;LZ5JfPlLM`PZCc0Lc1&}{Qg6DIyQ&wo z6Sy-uWiwWktgqc*YpYA=dpB6k@KxF>BS$2X(qKo>h~^VLAuDp;oZc3(gf$QS7J)o| zs`xrdO?eo0a%xamrJ%EQFu-f-+w~^qgph{F7Nar6fSfNg)k)FoJGXiV{RKN$OM6(5 z)xI`A8ZU6K*?Y7UyDrX8`+6r7`#c`H@jKrHc3w)160PRTtX6)QA?8M&3PR))&r&Dl zdAPHGF28^MTHxZZb93eMS?_=vv6$&gaV*Ru=|a$enhJsAJ0XA&&gu#?7g>}Auex4S zh$Zjj(!JF{uvLj6avhwzaTc;wX0*S5TnyB94DULItE=$Sq+0&Oe37eZINu|D;?<+Z z$d0YT&`}xL6}LI`<$io3#S=A1%19%xz-ny|3nHtu?;St(P}@(tQ36#KrsCmryWo~M zdc?1c)fR6wGv4Vs6z0`9Z{AcGgM`T1lhip@RL|gxJ#=qtzMKuZr8J24!)z)tZ{(f@ zEJu?JL5_0?&ABwG!|hwF0LXafew?b$|_+HxS6x&efdi_h0)G6|JbJFI;+U zq+e;!p$IY-<%rsE*$7>)*xpnL$_n4RuY>fD{v9FjXX+a>YV~uk4LPGvTORs%?EODh z64!RL^sfOm%Yy^Lv2T1H-$wu0<_V&b8=~Fekof_;Aowpld;5^m)pypvQgXMP@WT}T z8od`AeEZFR`nIrMhDcdZ{LH? zor%Nx4P>j=%?G`3X@{UOrtQhuU_Xzs2C`T0THjmL!i@Y z|C1Htb_dj3<8Qk@pP1Bkq4bpT9OQ3mNG7 z{yh7hVtgOyq*FU%%-xwqpE(npxY_e%z2cM^tchlmugQZTxUZp zEWKYP{%DLAeaRxt{9l1wcSYT)SPC%}xoO{k<($ZJL*8OHNbR|C#30W^f?S@B_4|Gz zsN>>IKItdkMhSU1=HT;$C*jv;RR?G9R{bEDZlex82{-ODO=TlYYbcwzk8Bnje14o8 zjZ58iV3h`L5&|Cw1V`c^v?xtqRK&RyjDr>tUaYP>2sU)id*yg3?{;fk^wLkBCD<@U`pF8R2dr%`-Jd zNGP@vy0pN*w&aF7Roowo*d2TG{`HOYi(D6uBT}%&#kv{eB+l|F@rt8{Q@9DJdr|Q5 z%rWSs+OrJF)a5F|i4$9YnRX0byp)*Ic|4;4YjQ>exGZ;xZ6t3dX+YRpmvneK=GLE# z8<;I?P^w9eiHSckaE4!@Glr-M55PRTeoZU)V`5iaadU={TAmP#jEZr9_e5<#0NPA@iU!| z(?uQ2w=s=2^r@lp99t94Ebv&Ee=0Ts6n}TrVB^ko`oQJPaqIr}jB%#mn8=&l@_v&@FUAF?nf@-#-Ybp^_NMRM`@H-2)YizSp-JQ-0OIPS^e6ySB;! z`x`E)OCeJZC(U3(JN=Uv@|R`$xx7*3qBAF*QKydf6b_rUczU5?D!yD>uELt!KEs{3 z`T3_CwLEPPD6*%XH%xWUl{TO3{3p)A5Q{Q^&av0NLwC70da38~ZJ102#vEH4*u* z74Mv=dGJXZk`iY;KE0I) z!uTrOn5?xZLySjbTKv`2E+A=>NQn`xtEQWu6Okh~58wZa^=*lhhTN9=2ZIyhZK4l(I{Z}$ zZa@DV0yZ~rlQYhn`E0=L&JOAg=?9|o6!Epc30Nn!n9HoQJ_cLHiX0H3rUoqi2dsgeb87(3^ zrg<(M-6cAXi`x+-tHBI{F#q>Yb7dmr?nXFWH)Mk=3QB5`xde2W>6B9oUY=n3h?oxp zJn(C~7YAhC57hu;J2dU77$bKb(h4D=nwoN=9-4~ z2py7T#rYkG%=(X0dewcWWUS7QyBq`xH}U^dEv$)v(`4$s@LNWuM`3lbpU!nYerdGi zgxZFHqpm;g%mM*C+ly4$&^$xg-j1h7{=e2y(h1kPIZaTBG~i}fJv+?>zM9_;U7iAg zdh7qEieiQ?*0Old(8QUK8aAne8r`@k zJpWAOU`Oa8bZJ-d!I$)RPFk`waLVZKiEiHJPX}k|{}TQDBh8`R7r&%`Hs*SfOct0V zO}1Qby|JUY`U7Ev?m!zBl68FarGjPj?e6B(Y1{oel6sl0^;Ds0Uo~p7qGNnz4ygAd zC3t4lNb_StV)X9DWfnSDl18^+LO0YsoP3>Q#L@2K)t{jF)B5LjWFU&s`*Ov72ur;= zH8f~xj~^mSa<#BuU5g)8&=+Ryyqe@`xgW8d$?x<)Z9hRxyk&QP{<3^IEQFvaG1VGk z9oBFRiC$B5h4Fv?t&H=}+jgpaF0w3LW$$?+uw>Es0i9Fp_z@)u(x+BgmSIH-Vw%rD zI}XMTI)-$oeO{45kt+miBhmT>Sy&OweQ0D{`C){!&G$wht7YzWIqUJr%p3S@9!BZb z@St~#deElt`WX~mL|m}b@V{&GLbV5W5w1GHOmpXbXUkDC)r;sQ>n@JzhhMvYow7?O zZbe;nzZ}~jT^a}6VtTR;l>S}1Ddp{$pQ77R1+}d;<{Z_cijch4dP$kil8!YYS9SJo+Vw^}Z`Q;pdC}^?8y%v7 zPv7KDA1t}BZ^-Cpt_9s%S}otyg|Z7a@`fYAYzmDg0`jTp16*C-5mUM zWU%T)QhNfV>l9?T8&^DQa@`6U0~sfr-ngSqIn!k>6A}p~FoQZwv8zYIXjl3CXQhNw zr#BvB+vVK_xLRJlYnr$0i%&o4=n$K6u0Z!wH>ZrHiG4`PC+BviDwlRv$C_>mX1m$( zacrB@!pnMIFejxz&pK-Iu)U9g2MZhc$!~koQleMiIn}jLkrvfy)hmK5cwRqHF;W|$ zSyBJWjzU`2?C+^qn3(qyu~qDxSa>ckB|PCCWt%oeB50PU1=?YRCNA`9dUrUee6N43 zv!6*Ad-Q?g9W+=YGds~ArQ!pkT8JYi&Vian0*JsJ!oq|^1jP7Nsuef6zhvV`lr0y2 zthdtU7e2)4&^!$4z1cPctt@QVHfs-@UA!tCEqcw)KJyIg?8Vr+F^K(4(r0LT2lP`Y zK;f*Sr{0a+yxN(T@m4GA(zve_a4%JEtfk?UTA~W-+;6+w(jZkf`3&uFfp$$9&`hMH-&*-^X4cu534nFN1icOl>6&*&4&L18eS4=b zZKS=bJTS36CIp91PIJW)(wx3o+T8jnV=39da%}v4-h<<i74$!* zEk7-J5cQF12-KE~i|j~`?PKz^2151;p1wZTl^5Hb2C3s)z(r!Bf8>vcijO<7A1RTO z=}VR&CLn!loO8xz)#rny6H%oRm72d*H7;kSrCSz=5$FokI8%}^SdvC>99Wx(%u&YN z;_3*E2+c-|6VsdmRK&~5B*j5XsIUf~Szx_nnQo)srur+saLINB@c%WOV+EG)h#~@K z6j{(48qg=zwcTuB^tWcx1b(8o`g<*DnXGKzEZJKb@!LTqq#v0&>s~Msz2o@z z?5hQl007anq?u@8HU)}8E1T0iNSA`nU^IfXN+>cyrAF82i72BaR1|5% z(FhoXM*#ugz!#AfH^@7zR-P&R1=SD-_aS2 zl1Gwa7O5921IvEB^5XF;tSaxi!`Qi7Fum?N>FRDF(yE}ko97UBwWo*DZ^>^&+ghJb z*5jdG<@@$XsKvNvTGyWK46DRc_@purCU@_xtIvGOK{?z9QS~{v6B=P#S2=W>!>_;t zo-Z!$zOd4)%kF)F6cIH6a?69dZ0nZdBL?<=Jux6n1u^Y0u~I7UxyMb7+Wq9DI4`il zOe|@@r^BJo@XN$Uji`%L(*f&!I~}%6=|_I%=i%R?5b={0PL~}fZ6^|~hG z9g4_yEcreL4_7sTyBJCR33fN zu8yHP|CH%&6it8KM}x^DfuRnPi1*IGTE&c||A(4DUr$2GWhs7mfJnG?ic=S)F+}1^ zpmYu>5U3~5vrQNKZc99#Q!{z_xOy=Y6c0D32jj;2B&d3Al2$|s-FWE%y!|K2o9Go9 zLy;lJr@1Ku9ASc@*7*@pN_v8-OyUh`ymY}E*gM@bJ%sYn)!ta{j-djE@Ae(#E-XSZkhuiDC zu%@+FlAfmdO{?dy-mOUJ1=$ehm>8JlB3ux&#g}d2v-dYh&5S& z?YqCIQWL|?uU@E8iKU;d%-x1NVVl0(wSybv8>1TR0OFk^?`T^2p?T~gLBGrFQurwR zQa_;cMlf2%40{v@ce}c7#dr-I;4S*j=~PXpC2aBI$HJm$SdLF^_fQ2dt}r*YT|CZsY0@IlIbq1Mr!gJi3P>KqI~~Kc zosDMgsH!c-XqlKGL~g=e#qnjm=&~DzluZ<5TcT~c0y>CPqNCfr2{+Z0~ z;1{1DK;dfydu9B~j{)9D5@sHV9&TZj{TK6?mp*CwE%)n1F>+jamo1Q9FWBd38`PC_ zdtkRfPusA7gP&NG_%(Fk?Uf5wn2~>x{*`AdgTD%ZKL2{(2SD`_N(-juEZ1+Te-6m> z0!4=o^Iz>L6gl{FxID@q4Gzvtu&;c)Np33{zq_1lT(7;x3TkS-hMrR8U$rOuQ|o@K z0oeKj4c@DMAoG5wtOefDlK=cus=DmFIk8CSJ+o`+${tVTE6lQqLE}wN902M-12hHzJAmo-s^pabP6nk8WR!?9I1M8 zPMcGr6J`FteSseyP6<)++$VC`{=?}aGnYL#8H&n0etmy|fC1}=7-ONJs=8}Lsy2Ti zG8O8dFdA9*gHj9)=YKRNv8T^H|Iv1+gcc?V1*ly!40|<=gtw38x)#{-%cPI9>qSBv z5B%OvB8)H*16^}uI2~JvADSKE-x*>!?Oq%kjW7D7pKgMRy6pJ$Q$8=lc>9WhTRuKj z9Qc{#HyF~`=A`D|Nt$@}xEH}&8uKY5>_i_;y%-|aMs`0*-)w6&J1KNM_Cw&EqN?Ce z_m02h4Dpx?l^AMl(^gM$WMXbI3&~}3k{tTjB_rlts+_W_VO}R(#{WDj2k0feM@!8z zKAVXR_)9l}W5H|;FU$|$>>M@|8&%PJ_&HXn=YWj4Bc0XubmHb#(fa;b6)4fI*Lj)X{;}`*S8`2GJZtu#kuMOvi`h`@G?I zzc!!L$BZE(#n}72hs^yt)EDrWfH%I`r*df@{`t<|bprXqQzIjTglfoV;P(|%bHh5T zL>PU(n^*Q&40MRG&uME5)H%mGQ4zJdmo4&J`DN2vjm`6-pq0%0CBcvRs*y2e8EJxW zN9v$wE3qY&XIdf8>O0~=5Xy9>Vri;_dk|$~jJ+jRcKn6yr-7Fj-Hlq__^hT3OpdI_ zUZowwJN(|iq}*tZ^Csq1IdE&}Be{TAoU`}ulwjE&C;2jp`fhT47EjRcSGTgdK;?a_ zv-u16h_bEyx^Tz;U)DQk99%Q@5KU%adwxz06v2ME`IR^3PA(0)Q*WYauludx+qR(5N2K5Uy;K5g?A-wNzy zrq{>%e+WrlR@|6E30>jc#!WlxN9e0sUt{mlKQ&`xjelMGw*I|2_RFkNo|uYiUiM`6 zMVT_r(lQQq|9X3$;E*9LL#;@Qei0jvb9VO9Z&J<252HnDDLTxgtSc8rHDWFhk_Y-8 z8YUyg*F_Dj(sEtV<8^E^a|I=`9BTvsRjgVpUcOTzZQRNhy`r%JSz((~p1#=3`oT>v zU*w7RLDKT66u1Jv>^0uOjj--dd#e!n>-mX}whrcYYvs zM^BTwKW*HoEj~T@RbOTs*+t5Ur-iTjaaG%n%Zut65T(ABIycMQR>6yM_7bO%F!p0% z$-=I8w=Sjz-O1uWFd5o~$*fa7bADH4AD<95n~tZ+7t;>L(_!yOT%EKcAlZ^yw42nD)Q~Kz}Gut_gEM=04VI+G%kWEJdL*Fj~xjS8RpmD&1>)NwUD^;nATevfmL^z713E? z*=T(eY0EX(Gyb6RxM)FIW>JIw;{c}1f!M@_Q_V?Mkpk^bx!36B9;(16`)T&`18JxkR`_(xiR_bVN)&BR-<|bp zx@ah7grQ9Ivu+z^HM>B#M3>jt&llTMgw)qkx625vf0+5kzWsyy#IEnT65ioH1$c12 zM(-y+#Hiy%J9A6x34jc>^S`faRlOjk~b>@fH_Lrs~5V<^Fb6L1T z)S>YDQ;`&}ML(7e<8F);Ujac>|2r#uP`iOwhZ=Axi{|H9A&jc?N1a655+447M}AH; zyfrp-LJ^~7R}4Q@b|S%tDl|(k8)~ljvfd;wTlndF5uFVq?LUVn7vO!@?elMVRWMUA zSTmKYQq-HXV}SVTy{q-1S?qL=RR+GN=DIDXI*@lL9fig$*0Gyee!-w zDIMdfmoU)@&a%Ec;HoT1*yJGS2`wFu;HvQnA=lLv9 zm7)Us7^=yNS+7PM_;wLuW&OY)tXDzq3S%5qvHx~*Q^lh&KGv*cioqAJSGtb&)Aj0) z$44JU;=?2JBsGAWQt&+?!?$nU6}GCE4+o)?SkSdMcp{J;S{duphJD7;ssG843Be-fpM{a5cqOg87TE{;Mn$r6sRE!ftRc~`+H}7nj^rc4* zUr#_#(@1p`VU}$Uj-lf@0b&Bc;%Mq)X0K$`t}?S442QHk<^)}yPYBGwE3%mdd}b^i`zTQvj7wTf)(PKt_di8P6<`cOPt&6q0gD_ zfupYi7U3;$kLjE=JL7p|l4_SGRrvOwd+~SR9}sq6d&YhMKNwF|$;=8u@*6edeA)xNIne9Wih%(}B^$m+*X74Z6|-Qwor-JE1d# zgyxm(W7KnUAJ$dEzka$4Ma%!dY-uBoHfVXP7d{+pbx1jkOY?00$V)J7Mp7Rjj+Y?Z z8W_5YJ^EaGImg(9(b=?uAD$bf=Dy~W2^N&eXV>Sc+h!9=?LpiZP*d(myvlUsa~Pl< zrrH$+vu)jJ!HIoS(PL)5=cudoGLoAF)tT(m9FRm%>KLb3a{43W;r%)b2S~hxrr%IK zq4gTjuuh*{WPZGLquN_p$Fv`#0kk?ti7gU>AHCgawz<8yQK^LpjWUUZUQl_X)>{6B zacW4@4}1LbUX@Yyh-=TShZ0MX&>P6yg9>O3PkHAV^=Q7%$ZvuwzfN}mRz0Elb3%*3 z!mVqbT}d>FbAJLyT(q4GYcV z>kt7eAe1N<-_N-L5c~9hL(~4Om+YfIAWsTcB8C0rWM2;cmZk3l9z>isVjtur%Q`|T z29fbgf@B$t{0+-cFc3d0o&c+-{Vy~P5Kgl6ybDfvOz4(YvkmR8(n_z~lR@mtT_!7s zoLRf--pcZf71i==pf+Pmq8tRH&uIEDlOB0C^T5>GPqA!dWZL(}r0)+7lZ%{$g;Q-V zC(9fsJE939zbE5@3H6IO%$}IZj_;?n)d#*##Mn_hVJ?J_Qs%RnUdSu( z^v9RVabER;9BI>NkPV6K19@#?e;o#C@fQ`)J@Dc3|6?Dpn*8yj4MwT$qX1SYh(~52~(GgV^uQOl&#fK9L>O{J%M(_% zXc`+NxMjO@4wEXl#~_Wi|2Q5g_)cGB4@j8hlJSm&&gM$-iykTomYuQFs}*6bM41s= zqvR2E!f~)==p9qcDKJh=--d#SR3Dd^WxT@uq}KVPNM;u^8I3pv;6^C0BEqsUf;&CK zUhqLda>W*dKN;HR#t)w`jgwZKF1$SD9$yFs>wW3UTB6fqiN$7orn*=xZ=-$Fht4q! z-v`C&k(INrkUV$i-;dX-kSgo1vmc#fi&{P)CaUnVeCBP_EfFuHo**@uXF(&{O#nzX z&|yGV%UoP3x)63DY+^ycQ1!CitlN zAP5Py@H)zL&g+|xG+Yx1)WzgasU~A9@>aq_W5JTKoID6}9v#kfsV&4vqLSm9HQBO0IZ& z_#L@(>i+q=?q+=uT|o9Q)&z>3?g$*`NzY#JR+K^)^?sJ5~PqqBjE#qdZe^oHpK zXOCcKI!7fnqYb>f`Q>gN05W~omM|fv+g(CeJs_$*9|Xt07PF^Q3aNc|>zs^D&{}DD z^x$sru%?)4CHoK2r7a8Xk_^Sd@SV%1^19Rr&s66Ps`R~k^0%a8bo)iFPg^y1(uv-w z&A%h<5u`=vbdRiI**Rg@tA}K!?&vN14?CP%v#4PB*16q{l=!k;%teo(>0 zI<_bPk}32tSzBd%$%>sriD&H+SI5S-YccDnsem-SQpA)_co~-Wb(ug>z>8r2k=!oq zM{c|LZ2|EzP1a6=CX_CJu_in6Dx^_BS{2l50kYHB0SjLz=gCE>^^e>s+GxY!ED~R$ zG-d-OsPnF$!&^lPYi{6{eGFoQy6k^sZ+iN?M_v*4%RmP2MqFxPN#8Qnj-YN>-`o}m z>K__qTpcXaGs5PY4vwLkUI$e-(j!q@i0k3<_8uWEone{2gxeXl9SfP_cdfE?NYk%M zeQoV)DNn1EXZ-w1dWtDRzh=qUr0Dy$@lZ{9*&QvPZci)e7@gI$Al0~FM7s9cUVE4G ziOVA%*MHb%G&-!X6^+neXWII*Ir(7elU7$Y-&*&)Zm6_PjDq*i3NdNl{BDtA*gLg= zJ=6I9OcIPf-uxTEX92N|-3~(mfT}ZHu;*dCV4V5@Uu_3MO0z_>D7|(HJF{R#zf^_N zu`cAssP(#BLDj4538J4qs;WiSThlL67|@#uiyGHUax})Eur!N zx|&sy%Mp6p;T06pUZd!mI?B-AH}&1=&F3Jz1OEEWcFV0?Wet`KNMDI36|S*bwdawl zvp4Y;-6$%HFJ-J?2uJN!dyY$~*!cT9z_?r-1|pWghGsUt))aleIvsT#Q``9ds{UB- zs4%=|!}tnSdwaQ=FMquKbX40YoK{l8L4Q2wMx6ZF?j^Z6woca=VB-_(5v~nU`aw0{ zk9oLNw3~@~0ndNCdMPS7iTgec#|ND0nd}GV*dVP&1bi?^tY26m_h(+RB%m5Ehk5K) zln3=Q-9?>sdZ3o16#XKzQmMm@iDS((U>hKdx0YGS}%=)S6~0-h89?U87I`h&`<5Q-`Sod&y8Z zq@z(hK5Uq8t5}>O&6ITR$t|+mNgBTBu?Q4oI+$}`H8Q`Q!R{M_0~>aR@Yr76wQhb$+hhj6T&bhOngRT~KXT4DP_+%ir$L?!=KF*|$>k?!j5%DQC5 zjJXr*r3Rn*&& za(cb^h4Qu8HN%5iNlwfMd8Qz2Z12F3Mf7H$kA@;7voo%GYDt)rW}CwY!m8h>fw=zt zbpvrJg~`qi7brYiohg=mG=IJ~uc%}D;hQ7`8)XSqnlWjNuDb;HuKoDP*XG;qmff2arU~M)dXIR$fhCty*{x-y|u|;ucdhLf)}j zv+!{>yMKN{;36S@2D1XULMNTMDoqGp-oX=r9fUOf6gr_}xhPR^=j)jQ&)V_+4oUH( z2$T+#O^K&=ns#Zyc~B|2Hep25bvXC5j(w27!rc1QMAyW%;-3SY)} zSCQ7RLrEMbX^O#<>Q6~lrBOb3Oqs}YALS~nP(0ukww_CIH_@5 z5=zw++iWFe?wK&|zy1m2x5%;)3$5Ow>$!F}vZ$ZUylkPJ2d?c3tG#~8of)QTiHRfQ z7RiKw%_Dd+;^CX7dWv?q%-BtPr&3^O?d-%u~=7W229J)Fn(vfu**39N3|s(Ww@i1+bYFekT| z*pzkWe8$<)5Rz91MdTOQ+$8n6hYf0uN*+E$N zM%~~AMG$ovIB*Ee$p$92T7JXNE?^fk{YWqxA}W@PQB-%m3`QRbb@_2S(Pm@$D&MvJ zTwt*?@~i;YHz?f`HzRCQt>ET4@S)KfZn~U~+G|km*30`OQULCp-iR-rustOn2T(eE z15GbE0IHmcfv1K$5K?|o*iZ7rZ{n4fZ_`pJ9Riu2qhJ*Z(1Xd?K^wI-;t!$^;X+7F z+K!Q51cRS&P$CIMUc_6 z5C;)AWJXRFqXEh$Mup%<)>Ss~rJHGurVPu#HaA&i;6*y?-8zP=DF92i@q*Qttd4q~kmfEM-7Qp&GPeHr-|`aHn?{`u+uDop$;3Ao3Uo7Gc8l;rn^ z9?(8PLU`l%3N0;Qo1Y=F0Ea>HyXaMaH{=&#^%8gmf7FBie`#vJ9(vrwDIY&qaBME4 z(;VR=ZZ!A@A|diDXYGMRE&JGs^vE{4))t`wccO)VEZbU!MaFvcqq*yIs}jRs=N`BC zkVAcmbr1KLTQN|J0pAf9=c%w>CV|L9uyEpnwM_fz(*4S)`?HzV0W^Z;kLnGSz0{ED zFIr6#wXT|~-4B7>E`E4|d%nyDl@JB~I+4y&sw}J= zPDB73a(+CQu>T8<0OAp1Vdi~?D4ZzzAv+lftvo|5(C+Zo&Ccm5J3k2l`Ix)toh;Ivg{`B zA7rt%-Z!KXG4|nOoX?%&N-h-k;+#LQeQ0Bv2HByv>rp6N~u*X604^ zNLc75mV$^DtpPXRLqzdK|7` zI9|NYXIuD>QBj$SBr<;}(X#I=m| z85Md|H-4@&bHZb|(%q(5wFIw~|82%Wcib_-tz-zJd}A=~wQJckk?#em`RR}HFltB= zEgx{a>jfpk+g}R;bl_jR=3U>h(Vz-!XmLhZTdv;=xW4k1RHqMmHJI=hV|p5&+DMh3 zpuk7Fwn;EOsDWIUfYs@>Z-+k3d`~Pd;tF zB2u(3XhAWPFQo;?^$ETrs92?p$-v78lt@Yp;ubYg`%^3PbE5*av4eoO_ENG+ zZo$Z95rOldP}&&e?reEzSpe&F;w^A0I`PH%j~&my=7|pV?MCuEKgt8Ps#lES7-^ES zU){hZX679cqH@EJ^caIlNfqCV>adtzAHep=C2*4`+{aq;D6>&QwIH`IHj+#ajpTd36`x_jnqJtxW3>NN>G&PDZ(#G4QEG5+nyfCgO zig5CMML=1e9G%EXA^^d|>mLH%o)ahsg`8wL5A1jHU7hFIKuOWYiK>_Of9ls?{EpF( z?xViurRDqDoVKXL;)%ian=3z+b3tdQUQ%ZaOLPNTfLkXj&r%D7 zTrr}Er28H3IcSu=t`*vE7~23_7H@+vLR+^7?21GscWMWcOLrYJzofhtmHBqFVYyd& zFS%LJbd*j@ro(+~c-X$f1HQX%%5FNeMU=sz5lrC3Fv6Mv*HmC^cL(a^C@awo^;VFe zG$DXoVa=jcTVh;WwQtqjIsUT-Ipc<$(KWM|hzV4}(lsAiFE9J2t zG8*KlEOJw;>75L=?^OM~mN`=ie_bwyl)_PLzRPUK*?l0(8iSoNOaIXorOV z2t`3%jqn0>D-asD_>udUR~`fFuDiImgW;m(z61BU3HdwJ~<%B;Fq ze%LkJ<(dxd98=6yiil5)&2TYIcXZ56e7ln~uXWQ|GMR{YT>z=qt7CQ^b(mxIRCL_I zFPcoIgwWNVc7BW(hR!Was1!^2Dit-sLW*`G`uu(h`l{R(R`VzQ?Z|t8qMpiH2#_*e zE*`jk?}S>i%QNx}jO^Y+CCRtPfv$Gc^>{B*fj|N|>eG=B5%_iyCg=v*cn=!og#k+o0XE7I-!(|u1N|*vB5aH2d z7Q;CwE^)l!qa&t_AeST?lQR$WNx9GOu|b+`om`MpXR;dyueYw-t-0Kjbq z?yr%o`&uj(bIut_X`b}vh-uU1dU^hPmjEhkBmu~$PY@$z9Er0lZ={Jv!F7H|!ryh6 zV;zv4EKorS$R8p}pz^)ons~$ukwbzHi2(ogqhwFMTD(gzXq^HgN3Cc5j16WXQ38u4 zg1ajpegkx)QLIbK!^_HZEM*HUgKYE8H`khnx0~ml`FqlVh5#d1fJcHK905OQ%b<@L z@_8pPpMI($2C50ImV_vYJxaXQi#b0|RN(ESxb5kqkw%clDZ?u8RU$@+Lj$l^>K6Hv zS=oRiE>}QLPQ_RMpvjT-49W1E{W$wc-=rT#ACemr=UJLojh01TZOy=;+7!8^hC$VjJ2)t9!Um)m)ZTl0=5KUA|^UesFD zneZQ5*(fm{&8Lgu>)2Iiu`6Be$2NJE{Mp4*>G z;Tu3{IUq{@_Qsepy?{bhIgOBP(^0zzJ{7MwKkEkm^hc%nAaDL=y;$&*Jk=>~OjWf} zNWqv*BcG6!TkNIut>I$Q_5iBj>!`C&0zq1;omsZ)`UFVZv)`4QMNxww3&LrK1^%lF z=}f#iuSraSqXhUte!dNo&$MK;FfxMeHdka0b(Sm(o=2<;07ay) zn+PXC`e;^$&saY|%QZMLyi>hy2e}OmN$G>ebr}k8P<`M*VvCnUhG%%!IWXFWM2(~Y z!0(>}6FJ%qTe+TVv_`ro>+_8Dg<|ALIrHW3wdHC?*n|}h&mSif>leN6$;^~)#CW!s zn8cR-=hwfTS$gwnb0MNYiML(v+YswmRD|d!ZU{}#9K zB6E@bDu6~?@KZ2;iUb*zQuH{uG<7&{!qCm1h8gou-`+oX1&@Mi6~mK{U)Pu)#Yk&q zlx-aCMGobL)zih`rkb_%MtBQHnl(y+6RrT~zx}+;W_7;IjK>D>wL1I`My$Mm)BnO^ zpU>y(=7^(I_pxt2^-D?fGq~C&XTX3APvVM+kL0eklS+6*wiM$b&O(uN8*}uZFM<7g z8G2k^CV#h#_xXRew-51`9Hvx{jpd|ouW?mYWYf`>KLrbF~x5U|`f?;4p1J zXW#1b;-vqVNR@i-fk*6GGdanvrLD>Z8I#4I8-&2!Y$c$m_Ou>yHa_qos~N7z><+~( zn`rsTfD?FaP;91tx5L_Mc}~!^`fi>^3>$ry zZk|{+2I+e);BS$UO&DudBhp#ofiy|(ag?}#qTW9! zdXLK_do}j;JBhPwY%j5uqOA+e7L*{CeFIkVQOYR&B(ES1mkW>^zz(@;MPb4#e(+AI zfsmpdH~K7ORx3wkG5=7F&mXV9z1OTSb2mT)o?6=Mwg>O}?7c!71tMqfL-%GBbn$Ci zvTZc=(sadavTt~(ODbiO$6KXI^Sh;Qj*9aLxo6!5#zO|`wrN2xVxK*D+^K!Jgo#@b zb<`D=dKbSK`&`^$*RD@EUf(WEbTB&$M>iXs7rVH=xu^Vk+dbGSRy8kgdjPVqy7vy) zBmccb4h{ni675Rtc_H_O*>iJ^3Wg3WQK!&awxwnsr%jOkAhZs<$1Iz4~1l~+irfl47Tyzx9Os1rpG5?98VCX zUyXITz6~?*a^!l%Xr%Yu@xdqNcemF>n%(@|iOaASbMqlMKYO^B@zQe*m$afl2t09n z3j{e)tX^;9?*H5xZQk~=n46b-|GDuj3&L?3GWXPK5|5k5g(KzN&!*h86E*VMtsaKk8r36taxFTzKP6M)m1um zL|x*DOMR46SE+t0G1&yU!GaIABPNXsSv*ym%5u7baa0em>m~J zAH$g$K0HdO&%>Iylh3t6v zi_No19QPOBO0KZ3vF=?9&HYZUy)%C^_@$NUW6T4-%Mv2?MGjC0cQ$0e$9`HVAAb?8 z*pE1*28s|FoAhdw*1=$Tw-uXVSz_PqQn14li-mDeNh7~H>o8GFjm zbuYPl9Bdkc9@L%B7Apvi3b9WWU6*NQZ9iOBOS+aXQ^>PLZh$KCEA~aIj0A2T)mi1v z6xHTyY<>ibsZHK4b|1LP0lc0@<)m3cuCyKe0y5s;cTQe3LU&6D>uDUHAb1{v=*MZO zvB!sRzEIxZJcwcwg|xhAfMEDKjEIYC5bZvQC%4VpBfn1WUz^Xe>EaoR>M@OvDC4KU z^$p09?9c9TCG1jW>>6geNB}zN|InDDn*vOS&Cvm2#=pHdfK4de6pnRj`Yqh>qOrdH z=iy_nz0EDMK#=`lR{rOsl>ry&jdna8nfgD+1$Yks>HVFtj>1TU=El;cQjh&z`gklY zh*bd7(te*c`S(W=*tfeQ&S!y+2X2H0At4zMz>yAsw;Ts#0UeMYqGWDgOcQMw3C*ep z2@=`9?TGuYP~jN*e9l#a!_D9>-h$a4C;mV8p*Kk(8=M%ux-4>V#lacK^ zpBU0Dn;Ko@hj)B7tA_?L+*q;j>OCE&i3HL3m^Y10y1ux9Tx z{l-vgJZS#oN|Z*Fh}CEUaLBf=FEdPVOxeF>uWcJdE0Ozt3xEAd>ug^Kx3F3On~{Y= z{qPe)a zheSd<``9J=$7oF73$P?suU|wY_K7=9JLf6KyO@+dSBI#o+hL-h$V6fVW2;=@>)h9g# zNGG5M%MjCvn*e|lzK>26xyFn+rX27}tcglM_Sstx`CCl9c`b7n0?-}mQMgahbhHz( zO|LGUuIc=**6c^I6EBG=FHwvLU?HE&qo$jiK_ZuJWf61Z=zG%$ zVx?unK;4tD;mqMB4`{z_+d3fM1NB=MV)j&F7RBMNO7Ub{yZ0NXj{?9h-rFuE6RrND z4VM6N`-*a^80g=Xf%W(qfH#xj=zydiFo(|M9tHC-;26kKX8+&*zp<`r;RflQgU^Qt zu+A0666JN(HJ^)-lHw0ONqn07TIW*{dXnP;Sl(b4jD+s55Wpbj2P8rBeWg?^sHf6r z1K!s=e9ZQ>@*uoKdZ%cInc@rqxMZiZg0K3V1eQXupG&p80Ax`o!4<%B^am!ToGh!a z*w|s!lPbGxX}nTuJ*X8Bmd8yT9R%k~Ymj>8F$|!Gq~876+CFe?Bns%h=N@2cuelB? zhj*yyAhsebwVO&Xkx)}g@FkP~YVUQ5wv{xFB(amF_wU}FNTC=qX#w6MJ+OudOem}o zM*01&VRng^i7pD(d(zI1St(J}^t|GucMUeo6o{A=7`49L;DlnyDVsj(M|&R}Z|g6J zc%kg>ca1+osuGR_zes9`5V@J|IwI0Qb)kekAHKM@BROiS9WR7-j)#lPf*r0L2Ta45 zqQ;!buT`h}HEN4WlMyRXLNturD^FY&^;x>f;M5%mT;n-UHO*GXi{WcY2c`rK`7iQK z{}|r8d*aKENSb!1@P2Hh;E$E6d0T4C{@pbV>0Ns{j{~`d!5h%n3K?MXnR0VxwHXsu z^YY>fT5uxyY%haM8Rxgi_8S3e7R1{Cbo{`q?E#GcU7xe>lmm^V`0rRh6TYG*O3}0m zJ!JF15TlEyg(zIV1+Iz}Ns7wl<3Bv@=-7kDa-cjO@8PNZouwMMbJ>o?*S^ihWUN%- zkv2;K@fM?u4UUzgI1osaf%A?O{}COifL5S`L8dNn%0?Kb%*0fsO0hY9M(_AG15@a+ zlx6jF9#5}n#!!l9_bn_+c(&S$_K@E4Hw}!F-2Lxt_3Nk>58^~x*IlCV8Pgn}ZHeU_ zByrj7gXY9e#MM2~qW+=Obxl&6e!3!y{aoXd$H2UO3eMVotteW)-BfMp%g{TCi-CSu z^_$rA4R5ks=`fIq`5>25?7Ko-zAFHc7_NQik9nA zC>{O#`HaPDETIgc2b>KxqbRSt3Ny~zn%0eVM-^n2Oa36FxZ+noAosdg2}KT%KNo9A z9Upx+t1WkKO~W$f0??sR2X#W@E!?OGkD6-(AK7bycL(x#QnW!N1FV2KkELl=dn#7v zMg@fR|M@rio91R8;XEs8eCT=jQ+DVcqsh++d41pBivXMwsBSEaAE#(!g>L-YU-t{I zc)!DFMD^t?Ghw zyVTfOYI}@pciKR$^s2y`sOOUCxFI~k!FO+Vco(T}B2i_39i+cx#J2qQGS6>+BqHW`nG7xhG2dx`rNd$uKW8p&yE zkDS!|a<=X?b$+za=9w(GRXQa-rEfjsH0oTF8f3ckgC0N7$A?o_oR*TdinO26Fi^Jw zR}?zDCNo;Ec-Ccg93}$TDS+`3zR|vBMphS$V&i=V2H=qE7Jhh+efukAuT4wIY90n9 zv+gCMT}sd8i5OH`RNPe)ii9Hi7mUgcQ>;#eQpi^F06KatnNP4%%!CXtxO{q0S?t6m zp>rr$?u01(nV`j*Qcfc3o^BEXR0hQX@rGEU0~z*z9aKP*{+HDBo#2NSt(qUEdQ0X| z_nn;bpNi_7i+5vC{0KBaK!@B|Q9`v?N$zIyc9?OTuhp!*Hc{yj2g4|%RW-z)wJZ@( z=RY>#NF<$orR2|(1mW==O$OcfB|sc1s+F4iCcROw8r~@Qs9F$yPJemQb9ZviV68~2 zP*MZ<$5AYyqy^NN1*FZFTpj+lMhW{aRym{izc(c*@Ph zLZhI$2n#IK0@A2Ho_5W|`{PbfFg)aK)2WnUmWv(|M@-G;qM(;@Y_@>3{-?Fme+F2Q zQ0`Z55kA|j+28wZFjthrdy6NoAoLcmls!HtaLcYqZ^8RX4fXb@c%1nJq5UEx{cXeu4~bh&xKP;0S2i%{O2|OnzNi>cFs7tPG3OfY zCqmhvZ90bOI-&ZD>ZwuV)M_z8RT4nu1@JMWD3W#n~t*_=)eu^oU_?`WS5_@i3*^mj^+7#C5wUD6wPN6~@}R;a+6m-B;h)v!@#K1!;Xaf0SSNvWc@X13PxUIPfy(^12fIsg)+eEQ8eY z?G^hzK=4NDSRn~mXdU(<=!G^h+-E`gb&b8%&=z;JcS)jhnxu*bzsht*Cu{tD)+ zDIOTz0Pd$S5Gwtk=Gwc~fmfD%@OWdj#}YYMQ)Xq#s7?{$yX0uGDGJ$dQEAz@`a z&F^{Gxr3%q+!@Hh*L41k6}H4mMtU54zB*+xE^J7Yrv}JYTt-nm+`(Tdw>i0$l_EM9 z2`L2^gYq(*5|2qw>`goHApsC+W!-(z8SY}7N4)zA zcN;`ijV}nmM0>?{wB!qk_^blurcP%E+T6RbAU`*HK(vv`(knPYMy5%!(Pfg?K6gQkG3 zb+=Evq^A%)7a259a(~OdJ2_Bqs#&C^zn6`cS5Ye64lOu>C*D;9?8<-t?cionc*~rq zav~NUw#z1qT(ku(phYMVB9RE3{!vi`^;{T)t6;j zfR}>O)}M_KfmdBrWafCGGip-qY-(n0E!=d{@TQHvKDY){{GQR+I&w?vbuZTcYD7qj%o!<=IuX~}Gfn5TUtbQ~Ij zV`A@yp6X1eS*ncA=1dI?L2rh|tDw)f2PM>-Fi9H3fGfX*6#w!{v?~@i+@?Y|2=__Q zES---kyt)PEEirLM<=$}wfH<8(0kN;#k|OCkGdC%elYs^xjn7J#kp}rOc>&wy*CHPRUu3BkyRZ}>^_~&(G^)DrXx@1A2t`6d; z!U$@aO%!X*l5N4i=;6Y=z;R5oG6vcl1@$NtR&m&X!@@5bE`@Q{`TjIGKhNQy0x04g z)D*zrt^UDq(}A7He<bYSuU%Jr+!_)1rL48B7-QQ3RS+fEAV9) zBYYC|F6`{ubCTg%J!LE!G+^1Q;x95=!2!{wYci03i1E|s8_h0VvPk?mp91XsM!{{k z&9pJ>z$z(5s3>j-;{R1S`sgFb@qoWz;cjhW{|{?#9uEcE#Sd#=kV;t+qU?k0*^5fD z6)ncTOAHZNhc;vv8CyuU>=}%mvJJ*kw!v7kC5Dk@Y-4$^8Fk;?_wziz_w#<!1kMVnXEKd`4i&=Y{HYc~dQm(v{79}BxaHPL#+wV6UGrDG$N=*S~fR&VGu7JM_il+dCU zw0W(Sej*bSb=AelHLXJYwAy>T>}Y$8dn4fT0^_7XlliI>;|FoDY@fR%nlFrmcy|y7 zk1Z1r7Tll?sa8u+nAWO?A05J$)+by_!K8m^G4PmlG4<%rSac~SzSyw0miQ~(;6wB- zUBaTNi)Q;Mc2f;1qfOG@&rfDwhwllCx}_N=yPaDh6- z0glsYgw95vmOESYxb9aQJhw+u0;KFTOX)+lZ{3b2;GBss&di+!Ja)fgWoN(>1f(^> zt1p3`_)~Z%gG;{aYU{DW6m3Ko>%pE(n;8C+c-i>0^k|Vt|CE&T1V3?q}FGEW})@iH>sZ*M)WTOV(7mRctd&7bPzc^UZKnK_6#G-_s*Rp%aR)>X#p^ z=z!wSoiVZb4zIVhc*2%*y^K{5F6^r4MP)^+zbNN^ZTJlr&8(ffd@{Tqk~jD5C|+Xg zF%4h*svfC&s2&uns?*u(!Kt;qpC+_UjQX+IKe}(|5>>G>V9WAX9m3z^T(xn`v6W93 zsJ@990t1AGjfUqq;i#44Sd@AetKKspQ9fZHy{K5O?@?az-}iL5*#9w2D*L})8! z{hvJb6XyX%@(q7eL_g=ialU9BZnZ78#Z-EoCvr2ycVeepUd}jWd%O0}yi1kg298Qa zt4uM8cc_EI3T=VKx#*$>uJ1b=lb7-qY#i021D4im9E}pbce%(#si2+N$g17d?flRN zyoiET1K@%-Piqi)t-16=4&+N?-N(hBa_AD_k99;yB3Fz#6S=gBg6TU~?z|%jxFlKh zVqNt#5TzqJw^kzWuprjiRhG@a|0e0Xu+QvivJEK4wh1aVAYTCXwO3Y%q7)fXZ3R#? zeglmEmh;Ozx#Wy5y_k^uq3Nv;sc1t8?}}X1frH<>RXc<29Qp^oKR;;GBkP#z(mG^p zvpN_gV>bmh1Y%x|IVtq=8VxBJwp%Zn-=Pe7qY7z?D_90a!bn95>c@b9d7QXRAHSqr_2qZfuc-6sC-xc_BPTd zrR#gr6)|Dla9AuL4<{2Z0`hQEWNR2GMSoqTP|TD*7V_*!r-Z!g!}PV#Kxg%wV`{zw z26UA?xmeJA{Q6kU_vbXUuz8y(=y_4{PFAFFl zbaC&58CedbeGTKYZfPtuDTa2MA+N$ipxesmSxl;t^wAA%B_A>C2dH9pF}lCRHc} z6Q{THeZv|8ml}4HO7koyPi#Ilwn(#?cGB~fKh4-sfFkBOe@1T_ClJ!wXat0SxhSvM z6=)7jGJ+oYAc^>qzH=-6`JPgUUt-yRKi|Gb|FjgSn2v%6=pB0`c=~p;C4ZfLy4@$* z9CwI%_+|LyT4GV&_m?9)VbM{HCS9Y|v4=K9fI5)5ORq^OB>|jmzhC1!34*uztp<3V$vn}(3)>#b8GQn{ z4u8GM|Dm3yh(bdX-s-WZO(T6!Ml83eV9p z3<5}Xs=w+1cz3r_2~c*ZVrU8RRCo=tr;|U@(#+)WXS>M9go$ds=ziYe8#aK!aNpH< ziODCNk(S!`GZC|d z;8|Z3{Oag(D-mlru7_ZN(f0Dp7K1+abtsGcT=s!)p(+aZa!&12SOZhBU4e=zeQbBqP} zW4ebJbZo-u$`1XPvP$IBcpPY*;BpfENZg-1$gDwto%(D3pn3@HZCGe`fjNov@JWD_ z(yXp!?-~*fYJ3e`6;Vf2;}%`I#f-hSRSjbx2_ngx-V9rT;TdleL=!@^zpF9v!9)@c zy8q@0q#XPI?5NS=%J@AYkk`%iK{LCWNor$J53uJQ_|3UTIjd%r^i$;U@0AAGM%`){ z;1Te#i+S_v^~qMZ+and74DqR-k-w=5UY=!Ri<@4$Xko|zBTfxVP5?Wg-UJD>ZOf|B zYH7{h0%4^c8;RY}ix1I$V$jgR*Kx_(as0#QY`mW3a*Jy2HBS>fn0=X2HR)p>2$1C{ z{ZV(jrK8g-ta!*BKcl9*p3JI_>+RlFG8X>_sza92$skK@P>toZnw*-B)jo-0;-PT5bxq3HrdyBOFP%VzOQH(?dR zK?ueinX8Ti@9RlIXWnnIy^cDz-sDIdL@rPSNMETyI>|{7sUbIXu!%sP0`WgU>Bhm zG``r#7@{qpr!q2ru6r@R{@-e16DI2r^+g2`O%cNsZ8Rf9OLHn&6l$lFBC3`y(##T# zb*uXhvTQjep@HQ>Rh@=YShcza>}eR!s}Qh4|&HUX^#MkfD*AOY)Q=skp)T6N65RAY=HBdT|d zbdP1TK|ZYkO%QA7Ze!!|R{8`BzaXeL*2-&canM3GBo?yAEN87Bf;`)i7+_UyG4bO^ z(=HW}N8t=9U5*D34FUS4$^0f^{PLwRtuB!yAxv*M#B*AXGeHGAHEC|-IDDz5DNETR zY60(IL&1WZkNU7O`X*_6^M_)2g2JT(N|0PR(N-{4^S@46Ob>#i5htp-VA znc?YvqwaU#>&?eoHg!;T#V+z%@SB06a46?9 zM^OxL;ycGdzS^C3*sEa{f{k1J?_{dGM`ev!U=3i=fl0YC4uB2>nbRdvp7RY%LZ;^a zTLxhgk%@g3kUkk_=;QCjqTCFkuTMo;a)hE^jUi=fj6tDQkb+SCwsGni-=Am8MG895 zN!+J-D*D87ok zs3gj*EI50)4hPufWXF@OkL8 zr7b8(gMlyU;qR5_pKmXm`}1_5Ou2&^1Dne=SHY?KKdYeYyW*tF;;YrG#t!vqP?vF8 zN)fPUcIIH8-W=z;sTC_Oz3{6JJ!N4VJ8ma%2QIByXJ5bI!zI*7T(b-j7E@F2lrVB^ zZ4t(U!ZJ&awpF>o_xbaU08>pwUbH+iZwW23jvx1sZpWL08&;EtY4UhWz+ApYA<%kG zR>Y{3yV48dAWB*G3HHr_>*7hnsNpD~wV0jkuBr(RftwB29M$vDHhPW_BP_-c@4>uS zNS3W(fEE_Ms_HAL23SF3O;5(KYv)PZHoP~DcvE=yWd7L@6Ye0D)+h?Z1a)Y9G*Xlp zw|DW5kqt+!a) z{oO8q3pxD3ToT$Fu;wGUxnt4l>m>?ulb-6;FS#xo)0V(m&TP$kZYK}{a*e)J;s zGP;o*ZuVRG_2WWB9YV4ELjh>L34r-uPWW9toeIMEk5BBX2!F+XOp<%~&leha_b4t@ zCdg$Pz`nOTf?XZ(clT5X>K6xIeJ0aTU_9#Je`(6UtHzoB{j~npRsSHFq+vLBorW9} zF>5OS7dlI+p9EqPP0IeMcK)NwKjGZ}>tFbe-XI=jV*8)a?cbLF{~2`sJ>vhffwBuC z{4%7J|3Jnc5B*Pri;C*AQ)DZ~@@cd7uHO-0 z6uZs;fBst7kTiuPKcFJ@dp&cKcS6OYc9qfNp(sM9nr5k(Om4epbAT9suCEvmH?CqL zLTxAtt6>fv$;?1zmxF-wn(Q8;qH5Z+I;OA{vp}To1w@I!BSK+ovGk5hh|DrSc}Af6 zh3JcBPMc_>hcUto4U)pUsz8^89-%crZ7}V=QO2Ucg?u4dki$epb?(q$P_B0{q2vzy z)$q>fK9JP$_Y#Q9@T5schzf4RLqthegHKEkiZ8lyUhi<0R4YGbqjd>y$$XZTHFo;> z={gWB`Sk1~Va+y++c}?o8X+tjB1_Mjk)s~tEF(Y2#Uje)*AwR*S8H~*hPJn>J-@tQ zn;^L4dzQ(LthWbkEmHfMg31vzZ8i?NhkNSrJ(D&J*|MFIk@m7>) zPqxvdW`fLQA}Cr>!C3k2071%ose!=Aw!^vF6{g@Ew&p7^xZSax<@re~(TQ%oz`tT= zIcYnRl+3=tv06DL-vQrVN)pCj^4YGeAol8GEMH2h0z=sRiRR77^PpC!S)Fpq;=#t7 zmju!xJ3p#+c=OdHHDC=(9!Hcw;(e@wdakIFp|@XqcvUf-ptc{rKjt!kNiRYr)g9n? z{hJAPss`|#pyfp&ayQ4dO z?4~~YD#+HO>>5ET(iiI+XXmMC#Rdj)BSS0ciNC-9r2j@thS6O03eMOjj-RjkJI)wi zy{eM*t(sI(gOdl5NKcG6#~AT(CkD=fTcLG->Vg;iLs;{BjZ+$O0^F&y`-vN7G60Eu za^C`ZxcWtBugHntXO6UDzS!YpsDdg3xK#{nV;GY zyVH{xkg45UI2iio7xK1yjU8PTx!u~B&e+-R&hxT$`&-9+Z({ZkX?Rs(HDqKZTKBT%OO0}4(Ecnd2-KuF_qkR#3WS8H4xpwZ+c_-Bj=wU$wcYE z9!CuS;Pn-=j=0`_lpJ19z72$~FqLE&se@@wiMfF&qz@X>w5}Ru@Nv=&?{rjZ8 zaCNVt2SE6xyvL2F5ridMTE0XYQ1glfA%d*2W!!}zr}&*mRi4di#&d})MH#SeEtz=&p`B)c=6}gLTmJRQBp!u@fJrTh z9e;MWESqqehK8^W*40*Pg+ebb8y)d%8<40kO`Z$|1lwJZboRpC-2L7=!anPmA)Um< zQ>!)G*d3>xMNcEsxbw=6I8TGA;YCDADPzrA1F;ut`~mVaP1xn^zyybily-tL_;+YrG}MWzAb77b#G;zkOAxx>xRvuRtaLbwXgqVd?`MxM_S zNpgnz5h(`Zv&iE!MwUTQHG>x46)Q%>?>_9ZblXQx1|TLr&Ip}n%=BjNN&`8O|6?(G zT;W*PG9JbCWX{_8zi{@>3PSE2VN+GlX9R(SJy#p*uI*z~3^a?3sj^WLNq zpNip)jcjn+X&G*xuVLa-?NX*;QmjieQs8P-BgS6S`ptkijsHT22pcc*)L<0&2hu0jiL%nP>VbFTA;wgSnkxvH>f z$+B7=9>Z&v?v}!3`SFz%Fl&O}c)-o#UZz?X-XZ5FM7fS-T?MQxRkw$=?+twaugXpY zbhTn+Ymjc|CtU?eaXBEJPgI<4-8Y(C;35mm0~60Z@IaLr@*Yq^#qk_5=ZsU;=N{c(10=ZMk=yVvbWWd=ll^TbOv) z0lt-{LGM5=W(8n1M`G|v*t=5?H_LAYHJdR>Sg+FO&)ukcM*SWiq7i}e$gb>yUeqq0 zJp^k1QL-cciQs`0njD99goER1^=j2n1EcY*{c1wKXvpj2wLtTHmkuCU1|vbJpa&i= zj1jld5%qy(sT*Sg)T2MqoUn+2{yR%yW%(Pu*w};3@4cFR9Udtz1@W|WjDqWESVbg8$8Z-S znQJY8B-IuA@g${6i8B=vB7Lzp}PxXbYjCc5j=$^DbWp3wdh(&oVA5yy&CiSbq9XSvYfvJ2DWeMq zWeZ825a?*uy;z}By@jh8GJKSu5pAqz8_Nsx8X8I(Wm`0-6Rx?nn&(=TEh{6#U&7&cOey{x zIsOVc^Z7Y@E409UI_vQ;Y~!<`fuzyAn!c=`f)F5gan^r%Cqc##F&?9m(QItYeSJ(J zJ(`qbJ7AXRroV{IxAlT(1}!~-b)m<-?n%E+Et&l4+;G2{X#h1t;--S^dN+_4+?SL? z(Vss*^CV`2hm)*Rf(w{PAgq?=lcGl!YzgzjM47Hz3trQPMpN6W2l9ZKDzKm&m`8x zpbMdbmb(YaW=3Ie27PsRuD(+qHZ3Rf{k1b*cLsoA`T2rj*Uc8O=kr9Wh%Bf zui8fD`?zEE9ch82P+M&mVD#JejCQ#g04Oz1;g7J;G2OQa;BVBR(ha5vWXpiX>lhWq zjoYq^6RNAo=&BsKaHLlaX{ZB^cJ=bFz_=>3Zs8q#B1nz%ZpeypS0f`KpSlwHuS1g+ z-dSFPH$s=p*_N1G7aABV{N*M%CjFm&;ikyv9FLFR4oSuVrfN>sB}W0PsJ|J*4cp)6 z3PDk0AS!eU8))umFk$Y^;w^nQse`8z5V;^_+Vb(608~Ve$uTJSR6=~NWy*;F%3q0y zUWQfoax(=XA2=LTX*JK$1*l@X@FL!^H9w~@>n~bj0Y0>56C~f&k zJ}o|<8k6i zzrufA-$LG)(#l;82=FohMFu)jqQ~XfSh4jYH2}cSU0_O3!DR6iLqK5m1s`)~<|@J@ zCS%OVP=r-0*EUC2Uk@TsV^lJO1k-hfP&mO`&C~QJt=d3LHKeB8B?v;s3YU~={aWqQX&WrkX$wAAx6TA(JE|BRVk z=F48HUl-JNA9FS?f#^@m2sUQfB3v}?t8X_tCfTO}5tlmcEU3EVf}Zqh705&9+gb%o zyFeMdT3hHdNSg`(8g>WR_$poj#C15_uP8+!V=_yXT=FcO%30 zLfCN-8f&N!N|J+{m9vH1ZEUgad3`go#<4ssV8S6dx*gx;!s=*{LSc|DSgdzy z94iIk8`+frD>Md<{G1Tro8Mz10^Fy-W%L`6YP_iXG1c7BsOoICRx5hkMK~c*Dcb>J zv}$AI$X4}M4~y))dT$#gPAx!*tqr=vCQ#*|r!My)G;K-G@%DYl@O5>FK$uCxM!LIK zYef4L4$?V&MoorcDg;}cBlo=LSVDRl#%7&($KVuN8}CsTA_8b(KPuc1OY&wFh#1GBVIc|`@E|0@oL`vmFmgEm85h3*YmiD+wEk+GTyvY!(qgZ?@h zNZym()W*(*r{3$h$%Q z0X3Y+>L;LUyMqV$uKXRzIGud@>AtU@^E`SUbg-fjN4h#2Ro~>l#%5LY6Ob_NJTJo! z*)Z7jIH>JO-WT%EM}CkDtM(;EgTVnZD_&i3HTY0Mx_Ydi`=|{cJw*S`b^p-ld|?fB z1fu)}vvB5(4;Klp*KrTk6Ex;jW2I@31d{L^mnHgx!(~H&p-A${`q;|>R zbV{zV2zc~ojb!lPLl#3pKJ&jDFhRPFTObofx%Otsa9gR_#_j>#uDnvc(D~1{~dsmdN0)On-dnmV{i`0NZGdr_L>9FH}HuaX9ItRoEfb?{bcS1$=^e)Hl zaU(Mj3;^_<(rva9`8@o6qA9<;=L^yZ|F{H{U*;VB;wP`n)oBWReH+Tw=h^^T`$NK>)wN7@%%~ z0o;K4nm;Y&vV+P^AmB$sDQO-Q)E%=%MIEAIP%*ZSfdnZl9z@Z?tIa{U*~I5P7f<2d zYluUu=Wx}uCPFz&Hn*48Lz_jf5ehwi^4RoR@1-~=u(ua({1-{UK+ z^bTH7*H2LhmUDQ4Qt236W18PG9oA9#{I{FNw8aemr%x@P=$W_h+*rO6PA$f{oD53t}^;=v&00S>}xM zVSgQkR1L(n)*x~TIMeHqleMyg;20nIy$Z^T*C{<6wyG0qg`m>~gt^riH@wi`HBV+6 z(2WGCH+h){ao#fcWmCRs5@CBa-zxBB0m^CH)Cdh{*|g=8@OU@hm9Ar>K*7vxvuEIW8_pEL9P|4?*KfIVa6Pk(Zdx-3IKS{cM z=5!>ir}1+CJ=n<~E8Q-{oEo@st*$D@n&HfG#Mcv8Mi$mgw>QHZu}8jI557|Km{}`^ zCoU-5EF0?^wiyU@Vllf8b>YGZ{E)0qGCfO&Ct~BO+kqsoKFb{>M{PZqQs1!^G}N$A z_^31g)nadvVx6+mzS@E44~c$XUkCD_99E=WqTmZe;*Sodmn7cFz>W!pt|xDBAFR(x z&D=!Y{{s7&bc>ljRJ?6;V(7>Rc9U%%!-!w zl*JQLE+jTv!e{!KiRZI+UOi}z_wtj9m2;5yQ$1cJ@}Wk6&7nqj{)a>A>NQkawCBpT zqjB6p107DFSmsaWOi3=Beh>X@e36gS=D@E-UCkB$n=Z{bFe(;8-(A`jw*`c=J&?|Rnt@rk_>&9(&dw${1ePVmOE&M|q_*m4s!WfDviEDt%Hj89js z3}%L*eha`i!`ztt5>zWMdS5*Zx22WC6MLPeuM|n!UT7cDTP?~9EDezmU9)GsOmYcO z-MY={@zb6aeGb+>-VJq#{PL8S7w=$`p@1@6SbO|oniwn5IT5ogjdorKSsj>(z9+dn z1GaM&n)nBQu2=0;QASFbnL=dlhO>N@kHz;M8yGD6Fzu`7i_#;#4!2yMG|=Pbdqy6l z66Y9a7Eg~VG$yHHJ>FOKR^y98CG{wB5soJxH$6met%V4iRo61gzmi8tm~O(Os`%}~ zMPb?_#B-rLQp!^fxw72FVG@NXF-`q$i)Pfw8R>)7iEc^GIkoW+1qZv@-%pI?%}xuE zgYQ5~&&ohcFMg0)5}^{-pq6k8wLbS_GuH*J`(o?)yHLbd%$v-a*cd_ZL}tRLb4pa} zEWY9-F;9xGu?NjCsfSKNlAz~v=cRis0NqS(l_9!3C1hK#3(E|iSvv#}=F5}PhR4?E zcWl0@+uG`117C+p;`)l|_}LtM5Zl+!YYg;!O;WvB(%ji=luav>n-T&DetCaMEpKJgDR`fCihR&1)f{dEF^0?Yp6;e9 zH8^$%<652&I*s(WJbbU6>8Z+#zAVGcO_+<+5&X%l#p!3|17T+8y#1S>+>za@%wew; zI5Cu!xYvx{S+N8ZGrRx9oQ0rX-VkFPmoIw`A6a47%L4QC>Rf;zWqG zi`>j1iv-siH>QV6?>$NxM0Th&dK2EwmZ~ouDipJNXx)uK&K4!uL^kA;=GK;pXE3PT#)Xf69W4mX;%i66v`TU)=mu-neMCNMf`SYaTb&&H1DGXC0j9g6vdsGd4I6 zQkGEg@W8D%0f0+5?VqPkAo4&jyU6Pz$2TYb62{ZwP!qTJQ2LL4tv{JJekn$U0b4O& zAjdoXXmXxD_^!tC=h+43pe5&yesNA{;$QDK2p7F>b)&vee5_yeqCEqNW~(?oUrZg* z&|m7UF0Nk$+-@#S1!2|$_1wB=es_KD3AED@} z1;E$N#0F0QM%%G1ranos#tZb$SfF=)VgIek>K^;8oPLD;(qTnyZU7|~6oiRA84u{4 zKqzoSGW$Lp4OtboJPA}`vcgXGO(^_Qvtx6`pceZ+8XOu0k*I@KylR4skh8$! z^^Xsq0dazmc0$;f`VTY+oA}hBVH(jDj!fucJFwY{+Wxk=&SW%m@>{>BxtLz?m}%3ZSgDYtdDTTvN$dCr7x$CC3_H|kOgT1wK;f!0Vj-$@Ki z&8ck5#^Y{#6HAGhp75%*b~?@(;5&cJ`Mrb)wEpdvk^J{&ix0nA_yydgYYl7}d~k+W zkf@hsZ2mBg)v?SBZrtXO zBBfi;K`*kOODCg#@Q^1%3y9cSaFAF^+hJTYL%xFnXANa0IY+;`X)wToQ`IB%tXBoh zud0UxTS{aiV+78De6!Dr-%(62*fG+tugXPxBd-$u?_=nen^0A`O z^toe;3dNmqrCX?WQ_L)mN1SCw#@P%MDmw~j z$#ELNKZ!{f=P%qt$q#0XlSo(eYb#Bw9F1br#?3!(bJd@thZRn29-_=nm#dH$FjM)R zLbFhs2LI8c16dIUXB~DYa9rsDFyTa<94k+d=L33A25XCHYFN0w`%jLSy~=>6jPd_( z1JP$4o@(s*H3&&4IYuk(mFJ<|P9JmuhC4u?RqA?fcUY1DXaOI1km%|ErvCzEsgEng z1BR8CU$n(Ls>~w^QiHO)BOdS~hwYJzUK0{_hYTwxXZouFhu5m+@8&>uZ?>lKJ}Q>> zotmo0s-Z)roflQAB8~RXKO}sp9oi@SDgK<)`&WtLvNB3v2`J0vqj){=+}U*rub+r} zc<8}f^$U*{zgg^6WzhXlyL!#*Bz2hAo@?iP-p`M*ST`S)`c zHvZw1JNIpc!(z`RCZk84?=SzmgUWBI*G6TO5E%q#SL{$o;s)25s%^v7HMbeUu>1;_ z{l0$;hx}>N9S${`Tf_2MO%v0p&k?2G1Hy=3y;J2s3qSD9#O<@{;udL@;FSB36n<@Q z6x8HBir8C0dP}E7kycM}U|{5r1@P`s>(oy=l_zE4j`j7|Km1E{?F0XF%#ZQykEfP= z4^BK`N4`-I68GcvGB`{*n(cHP)So_oOb(#EH*1^yu_WAb!%3g@%@1MJ={Cj@1;r=x zjV@jbf|SozvMC`rMXwa@oH_D|Xs%2ze5))md@}f_BM0TrZd@-RTW@AYjdqGFR=1Ol zJwn5|cGSwZA3V?1@fjSQcE%1VzDf7686nxD0@P0`<4$+b4OL}XR~u*UJj(9-l6oqA z@JSP=)~6q7Q}oT$%%mCR|ZGirF8}@8{^kOK@PO zC-(D8TD-MtWx-4=-Y6P#g_1E zwZUWb9NZSuUq82Gg-`NrE8>Kxp>|Cvhev~sd9^-4g2`DeJdb4XjXw+>X8L=*8>pH0 zN?HUYU)#ubJt~#RPPl8rv3}L#XzEF)w_Fyl+1qsZWGtHZG6oe1_BfE(jid4GEATi4 zzf%1%FtrDxLBNv>uPEJ(Ll!^}qy@CY7#37G?DlKeBM@DftDA0Ahk z(Ojn9*LBtV@cu?-4>tASchsVL?s2Gz zd_3N1Q6_mi6sMki*&T-pPve2x@sdOh43jusvajo$>v|HkwHIV3R4tav*yjtXgeCjX za1BN{(s0}_Q}(a>chiTVN9mU@HFqR=f5FKmbjqwt`*E6zCe>0MQ9vrWyn46qxpW(c zTE|*Z@X_;QqB>efEgH9`CM~yOZXZ$JyWs*G9KbX;UZ6HQioUgRraI|bH1)459=d$s z1o6TTM1cR6LH3_Zn!r$wx){bZFS9Z&V@2_dREPTg3Zot3RCpNAp(qzHIZc-7`R5 zEUHKQ!Nol}%6Dd~p8D|aSawlYm8anc-tl;;^OD?7UfA8uU2Pzg3dol`SUEQCj_W7<791G)3m=G%cpEZyhF2&XN0*G#JEFesV`Z2v8cl+~pCr_Em*_ z^x*Kn+c6QS^!&o$8~qY8;!P4vysgBb#PC%4o8c?+ev>=e{lEbw1V)W4mmeLjq`n=r zcUS(|`MS~#0O{%EegsMuPS0F99^T%)olkRr60Yc}3BFt9q2>lt$mM zVss+=$U4W@GTzW@p(CNm!aNx?I`&M$M7@@HBQ@!V@5?SN1QVeXNqf(n3_2)mHyb! z3+|B`pLrqd??uO0abO;=J`$Fyi^Lh;v2D86X;W7WDh{oFNH&+PEc@u%1yMK( zcGR@J-+NDL!C9lchmk`n=SiN}r2&P&+zwd{;@}yh#011*G)gc;g32zym5%@Br-A694G>f@ z5*{&WJPxa1;kqO>?EB%G={$#;0#tN<$I&UqK4*O6BSih!WR(O&EtLMHm%DoeZxd?k z!i;K5FwS4{>j>q z=|ZrYV)d57dY`Ja`@37L#&`2Q+iz5rd*=%>cTS~UuIrr)QNj0R5Ut!lJkHc;R~Tjb zA?lxmo_vxtK*HgZ-eG>=qJ5!CM(8^z2s0i^cLg%oj6xU#a=1x1a=!MdMB7PfsF+)*I@^~zoM+&>D0w5(dq!r5YmK=q8Ok7WA zI%@Z9zpNDTj$h?yx=7SQt8jI|dLQ;9noEvjoH6GdctyyG7X3m7za{G^aUh$t)s!X%8#vSTS^I{-Y@#AO>w1_mk!oRHW2#@x;{*zfUCgn z(A1@ah)@TE{Gf=1*wFkO;RI{>!Y32>@jhCYW>kNwPy{wQ-04o0ueo&cOxuPv0>ApQ z3vmQDzsJUZK)9%iz2<99tBbj@kwc@$-S}1o(?Mr=T}QuDVHh*Zv^mQD;VrG%x*}eL z#GC^z2OmiKUK8DoDlGRyqMxjahfH;Ph#gzpNDa*>gjES{Om#9{Y7LD&({an6Rjeo7 z%+p*NI+D7TOKF!#!uQ+IU1bME_I8@nYUtd5f=7*;+hh{j(j- zkM{9P#ZQ0lDqAp!%lWV*!|bp~lul}iw%oX0vglDT>*v({lK(wvbjS|BI59Q3nzor2 zqhYUJRS5GK+*)i@$5p1cc6vVr>^*#=B_Wg)eB4Gw9Y8m4ReqTschk zK=JJCIBT)JH(M8^v+Vv&<=djX0?CHxN;KhyWx`2i8h&4m3n!k|EiI{ zl+39|Ou{nXuioWQ^RwIOEJs-!PP^&ifBby0=Z~dQnB>ai+EmWquiyH167A&1Pz46E z3{eIAArh5*6xp-Nq2@E(z_PjRMI)71XX~!+St;#epJN+&+MTY|e#W-R({z&7rFa&L zh-~ECvfCIuFSY2jkInwa+)e*}3-NfS>sGks(#SqL#h&VD1hl^cpLE~q0=sp;eOsRe z{0ro*B2@M!PKedmp~?vLL`)Cs3CArZcPqg6w;i&`s4m z5PWF!rojU@2fAuyS70HeF&PXfk`{+w;IPGel?~R!%U>oDv0B&7%hq3-7~Qj}DUjFHH`Yt9 z7|EfLARskqLDoh(>gCo$wBC5I<66~+8R7;frm;Hv$$`Xj^v8wHgJ1h{NH>Pc zzO7z4++EOrJ zBQ0*M>k5@L&qgNrBjZNFJ!SWQF&TgcjxiKXJ2tfpNf%v9yCXw zlC;pHkuw~QEIcbRgFiK8s_Yh0bCQKF7lt<^ev;46vejhc*XUJZDO>N7qO!b0N^?jb z(r%v#ZwU4+((m}+HJLWp zw=(sx+?};WeZGG~Uwc?lz~O_hS%1jnORSFc`n8_vrORuqDd1MLa;H429M)zn+(LTe zSe`N>pg1jWmD9Z;XxR?~W-F>5bE@WVVYXQ^xj7F$O~a?+CnYVc5wqFPUo}L2OwJRGIdCOzyZ1^6tn~F6 zH1CSF*OISO%V)pYcwfk9Th0t^a$BaXCAupVYMHaK#hzY!)SOm-oU-(s7SFgRwiM|E zz6r)2IKpTqJoj|zwx`eiu#&+;rK7EwZ-WD`#K0)!fj)rZomH?nvXnl+o?y9kF-&yn zd+-E3o24)bD9a^LAGU^^nIDBMYshez) zm|OV3d@;%P=|U|=1ADAZ7q${YOXTE}OM+JErf7|&ON=`7&+(~<}Omn;~!<2a+rj zsY+CqNI0+7mjNWbu?e0KeW${a?6W+Vs3;w5Ac=@4-t+W$y;kWW*dJf%f@UW?cC zN(p!B4g??BK5$!W>l2Z3w*NG`e6x>0?P=uwUP3&*A{tU%_Cumy)I1qEMwb2nQX*St zs9N%20GbmG`L5-Sjw@09eE8oiH0EWdlSnd3ws&`ZC>E&xD0%Y7kp>6Jod65dpYpmJ zST>!k=KX1iUfoBaSx1(XY-XqkyRcQdC>qyk>k~IL8g;gbZ(7hg?!x=12Ia`J+{=Nn z{HK{$t<10``2_iGMy zebiK(=G3YlBu3^=oA0k`P@VYcn2PqUm9&!uSz{s>t3!RRB()@Bi5FnENPa$&RWg`X zj5_QvJT~gFC{b;slZkdRb=!(P<0HMH{#1%iUP%I*su+WrV~%H_IsXl)ulZMcG-r?4 ztT~3-G8N{BM0&r$DB3Er;5*T!^LM-VL;E-YJAC_lTwOWzQh{OlEvCg#gHAT01OOhs3P5USEc|2j5 zL@d{{8!_jE6!%*qKSH*CQuA-Ww>*v4q1bkseu=o-VZX zjhz=nMAVPvc3l`0u-4c*v3lfqW}zqt8z!^3O&~>=aM?v&0A0)af~{)D%#(jIsUk_u zrER5W+&=V*Nwpo(u?K_b&6j6Wo3wx|TN9-*8Eu)zC<{m}zu3`C8$1RsKZ+T(o zgj=bDLD(OsMzqP2UJ=~^18KNd=Y{@%rj_=zPros(w@*9oO?b-vP~BF2j9wCo+-PT- z`EJm}*&CfT+gUBV-7$W_3VUQ7le8f}Gq^3~Y5`YbCSe>v+V$9i*9ZD2=W_6zH`SDgiTF@`NjdNrR?cmvo5t6#6h(* zKWv%)w#m(FF@x*s_!SvDP8tu@)GjN|w9S9P2RZXf^DUp!ON*7JpJSvgCKxh5xw5=M z6G19P!Z%zwv!iR5;ZRGqqKeO zCi5ea=eA8KQ&t-~aMEaHW~S9?=<&}LF@yZ^k;LG=f|QG^*GCh&c4Yl|K+*MKj*S8R zp0|+U*N9WfZ z-h#42xF+jRDtX-Zb+c~JZB7$?y@W)e;&u~^PX$g3AAaFUEiub;)}&PEL+Ls@FeLq2 zemZdTkK|caL-kYag#O*Kkk9Tr!yQyT(J`wT6Bx#k0eVnNxV4VaNX9OV6vmvq3O#a@ zON#pZzCuJ^eK-?Zw$v?<(teTlyQxNcTu3x>30q!GXXUzxU%O< z?(GM*vp#w9TR6*nNsl9IU8kP zy)3jyvI!p5#4q|~pTQy5(mi-vbW%waQnsxg!#G7g-k-~_&HT(Ze!3~w$elG&;ki8{j2s5AR?KS~?(i~Rqd ze4MFmNFi!OF7;`*BMF{V>F-;&c(Er7GkoYi^ME47=F|OB;7R!ijdpT~TF>o2KU$#? z#L!sHHoD2JqAf+1UX`{xuDIZT4C4#>Lldu98Yx$<1|Mrd0aWMcg43}I-JZ&Gav73E z&3xM2RpSB@*%Eo*>4B4@1PeZw1|AUShrhD|kuxfGOuln6MB^9Rwr7{u(S^+N3(~V} zL0d;Oa@b(Ot@-ZguRh7yGk@mogV92l-Y>%PHIEFj*g{hKi=_U|ErLV^<*8?%`D?njx>B_^ zb(U>?xw2FgQ@k`+GM01`*f^TJb`wrNJ15r@;2XSgF`R{1UcoN;YjZDPIKnnyS%AbdHYgDvx+etOmZJ^|>F-GzQ5A z>Z)FMA~)S}z^p^Cm9DGWc<26_Rb0CK#I3(W3&oSZK%FDh4@I6Ky*aI9hdyAy*si<aF-VXht#m!9s#?~58I^!BG_qStz)TmPYY-m5B`s8!uSxXWitUZMZ} zrZEN03XdKhdRa|{ZXLr!FU`7P)+a@9w?=dBFt(}xh1xK%|K$%RSB!SNdd7lo=%@!G z?%sPAQ7dCzE8A}3A)|wS-tI2K@l!{o{QUHF!v`;7$MH6Qm65>bo69)uzpwPoSa*Ml zWgk-7OOLJEZx<8Cny4dcC2gr6y2QB&?&5DwrEv2`wC7 zHG|cJ4UKCF=>s6AE>iG11l^l--M#km{~`rIcs`_FwNfb5!k6!cguAL2B+ixz`&?IO z*EVBP5_T-Qu{TqlYTSQ5S>;Hr!oEO69ClCS#&(AjBi`v|@ocYl#R&P%LVbKf6KDQi zVDp5uJ0-NMml8ZR-1{;+PU#DBC2d!7a8cYs@Z+mO8E+lw_aXumy11ayEf&#;rC|lM zH45Zgk}7pb{1bG+xB{#AR&uE8R^Mx9=M@BlcXs>qJZ|FW_&P8QZgEfTW8ah?R1%qy zGqNJ=x8@kE6FCN-^fmFFwIpP(rzcB))1h#i_qkVAvhrFsE!E;kARad#%e%S>=>7eX zgos^-SM2<_h3c+GYB_*vVbmM5UX7ndY)v&+LQFWV&=XM%(!bk|e^E%VZiGX?ccXhT z9_Tn`M;75qw2T(cb4h|@G-_mfXgN^|^A~|}ycFI36TD9e>uZpWg3PfbTu<@dMih*I{pi9xA)zJ-MnC!h z&aWkYSZ4EnF#0HTV3^ht=QKs}0+*o|(fUTsSFYKjT^~ zXjc+Mk?$d9OCKmNd3yR82bysce!r!qW!-ZadEI*UjK;|u(vDT9Z9$=m*fw38?5-Uv zHag_ud7bsHQnjsJ8ZsL0*nsYS9ldJxWUtnlnpWF_z5Hj1h=0y@dvT&d9<$@v$sQ3N zSo9)Z=Ga5x1FF4zDd|!UN!r1iyGuV(C4zJcYl^sen2To#Vyd$*$xt?FXlQ(J(-Z}) z3U22fz>21F4d(0#{YVYO;G+WFVMj?Y{1oE>_jbn|X{W=hH_N?R|CHZj9EpU^Tc!*< z6H&_Pu|A8H4l^$SZ#q2X4SuzSH`iQZ=UPLzjTD=N$=1s`ysIJJR&QU^LO(Uyt1IWV zA^x@gZC5F0%ahHBgHzQcbE1Pw=~0G3NYRbbf-%isBew~uY>Ij1u79mtvbC#^gk0vP zM)~7~?AQi9b7p-oIxd8g<(d2IcRGVCScAC~zr==s4Ns0nw&i#%?-Ituujra*uwxxKwTaF9xbItL5mnUiERrI=VIqn32z)1q zMZb`Fj}%5`gi44ap5EJM9t~ghy^e)s0h9@dB(iJ|5Qr1Wu=^oV^9Uxd}`lhvq+mj@5D?ffEApweQwcs%Ix3Q`hqt5JbHN9aGJC2d4bnr}5E9Z;)N1X-ma z+Wbb5h=D&&HZY~Ynt{tDF*4%o&6{A-L+q=fDG~>0xJd*|Eoh6LL|A))5hJVRM4S%Y ztc?BUN>EqO>URDglV7w*Dx%G$F3k00zba)Gyln=SXlRTd|XCL}?dDkMm4moTtXfhus%oBj8b1P87esuS}Suu}+jW~y1 zwwg!&lr$QLn|&bQ7lm~Tc>y%;-0VkGK)@)do`VPj+9?;tD0pehMcQX2F+*soE6xad=HGQUg!MII`o=6qW8;F8Z04pBL48(cE}FOx8a+w6^T^jZ zEJ+LW1qiiw4{nD% zRI@aYZ8)I0Iibq(ynF-Np=LBbZ1z6_Ugc25{0dsM$NWjhyq_VqwY9RhEHpoH?Y}aK BfBXOd literal 0 HcmV?d00001 diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/img/flashconfig.png b/Ubiquitous/Nuttx/aiit_board/xidatong/img/flashconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..9db4bd31233b8b25f7ca59aebba0e16e6e86d5c4 GIT binary patch literal 72092 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 - -### 裁减配置工具的下载 - -裁减配置工具: - -**工具地址:** kconfig-frontends [https://www.gitlink.org.cn/xuos/kconfig-frontends](https://www.gitlink.org.cn/xuos/kconfig-frontends),下载与安装的具体命令如下: - -```c -mkdir kfrontends && cd kfrontends -git clone https://gitlink.org.cn/xuos/kconfig-frontends.git -``` - -下载源码后按以下步骤执行软件安装: - -```c -cd kconfig-frontends -./xs_build.sh -``` - -### 编译工具链: - -ARM: arm-none-eabi(`gcc version 6.3.1`),默认安装到Ubuntu的/usr/bin/arm-none-eabi-,使用如下命令行下载和安装。 - -```shell -$ sudo apt install gcc-arm-none-eabi -``` - -## 编译说明 - -### 编辑环境:`Ubuntu18.04` - -### 编译工具链:`arm-none-eabi-gcc` -使用`VScode`打开工程的方法有多种,本文介绍一种快捷键,在项目目录下将`code .`输入linux系统命令终端即可打开目标项目 - - -编译步骤: - -1.在VScode命令终端中执行以下命令,生成配置文件 - -```shell -cd ./Ubiquitous/Nuttx/app_match_nuttx -source build.sh - -执行完毕会自动进入./Ubiquitous/Nuttx/nuttx下,继续执行 - -sudo ./tools/configure.sh xidatong:nsh -sudo make menuconfig -``` - -2.在menuconfig界面配置需要关闭和开启的功能,按回车键进入下级菜单,按Y键选中需要开启的功能,按N键选中需要关闭的功能,配置结束后保存并退出(本例旨在演示简单的输出例程,所以没有需要配置的选项,双击快捷键ESC退出配置) - -![menuconfig](./img/menuconfig.png) - -退出时选择`yes`保存上面所配置的内容,如下图所示: - -![menuconfig1](./img/menuconfigexit.png) - -3.继续执行以下命令,进行编译 - -```shell -sudo make -或 -sudo make -j8 -``` - -make时加上V=1参数可以看到较为详细的编译信息,但是编译过程会比较慢。 - -4.如果编译正确无误,会在当前目录下产生nuttx、nuttx.hex等文件。 - -## 3. 烧写及运行 - -### 3.1 烧写 -1、烧写工具:NXP MCU Boot Utility,可参考[https://github.com/JayHeng/NXP-MCUBootUtility](https://github.com/JayHeng/NXP-MCUBootUtility) - -2、xidatong开发板支持UART串口烧写程序,打开NXP MCU Boot Utility后,选择好芯片类型为i.MXRT105x,开发板上电,使用串口转USB线将开发板和PC连接,拨码开关设置为1 on 2 on 3 off 4 off,重新上电,选择对应的COM口和波特率(需关闭串口终端连接,确保该COM口空闲,否则会导致Utility工具连接失败),连接成功后,点击reconnect,等待NXP MCU Boot Utility中红色显示变成蓝色显示,则表示已正确识别并连接到了开发板。如下图所示: -![NXPBootUtility_1](./img/NXPBootUtility_1.png) - -3、同时需要匹配xidatong开发板所使用的Flash型号,点击Boot Device Configuration,在Use Typical Device中选择Winbond_W25QxxxJV,然后点击ok。如下图所示: -![flashconfig](./img/flashconfig.png) - -4、选择编译生成的nuttx文件路径(nuttx不带任何后缀,是一个elf文件),按照图示步骤,将文件烧写至Flash中(若烧写无误,则下列绿色进度条会执行到底)。如下图所示: -![NXPBootUtility_2](./img/NXPBootUtility_2.png) - -### 3.2 运行结果 - -按照3.1烧写步骤执行后,将拨码开关设置为1 off 2 off 3 off 4 off,重新上电后,重新打开该COM口串口终端,若程序正常,则串口终端上会显示启动信息打印输出。如下图所示: -![terminal](./img/terminal.png) - From a5cfd6dd9115c6db1e9bba8420d2b1050c1cf03b Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Fri, 25 Mar 2022 12:22:48 +0800 Subject: [PATCH 25/25] add readme.md --- .../Nuttx/aiit_board/xidatong/readme.md | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/readme.md diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/readme.md b/Ubiquitous/Nuttx/aiit_board/xidatong/readme.md new file mode 100644 index 000000000..f0295446c --- /dev/null +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/readme.md @@ -0,0 +1,182 @@ +# 从零开始构建矽璓工业物联操作系统:使用ARM架构的矽达通 + +# xidatong + +[XiUOS](http://xuos.io/) (X Industrial Ubiquitous Operating System) 矽璓XiUOS是一款面向智慧车间的工业物联网操作系统,主要由一个极简的微型实时操作系统内核和其上的工业物联框架构成,通过高效管理工业物联网设备、支撑工业物联应用,在生产车间内实现智能化的“感知环境、联网传输、知悉识别、控制调整”,促进以工业设备和工业控制系统为核心的人、机、物深度互联,帮助提升生产线的数字化和智能化水平。 + +## 1. 简介 + +| 硬件 | 描述 | +| -- | -- | +|芯片型号| MIMXRT1052CVL5B | +|架构| cortex-m7 | +|主频| 600MHz | +|片内SRAM| 512KB shared with TCM | +|外设支持| UART | + +XiUOS板级当前支持使用UART。 + +## 2. 开发环境搭建 + +### 推荐使用: + +**操作系统:** ubuntu18.04 [https://ubuntu.com/download/desktop](https://ubuntu.com/download/desktop) + +更新`ubuntu 18.04`源的方法:(根据自身情况而定,可以不更改) + +第一步:打开sources.list文件 + +```c +sudo vim /etc/apt/sources.list +``` + +第二步:将以下内容复制到sources.list文件 + +```c +deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse +``` + +第三步:更新源和系统软件 + +```c +sudo apt-get update +sudo apt-get upgrade +``` + +**开发工具推荐使用 VSCode ,VScode下载地址为:** VSCode [https://code.visualstudio.com/](https://code.visualstudio.com/),推荐下载地址为 [http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb](http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb) + +### 依赖包安装: + +``` +$ sudo apt install build-essential pkg-config git +$ sudo apt install gcc make libncurses5-dev openssl libssl-dev bison flex libelf-dev autoconf libtool gperf libc6-dev +``` + +**XiUOS操作系统源码下载:** XiUOS [https://www.gitlink.org.cn/xuos/xiuos](https://www.gitlink.org.cn/xuos/xiuos) + +新建一个空文件夹并进入文件夹中,并下载源码,具体命令如下: + +```c +mkdir test && cd test +git clone https://gitlink.org.cn/xuos/xiuos.git +``` + +1、打开XiUOS源码文件包可以看到以下目录: +| 名称 | 说明 | +| -- | -- | +| APP_Framework | 应用代码 | +| Ubiquitous | 板级支持包,支持NuttX、RT-Thread和XiZi内核 | + +2、打开XiZi内核源码文件包可以看到以下目录: +| 名称 | 说明 | +| -- | -- | +| arch | 架构代码 | +| board | 板级支持包 | +| fs | 文件系统 | +| kernel | 内核源码 | +| lib | 第三方库源码 | +| resources | 驱动文件 | +| tool | 系统工具 | + +使用VScode打开代码,具体操作步骤为:在源码文件夹下打开系统终端,输入`code .`即可打开VScode开发环境,如下图所示: + +
+ +
+ +### 裁减配置工具的下载 + +裁减配置工具: + +**工具地址:** kconfig-frontends [https://www.gitlink.org.cn/xuos/kconfig-frontends](https://www.gitlink.org.cn/xuos/kconfig-frontends),下载与安装的具体命令如下: + +```c +mkdir kfrontends && cd kfrontends +git clone https://gitlink.org.cn/xuos/kconfig-frontends.git +``` + +下载源码后按以下步骤执行软件安装: + +```c +cd kconfig-frontends +./xs_build.sh +``` + +### 编译工具链: + +ARM: arm-none-eabi(`gcc version 6.3.1`),默认安装到Ubuntu的/usr/bin/arm-none-eabi-,使用如下命令行下载和安装。 + +```shell +$ sudo apt install gcc-arm-none-eabi +``` + +## 编译说明 + +### 编辑环境:`Ubuntu18.04` + +### 编译工具链:`arm-none-eabi-gcc` +使用`VScode`打开工程的方法有多种,本文介绍一种快捷键,在项目目录下将`code .`输入linux系统命令终端即可打开目标项目 + + +编译步骤: + +1.在VScode命令终端中执行以下命令,生成配置文件 + +```shell +cd ./Ubiquitous/Nuttx/app_match_nuttx +source build.sh + +执行完毕会自动进入./Ubiquitous/Nuttx/nuttx下,继续执行 + +sudo ./tools/configure.sh xidatong:nsh +sudo make menuconfig +``` + +2.在menuconfig界面配置需要关闭和开启的功能,按回车键进入下级菜单,按Y键选中需要开启的功能,按N键选中需要关闭的功能,配置结束后保存并退出(本例旨在演示简单的输出例程,所以没有需要配置的选项,双击快捷键ESC退出配置) + +![menuconfig](./img/menuconfig.png) + +退出时选择`yes`保存上面所配置的内容,如下图所示: + +![menuconfig1](./img/menuconfigexit.png) + +3.继续执行以下命令,进行编译 + +```shell +sudo make +或 +sudo make -j8 +``` + +make时加上V=1参数可以看到较为详细的编译信息,但是编译过程会比较慢。 + +4.如果编译正确无误,会在当前目录下产生nuttx、nuttx.hex等文件。 + +## 3. 烧写及运行 + +### 3.1 烧写 +1、烧写工具:NXP MCU Boot Utility,可参考[https://github.com/JayHeng/NXP-MCUBootUtility](https://github.com/JayHeng/NXP-MCUBootUtility) + +2、xidatong开发板支持UART串口烧写程序,打开NXP MCU Boot Utility后,选择好芯片类型为i.MXRT105x,开发板上电,使用串口转USB线将开发板和PC连接,拨码开关设置为1 on 2 on 3 off 4 off,重新上电,选择对应的COM口和波特率(需关闭串口终端连接,确保该COM口空闲,否则会导致Utility工具连接失败),连接成功后,点击reconnect,等待NXP MCU Boot Utility中红色显示变成蓝色显示,则表示已正确识别并连接到了开发板。如下图所示: +![NXPBootUtility_1](./img/NXPBootUtility_1.png) + +3、同时需要匹配xidatong开发板所使用的Flash型号,点击Boot Device Configuration,在Use Typical Device中选择Winbond_W25QxxxJV,然后点击ok。如下图所示: +![flashconfig](./img/flashconfig.png) + +4、选择编译生成的nuttx文件路径(nuttx不带任何后缀,是一个elf文件),按照图示步骤,将文件烧写至Flash中(若烧写无误,则下列绿色进度条会执行到底)。如下图所示: +![NXPBootUtility_2](./img/NXPBootUtility_2.png) + +### 3.2 运行结果 + +按照3.1烧写步骤执行后,将拨码开关设置为1 off 2 off 3 off 4 off,重新上电后,重新打开该COM口串口终端,若程序正常,则串口终端上会显示启动信息打印输出。如下图所示: +![terminal](./img/terminal.png) +

t&8Yl!nSFkEnlP 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 DLICUf literal 0 HcmV?d00001 diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/img/menuconfig.png b/Ubiquitous/Nuttx/aiit_board/xidatong/img/menuconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..ea275e1ffa5d3f865710b38bc7077b5839ae638f GIT binary patch literal 31565 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 h#W&EOhY4FqNa-j43tqhLxI=cu9#A5p1ec)8r+` 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 Date: Thu, 24 Mar 2022 17:06:42 +0800 Subject: [PATCH 21/25] add README.md for xidatong --- Ubiquitous/Nuttx/aiit_board/xidatong/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/README.md b/Ubiquitous/Nuttx/aiit_board/xidatong/README.md index 1e2496329..f0295446c 100644 --- a/Ubiquitous/Nuttx/aiit_board/xidatong/README.md +++ b/Ubiquitous/Nuttx/aiit_board/xidatong/README.md @@ -179,3 +179,4 @@ make时加上V=1参数可以看到较为详细的编译信息,但是编译过 按照3.1烧写步骤执行后,将拨码开关设置为1 off 2 off 3 off 4 off,重新上电后,重新打开该COM口串口终端,若程序正常,则串口终端上会显示启动信息打印输出。如下图所示: ![terminal](./img/terminal.png) + From d66f6f97453fb6828d34f0cf23bb108f2fab8e71 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Fri, 25 Mar 2022 11:26:23 +0800 Subject: [PATCH 22/25] Regenerate submodules nuttx --- .gitmodules | 6 ------ Ubiquitous/Nuttx/apps | 1 - Ubiquitous/Nuttx/nuttx | 1 - 3 files changed, 8 deletions(-) delete mode 160000 Ubiquitous/Nuttx/apps delete mode 160000 Ubiquitous/Nuttx/nuttx diff --git a/.gitmodules b/.gitmodules index 3b619568a..c2a2978b9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,12 +4,6 @@ [submodule "Ubiquitous/RT_Thread/aiit_board/k210/kendryte-sdk/kendryte-sdk-source"] path = Ubiquitous/RT_Thread/aiit_board/k210/kendryte-sdk/kendryte-sdk-source url = https://code.gitlink.org.cn/chunyexixiaoyu/kendryte-sdk-source.git -[submodule "Ubiquitous/Nuttx/apps"] - path = Ubiquitous/Nuttx/apps - url = https://gitlink.org.cn/wgzAIIT/incubator-nuttx-apps.git -[submodule "Ubiquitous/Nuttx/nuttx"] - path = Ubiquitous/Nuttx/nuttx - url = https://gitlink.org.cn/wgzAIIT/incubator-nuttx.git [submodule "Ubiquitous/RT_Thread/aiit_board/aiit-riscv64-board/kendryte-sdk/kendryte-sdk-source"] path = Ubiquitous/RT_Thread/aiit_board/aiit-riscv64-board/kendryte-sdk/kendryte-sdk-source url = https://code.gitlink.org.cn/chunyexixiaoyu/kendryte-sdk-source.git diff --git a/Ubiquitous/Nuttx/apps b/Ubiquitous/Nuttx/apps deleted file mode 160000 index 562239ecb..000000000 --- a/Ubiquitous/Nuttx/apps +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 562239ecb2d84dd9de2dd206da41df19602e20cb diff --git a/Ubiquitous/Nuttx/nuttx b/Ubiquitous/Nuttx/nuttx deleted file mode 160000 index 3fede4209..000000000 --- a/Ubiquitous/Nuttx/nuttx +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3fede42098e5883f336d846ac30edfe749899494 From b0ce2bd9f702940fec2872d8675268f878615296 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Fri, 25 Mar 2022 11:34:30 +0800 Subject: [PATCH 23/25] Regenerate submodules nuttx --- .gitmodules | 6 ++++++ Ubiquitous/Nuttx/apps | 1 + Ubiquitous/Nuttx/nuttx | 1 + 3 files changed, 8 insertions(+) create mode 160000 Ubiquitous/Nuttx/apps create mode 160000 Ubiquitous/Nuttx/nuttx diff --git a/.gitmodules b/.gitmodules index c2a2978b9..c89e1be25 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,9 @@ [submodule "Ubiquitous/RT_Thread/aiit_board/aiit-riscv64-board/kendryte-sdk/kendryte-sdk-source"] path = Ubiquitous/RT_Thread/aiit_board/aiit-riscv64-board/kendryte-sdk/kendryte-sdk-source url = https://code.gitlink.org.cn/chunyexixiaoyu/kendryte-sdk-source.git +[submodule "Ubiquitous/Nuttx/apps"] + path = Ubiquitous/Nuttx/apps + url = https://code.gitlink.org.cn/wgzAIIT/incubator-nuttx-apps.git +[submodule "Ubiquitous/Nuttx/nuttx"] + path = Ubiquitous/Nuttx/nuttx + url = https://code.gitlink.org.cn/wgzAIIT/incubator-nuttx.git diff --git a/Ubiquitous/Nuttx/apps b/Ubiquitous/Nuttx/apps new file mode 160000 index 000000000..562239ecb --- /dev/null +++ b/Ubiquitous/Nuttx/apps @@ -0,0 +1 @@ +Subproject commit 562239ecb2d84dd9de2dd206da41df19602e20cb diff --git a/Ubiquitous/Nuttx/nuttx b/Ubiquitous/Nuttx/nuttx new file mode 160000 index 000000000..3fede4209 --- /dev/null +++ b/Ubiquitous/Nuttx/nuttx @@ -0,0 +1 @@ +Subproject commit 3fede42098e5883f336d846ac30edfe749899494 From 61f7f4b43e23019fe618ad6cebc7371b6d2224db Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Fri, 25 Mar 2022 12:17:19 +0800 Subject: [PATCH 24/25] remove README.md --- .../Nuttx/aiit_board/xidatong/README.md | 182 ------------------ 1 file changed, 182 deletions(-) delete mode 100644 Ubiquitous/Nuttx/aiit_board/xidatong/README.md diff --git a/Ubiquitous/Nuttx/aiit_board/xidatong/README.md b/Ubiquitous/Nuttx/aiit_board/xidatong/README.md deleted file mode 100644 index f0295446c..000000000 --- a/Ubiquitous/Nuttx/aiit_board/xidatong/README.md +++ /dev/null @@ -1,182 +0,0 @@ -# 从零开始构建矽璓工业物联操作系统:使用ARM架构的矽达通 - -# xidatong - -[XiUOS](http://xuos.io/) (X Industrial Ubiquitous Operating System) 矽璓XiUOS是一款面向智慧车间的工业物联网操作系统,主要由一个极简的微型实时操作系统内核和其上的工业物联框架构成,通过高效管理工业物联网设备、支撑工业物联应用,在生产车间内实现智能化的“感知环境、联网传输、知悉识别、控制调整”,促进以工业设备和工业控制系统为核心的人、机、物深度互联,帮助提升生产线的数字化和智能化水平。 - -## 1. 简介 - -| 硬件 | 描述 | -| -- | -- | -|芯片型号| MIMXRT1052CVL5B | -|架构| cortex-m7 | -|主频| 600MHz | -|片内SRAM| 512KB shared with TCM | -|外设支持| UART | - -XiUOS板级当前支持使用UART。 - -## 2. 开发环境搭建 - -### 推荐使用: - -**操作系统:** ubuntu18.04 [https://ubuntu.com/download/desktop](https://ubuntu.com/download/desktop) - -更新`ubuntu 18.04`源的方法:(根据自身情况而定,可以不更改) - -第一步:打开sources.list文件 - -```c -sudo vim /etc/apt/sources.list -``` - -第二步:将以下内容复制到sources.list文件 - -```c -deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse -deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse -deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse -deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse -deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse -``` - -第三步:更新源和系统软件 - -```c -sudo apt-get update -sudo apt-get upgrade -``` - -**开发工具推荐使用 VSCode ,VScode下载地址为:** VSCode [https://code.visualstudio.com/](https://code.visualstudio.com/),推荐下载地址为 [http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb](http://vscode.cdn.azure.cn/stable/3c4e3df9e89829dce27b7b5c24508306b151f30d/code_1.55.2-1618307277_amd64.deb) - -### 依赖包安装: - -``` -$ sudo apt install build-essential pkg-config git -$ sudo apt install gcc make libncurses5-dev openssl libssl-dev bison flex libelf-dev autoconf libtool gperf libc6-dev -``` - -**XiUOS操作系统源码下载:** XiUOS [https://www.gitlink.org.cn/xuos/xiuos](https://www.gitlink.org.cn/xuos/xiuos) - -新建一个空文件夹并进入文件夹中,并下载源码,具体命令如下: - -```c -mkdir test && cd test -git clone https://gitlink.org.cn/xuos/xiuos.git -``` - -1、打开XiUOS源码文件包可以看到以下目录: -| 名称 | 说明 | -| -- | -- | -| APP_Framework | 应用代码 | -| Ubiquitous | 板级支持包,支持NuttX、RT-Thread和XiZi内核 | - -2、打开XiZi内核源码文件包可以看到以下目录: -| 名称 | 说明 | -| -- | -- | -| arch | 架构代码 | -| board | 板级支持包 | -| fs | 文件系统 | -| kernel | 内核源码 | -| lib | 第三方库源码 | -| resources | 驱动文件 | -| tool | 系统工具 | - -使用VScode打开代码,具体操作步骤为:在源码文件夹下打开系统终端,输入`code .`即可打开VScode开发环境,如下图所示: - -