Explorar o código

!549 [bsp/d1-allwinner-nezha] 编译环境搭建
Merge pull request !549 from 张世争/rt-smart

bernard %!s(int64=3) %!d(string=hai) anos
pai
achega
e0aeec698b

+ 74 - 21
bsp/d1-allwinner-nezha/.config

@@ -63,6 +63,7 @@ CONFIG_RT_USING_HEAP=y
 #
 CONFIG_RT_USING_DEVICE=y
 # CONFIG_RT_USING_DEVICE_OPS is not set
+# CONFIG_RT_USING_DM is not set
 # CONFIG_RT_USING_INTERRUPT_INFO is not set
 CONFIG_RT_USING_CONSOLE=y
 CONFIG_RT_CONSOLEBUF_SIZE=256
@@ -71,6 +72,7 @@ CONFIG_RT_VER_NUM=0x50000
 CONFIG_ARCH_CPU_64BIT=y
 CONFIG_RT_USING_CACHE=y
 # CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set
 # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
 CONFIG_ARCH_MM_MMU=y
 CONFIG_RT_USING_USERSPACE=y
@@ -149,24 +151,29 @@ CONFIG_RT_USING_TTY=y
 CONFIG_RT_USING_PIN=y
 # CONFIG_RT_USING_ADC is not set
 # CONFIG_RT_USING_DAC is not set
-# CONFIG_RT_USING_NULL is not set
-# CONFIG_RT_USING_ZERO is not set
-# CONFIG_RT_USING_RANDOM is not set
+CONFIG_RT_USING_NULL=y
+CONFIG_RT_USING_ZERO=y
+CONFIG_RT_USING_RANDOM=y
 # CONFIG_RT_USING_PWM is not set
 # CONFIG_RT_USING_MTD_NOR is not set
 # CONFIG_RT_USING_MTD_NAND is not set
 # CONFIG_RT_USING_PM is not set
-# CONFIG_RT_USING_RTC is not set
+# CONFIG_RT_USING_FDT is not set
+CONFIG_RT_USING_RTC=y
+# CONFIG_RT_USING_ALARM is not set
+# CONFIG_RT_USING_SOFT_RTC is not set
 # CONFIG_RT_USING_SDIO is not set
 # CONFIG_RT_USING_SPI is not set
 # CONFIG_RT_USING_WDT is not set
 # CONFIG_RT_USING_AUDIO is not set
 # CONFIG_RT_USING_SENSOR is not set
 # CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_LCD is not set
 # CONFIG_RT_USING_HWCRYPTO is not set
 # CONFIG_RT_USING_PULSE_ENCODER is not set
 # CONFIG_RT_USING_INPUT_CAPTURE is not set
 # CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_VIRTIO is not set
 
 #
 # Using USB
@@ -241,6 +248,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 #
 # IoT - internet of things
 #
+# CONFIG_PKG_USING_LWIP is not set
 # CONFIG_PKG_USING_LORAWAN_DRIVER is not set
 # CONFIG_PKG_USING_PAHOMQTT is not set
 # CONFIG_PKG_USING_UMQTT is not set
@@ -251,12 +259,8 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_KAWAII_MQTT is not set
 # CONFIG_PKG_USING_BC28_MQTT is not set
 # CONFIG_PKG_USING_WEBTERMINAL is not set
-# CONFIG_PKG_USING_CJSON is not set
-# CONFIG_PKG_USING_JSMN is not set
 # CONFIG_PKG_USING_LIBMODBUS is not set
 # CONFIG_PKG_USING_FREEMODBUS is not set
-# CONFIG_PKG_USING_LJSON is not set
-# CONFIG_PKG_USING_EZXML is not set
 # CONFIG_PKG_USING_NANOPB is not set
 
 #
@@ -294,7 +298,10 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_JIOT-C-SDK is not set
 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
 # CONFIG_PKG_USING_JOYLINK is not set
+# CONFIG_PKG_USING_EZ_IOT_OS is not set
+# CONFIG_PKG_USING_IOTSHARP_SDK is not set
 # CONFIG_PKG_USING_NIMBLE is not set
+# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set
 # CONFIG_PKG_USING_OTA_DOWNLOADER is not set
 # CONFIG_PKG_USING_IPMSG is not set
 # CONFIG_PKG_USING_LSSDP is not set
@@ -308,16 +315,13 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_ABUP_FOTA is not set
 # CONFIG_PKG_USING_LIBCURL2RTT is not set
 # CONFIG_PKG_USING_CAPNP is not set
-# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
 # CONFIG_PKG_USING_AGILE_TELNET is not set
 # CONFIG_PKG_USING_NMEALIB is not set
-# CONFIG_PKG_USING_AGILE_JSMN is not set
 # CONFIG_PKG_USING_PDULIB is not set
 # CONFIG_PKG_USING_BTSTACK is not set
 # CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
 # CONFIG_PKG_USING_WAYZ_IOTKIT is not set
 # CONFIG_PKG_USING_MAVLINK is not set
-# CONFIG_PKG_USING_RAPIDJSON is not set
 # CONFIG_PKG_USING_BSAL is not set
 # CONFIG_PKG_USING_AGILE_MODBUS is not set
 # CONFIG_PKG_USING_AGILE_FTP is not set
@@ -328,12 +332,15 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set
 # CONFIG_PKG_USING_HM is not set
 # CONFIG_PKG_USING_SMALL_MODBUS is not set
+# CONFIG_PKG_USING_NET_SERVER is not set
+# CONFIG_PKG_USING_ZFTP is not set
 
 #
 # security packages
 #
 # CONFIG_PKG_USING_MBEDTLS is not set
 # CONFIG_PKG_USING_LIBSODIUM is not set
+# CONFIG_PKG_USING_LIBHYDROGEN is not set
 # CONFIG_PKG_USING_TINYCRYPT is not set
 # CONFIG_PKG_USING_TFM is not set
 # CONFIG_PKG_USING_YD_CRYPTO is not set
@@ -341,10 +348,29 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 #
 # language packages
 #
+
+#
+# JSON: JavaScript Object Notation, a lightweight data-interchange format
+#
+# CONFIG_PKG_USING_CJSON is not set
+# CONFIG_PKG_USING_LJSON is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_JSMN is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PARSON is not set
+
+#
+# XML: Extensible Markup Language
+#
+# CONFIG_PKG_USING_SIMPLE_XML is not set
+# CONFIG_PKG_USING_EZXML is not set
+# CONFIG_PKG_USING_LUATOS_SOC is not set
 # CONFIG_PKG_USING_LUA is not set
 # CONFIG_PKG_USING_JERRYSCRIPT is not set
 # CONFIG_PKG_USING_MICROPYTHON is not set
 # CONFIG_PKG_USING_PIKASCRIPT is not set
+# CONFIG_PKG_USING_RTT_RUST is not set
 
 #
 # multimedia packages
@@ -356,6 +382,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_LVGL is not set
 # CONFIG_PKG_USING_LITTLEVGL2RTT is not set
 # CONFIG_PKG_USING_LV_MUSIC_DEMO is not set
+# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set
 
 #
 # u8g2: a monochrome graphic library
@@ -381,6 +408,11 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 #
 # CONFIG_PKG_USING_PAINTERENGINE is not set
 # CONFIG_PKG_USING_PAINTERENGINE_AUX is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_TERMBOX is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_QRCODE is not set
+# CONFIG_PKG_USING_GUIENGINE is not set
 
 #
 # tools packages
@@ -391,7 +423,6 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_SYSTEMVIEW is not set
 # CONFIG_PKG_USING_SEGGER_RTT is not set
 # CONFIG_PKG_USING_RDB is not set
-# CONFIG_PKG_USING_QRCODE is not set
 # CONFIG_PKG_USING_ULOG_EASYFLASH is not set
 # CONFIG_PKG_USING_ULOG_FILE is not set
 # CONFIG_PKG_USING_LOGMGR is not set
@@ -424,6 +455,11 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_SOLAR_TERMS is not set
 # CONFIG_PKG_USING_GAN_ZHI is not set
 # CONFIG_PKG_USING_FDT is not set
+# CONFIG_PKG_USING_CBOX is not set
+# CONFIG_PKG_USING_SNOWFLAKE is not set
+# CONFIG_PKG_USING_HASH_MATCH is not set
+# CONFIG_PKG_USING_FIRE_PID_CURVE is not set
+# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set
 
 #
 # system packages
@@ -447,6 +483,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
 #
 # CONFIG_PKG_USING_CMSIS_5 is not set
+# CONFIG_PKG_USING_CMSIS_RTOS1 is not set
 # CONFIG_PKG_USING_CMSIS_RTOS2 is not set
 
 #
@@ -458,12 +495,11 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_UC_CLK is not set
 # CONFIG_PKG_USING_UC_COMMON is not set
 # CONFIG_PKG_USING_UC_MODBUS is not set
-# CONFIG_RT_USING_ARDUINO is not set
-# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_RTDUINO is not set
 # CONFIG_PKG_USING_CAIRO is not set
 # CONFIG_PKG_USING_PIXMAN is not set
 # CONFIG_PKG_USING_PARTITION is not set
-# CONFIG_PKG_USING_FAL is not set
+# CONFIG_PKG_USING_PERF_COUNTER is not set
 # CONFIG_PKG_USING_FLASHDB is not set
 # CONFIG_PKG_USING_SQLITE is not set
 # CONFIG_PKG_USING_RTI is not set
@@ -487,10 +523,12 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_TLSF is not set
 # CONFIG_PKG_USING_EVENT_RECORDER is not set
 # CONFIG_PKG_USING_ARM_2D is not set
-# CONFIG_PKG_USING_WCWIDTH is not set
 # CONFIG_PKG_USING_MCUBOOT is not set
 # CONFIG_PKG_USING_TINYUSB is not set
-# CONFIG_PKG_USING_USB_STACK is not set
+# CONFIG_PKG_USING_CHERRYUSB is not set
+# CONFIG_PKG_USING_KMULTI_RTIMER is not set
+# CONFIG_PKG_USING_TFDB is not set
+# CONFIG_PKG_USING_QPC is not set
 
 #
 # peripheral libraries and drivers
@@ -499,8 +537,10 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_REALTEK_AMEBA is not set
 # CONFIG_PKG_USING_SHT2X is not set
 # CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_ADT74XX is not set
 # CONFIG_PKG_USING_AS7341 is not set
 # CONFIG_PKG_USING_STM32_SDIO is not set
+# CONFIG_PKG_USING_RTT_ESP_IDF is not set
 # CONFIG_PKG_USING_ICM20608 is not set
 # CONFIG_PKG_USING_BUTTON is not set
 # CONFIG_PKG_USING_PCF8574 is not set
@@ -514,6 +554,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_WM_LIBRARIES is not set
 # CONFIG_PKG_USING_KENDRYTE_SDK is not set
 # CONFIG_PKG_USING_INFRARED is not set
+# CONFIG_PKG_USING_MULTI_INFRARED is not set
 # CONFIG_PKG_USING_AGILE_BUTTON is not set
 # CONFIG_PKG_USING_AGILE_LED is not set
 # CONFIG_PKG_USING_AT24CXX is not set
@@ -548,6 +589,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_SSD1306 is not set
 # CONFIG_PKG_USING_QKEY is not set
 # CONFIG_PKG_USING_RS485 is not set
+# CONFIG_PKG_USING_RS232 is not set
 # CONFIG_PKG_USING_NES is not set
 # CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
 # CONFIG_PKG_USING_VDEVICE is not set
@@ -565,9 +607,12 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_BLUETRUM_SDK is not set
 # CONFIG_PKG_USING_MISAKA_AT24CXX is not set
 # CONFIG_PKG_USING_MISAKA_RGB_BLING is not set
+# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set
 # CONFIG_PKG_USING_BL_MCU_SDK is not set
 # CONFIG_PKG_USING_SOFT_SERIAL is not set
 # CONFIG_PKG_USING_MB85RS16 is not set
+# CONFIG_PKG_USING_CW2015 is not set
+# CONFIG_PKG_USING_RFM300 is not set
 
 #
 # AI packages
@@ -586,6 +631,10 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # miscellaneous packages
 #
 
+#
+# project laboratory
+#
+
 #
 # samples: kernel and components samples
 #
@@ -606,6 +655,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_SNAKE is not set
 # CONFIG_PKG_USING_TETRIS is not set
 # CONFIG_PKG_USING_DONUT is not set
+# CONFIG_PKG_USING_COWSAY is not set
 # CONFIG_PKG_USING_LIBCSV is not set
 # CONFIG_PKG_USING_OPTPARSE is not set
 # CONFIG_PKG_USING_FASTLZ is not set
@@ -617,6 +667,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_CANFESTIVAL is not set
 # CONFIG_PKG_USING_ZLIB is not set
 # CONFIG_PKG_USING_MINIZIP is not set
+# CONFIG_PKG_USING_HEATSHRINK is not set
 # CONFIG_PKG_USING_DSTR is not set
 # CONFIG_PKG_USING_TINYFRAME is not set
 # CONFIG_PKG_USING_KENDRYTE_DEMO is not set
@@ -627,14 +678,16 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_PKG_USING_VI is not set
 # CONFIG_PKG_USING_KI is not set
 # CONFIG_PKG_USING_ARMv7M_DWT is not set
-# CONFIG_PKG_USING_VT100 is not set
 # CONFIG_PKG_USING_UKAL is not set
 # CONFIG_PKG_USING_CRCLIB is not set
 # CONFIG_PKG_USING_LWGPS is not set
 # CONFIG_PKG_USING_STATE_MACHINE is not set
-# CONFIG_PKG_USING_MCURSES is not set
-# CONFIG_PKG_USING_COWSAY is not set
-# CONFIG_PKG_USING_TERMBOX is not set
+# CONFIG_PKG_USING_DESIGN_PATTERN is not set
+# CONFIG_PKG_USING_CONTROLLER is not set
+# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set
+# CONFIG_PKG_USING_MFBD is not set
+# CONFIG_PKG_USING_SLCAN2RTT is not set
+# CONFIG_PKG_USING_SOEM is not set
 CONFIG_BOARD_allwinnerd1=y
 CONFIG_ENABLE_FPU=y
 # CONFIG_RT_USING_USERSPACE_32BIT_LIMIT is not set

+ 1 - 0
bsp/d1-allwinner-nezha/.gitignore

@@ -1,6 +1,7 @@
 __pycache__/
 rtthread.bin
 rtthread.elf
+rtthread.img
 *.map
 build/
 .sconsign.dblite

+ 89 - 0
bsp/d1-allwinner-nezha/README.md

@@ -1 +1,90 @@
 # RT-Thread全志D1移植
+
+全志 d1-allwinner-nezha 属于 riscv64 平台
+
+## 编译环境搭建
+
+- 拉取 RT-Thread 的代码仓库 `git clone https://gitee.com/zhangsz0516/rt-thread.git`
+
+- 切换到 rt-smart 分支 `git checkout -b rt-smart origin/rt-smart`
+
+### windows 环境
+
+- 打开 RT-Thread ENV 工具
+
+- 进入bsp目录 `bsp/d1-allwinner-nezha`
+
+- 进入 tools 目录 `cd tools`
+
+- 拉取 `riscv64`平台的编译工具 `python get_toolchain.py riscv64`
+
+- 返回 bsp 目录 `cd ..`
+
+- 设置环境变量 `./smart-env.bat`
+
+### ubuntu 环境
+
+- 打开 ubuntu shell 终端
+
+- 进入bsp目录 `bsp/d1-allwinner-nezha`
+
+- 进入 tools 目录 `cd tools`
+
+- 拉取 `riscv64`平台的编译工具 `python get_toolchain.py riscv64`
+
+- 返回 bsp 目录 `cd ..`
+
+- 设置环境变量 `./smart-env.sh`
+
+### 编译环境验证
+
+- 输入:`riscv64-unknown-linux-musl-gcc -v`
+
+## 开发与编译
+
+- windows 下使用RT-Thread ENV 工具, `menuconfig` 配置工程,`scons` 编译工程
+
+- ubuntu 下 使用shell 终端: `scons --menuconfig` 配置工程, `scons` 编译工程
+
+
+## 下载验证
+
+- 编译完后,通过:mkimage 生成 img 镜像文件,这个img 镜像文件可以使用 U-boot 引导启动
+
+- 启动方式一般有:SD卡启动、NandFlash启动、网络引导启动
+
+- windows 下使用全志的:`AllwinnertechPhoeniSuitRelease20201225`
+
+- 可以使用 xfel 工具进行烧写NandFlash
+
+## 运行效果
+
+```c
+## Booting kernel from Legacy Image at 45000000 ...
+   Image Name:   
+   Image Type:   RISC-V Linux Kernel Image (uncompressed)
+   Data Size:    249576 Bytes = 243.7 KiB
+   Load Address: 45000000
+   Entry Point:  45000000
+   Verifying Checksum ... OK
+[01.861]
+Starting kernel ...
+heap: [0x45077bb0 - 0x48277bb0]
+ \ | /
+- RT -     Thread Smart Operating System
+ / | \     5.0.0 build Jun 18 2022
+ 2006 - 2020 Copyright by rt-thread team
+file system initialization done!
+Hello RISC-V
+msh />
+
+```
+
+## 参考文档
+
+- [https://club.rt-thread.org/ask/article/389ac36250b57737.html](https://club.rt-thread.org/ask/article/389ac36250b57737.html)
+
+
+
+
+

+ 1 - 0
bsp/d1-allwinner-nezha/generateimg.bat

@@ -0,0 +1 @@
+mkimage -A riscv -O linux -T kernel -C none -a 0x45000000 -e 0x45000000 -d rtthread.bin rtthread.img

+ 11 - 0
bsp/d1-allwinner-nezha/rtconfig.h

@@ -101,6 +101,10 @@
 #define RT_SERIAL_RB_BUFSZ 64
 #define RT_USING_TTY
 #define RT_USING_PIN
+#define RT_USING_NULL
+#define RT_USING_ZERO
+#define RT_USING_RANDOM
+#define RT_USING_RTC
 
 /* Using USB */
 
@@ -160,6 +164,11 @@
 
 /* language packages */
 
+/* JSON: JavaScript Object Notation, a lightweight data-interchange format */
+
+
+/* XML: Extensible Markup Language */
+
 
 /* multimedia packages */
 
@@ -197,6 +206,8 @@
 
 /* miscellaneous packages */
 
+/* project laboratory */
+
 /* samples: kernel and components samples */
 
 

+ 10 - 0
bsp/d1-allwinner-nezha/smart-env.bat

@@ -0,0 +1,10 @@
+set RTT_CC=gcc
+set RTT_EXEC_PATH=%cd%\tools\gnu_gcc\riscv64-linux-musleabi_for_i686-w64-mingw32\bin
+set RTT_CC_PREFIX=riscv64-unknown-linux-musl-
+set RTT_TOOLS_PATH=%cd%\tools
+@set PATH=%RTT_EXEC_PATH%;%RTT_TOOLS_PATH%;%ENV_ROOT%\tools\gnu_gcc\arm_gcc\mingw\bin;%PATH%
+
+@echo "Arch      : riscv64"
+@echo "CC        : %RTT_CC%"
+@echo "PREFIX    : %RTT_CC_PREFIX%"
+@echo "EXEC_PATH : %RTT_EXEC_PATH%"

+ 60 - 0
bsp/d1-allwinner-nezha/smart-env.sh

@@ -0,0 +1,60 @@
+#!/bin/bash
+
+# usage:
+# source smart-env.sh [arch]
+# example: source smart-env.sh          # arm
+# example: source smart-env.sh aarch64  # aarch64
+
+# supported arch list
+supported_arch="arm aarch64 riscv64 i386"
+
+def_arch="unknown" 
+
+# find arch in arch list
+if [ -z $1 ]
+then
+    def_arch="arm" # default arch is arm
+else
+    for arch in $supported_arch
+    do
+        if [ $arch = $1 ]
+        then
+            def_arch=$arch
+            break
+        fi
+    done
+fi
+
+# set env
+case $def_arch in 
+    "arm")
+        export RTT_CC=gcc
+        export RTT_EXEC_PATH=$(pwd)/tools/gnu_gcc/arm-linux-musleabi_for_x86_64-pc-linux-gnu/bin
+        export RTT_CC_PREFIX=arm-linux-musleabi-
+        ;;
+    "aarch64")
+        export RTT_CC=gcc
+        export RTT_EXEC_PATH=$(pwd)/tools/gnu_gcc/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
+        export RTT_CC_PREFIX=aarch64-linux-musleabi-
+        ;;
+    "riscv64")
+        export RTT_CC=gcc
+        export RTT_EXEC_PATH=$(pwd)/tools/gnu_gcc/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
+        export RTT_CC_PREFIX=riscv64-unknown-linux-musl-
+        ;;
+    "i386")
+        export RTT_CC=gcc
+        export RTT_EXEC_PATH=$(pwd)/tools/gnu_gcc/i386-linux-musleabi_for_x86_64-pc-linux-gnu/bin
+        export RTT_CC_PREFIX=i386-unknown-linux-musl-
+        ;;
+    *)  echo "unknown arch!"
+        return 1
+esac
+
+# export RTT_EXEC_PATH
+export PATH=$PATH:$RTT_EXEC_PATH
+
+echo "Arch      => ${def_arch}"
+echo "CC        => ${RTT_CC}"
+echo "PREFIX    => ${RTT_CC_PREFIX}"
+echo "EXEC_PATH => ${RTT_EXEC_PATH}"

+ 181 - 0
bsp/d1-allwinner-nezha/tools/ci.py

@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Copyright (c) 2022, RT-Thread Development Team
+#
+# SPDX-License-Identifier: GPL-2.0
+#
+# Change Logs:
+# Date           Author       Notes
+# 2022-02-1      Bernard      The first version
+#
+
+import os
+import sys
+import shutil
+import platform
+import requests
+import time
+import zipfile
+
+class CI:
+    def downloadFile(self, name, url):
+        headers = {'Proxy-Connection':'keep-alive'}
+        r = requests.get(url, stream=True, headers=headers)
+        length = float(r.headers['content-length'])
+        f = open(name, 'wb')
+        count = 0
+        count_tmp = 0
+        time1 = time.time()
+        for chunk in r.iter_content(chunk_size = 512):
+            if chunk:
+                f.write(chunk)
+                count += len(chunk)
+                if time.time() - time1 > 2:
+                    p = count / length * 100
+                    speed = (count - count_tmp) / 1024 / 1024 / 2
+                    count_tmp = count
+                    print(name + ': ' + '{:.2f}'.format(p) + '%')
+                    time1 = time.time()
+        print(name + ': 100%')
+        f.close()
+
+    def extractZipFile(self, zfile, folder):
+        # self.delTree(folder)
+        if not os.path.exists(folder):
+            os.makedirs(folder)
+        if platform.system() == 'Windows':
+            zip_file = zipfile.ZipFile(zfile)
+            zip_list = zip_file.namelist()
+            for item in zip_list:
+                print(item)
+                zip_file.extract(item, folder)
+            zip_file.close()
+        elif platform.system() == 'Linux':
+
+            if zfile.endswith('tar.gz'):
+                os.system('tar zxvf %s -C %s' % (zfile, folder))
+            elif zfile.endswith('tar.bz2'):
+                os.system('tar jxvf %s -C %s' % (zfile, folder))
+            elif zfile.endswith('.zip'):
+                os.system('unzip %s -d %s' % (zfile, folder))
+
+        return
+
+    def zipFolder(self, folder, zfile):
+        zip_filename = os.path.join(folder)
+        zip = zipfile.ZipFile(zfile, 'w', compression=zipfile.ZIP_BZIP2)
+        pre_len = len(os.path.dirname(folder))
+
+        for parent, dirnames, filenames in os.walk(folder):
+            for filename in filenames:
+                pathfile = os.path.join(parent, filename)
+                arcname = pathfile[pre_len:].strip(os.path.sep)
+                zip.write(pathfile, arcname)
+
+        zip.close()
+        return
+
+    def touchDir(self, d):
+        if not os.path.exists(d):
+            os.makedirs(d)
+
+    def gitUpdate(self, url, folder, branch = 'master'):
+        cwd = os.getcwd()
+
+        if os.path.exists(folder):
+            os.chdir(folder)
+            os.system('git pull origin')
+            if branch != 'master':
+                os.system('git checkout -b %s origin/%s' % (branch, branch))
+            os.system('git submodule init')
+            os.system('git submodule update')
+        else:
+            os.system('git clone %s %s' % (url, folder))
+            os.chdir(folder)
+            os.system('git submodule init')
+            os.system('git submodule update')
+
+        os.chdir(cwd)
+
+    def installEnv(self, folder):
+        env_path = folder
+
+        cwd = os.getcwd()
+        os.chdir(env_path)
+
+        self.touchDir(os.path.join(env_path, 'local_pkgs'))
+        self.touchDir(os.path.join(env_path, 'packages'))
+        self.touchDir(os.path.join(env_path, 'tools'))
+
+        self.gitUpdate('https://gitee.com/RT-Thread-Mirror/env.git', 'tools/script')
+        self.gitUpdate('https://gitee.com/RT-Thread-Mirror/packages.git', 'packages/packages')
+
+        kconfig = open(os.path.join(env_path, 'packages', 'Kconfig'), 'w')
+        kconfig.write('source "$PKGS_DIR/packages/Kconfig"')
+        kconfig.close()
+
+        os.chdir(cwd)
+
+        return
+
+    def pkgsUpdate(self, env_folder):
+        self.touchDir(env_folder)
+        self.installEnv(env_folder)
+
+        os.environ['PKGS_DIR'] = env_folder
+        os.system('python %s package --update' % (os.path.join(env_folder, 'tools', 'script', 'env.py')))
+
+        return
+
+    def delTree(self, folder):
+        if os.path.exists(folder):
+            shutil.rmtree(folder)
+
+    def delFile(self, file):
+        if os.path.exists(file):
+            os.remove(file)
+
+    def appendFile(self, srcFile, otherFile):
+        f = open(otherFile, 'r')
+        s = f.read()
+        f.close()
+
+        f = open(srcFile, 'a')
+        f.write(s)
+        f.close()
+
+    def copyTree(self, srcTree, dstTree):
+        if os.path.exists(dstTree):
+            shutil.rmtree(dstTree)
+        shutil.copytree(srcTree, dstTree)
+
+    def run(self, cmds):
+        cwd = os.getcwd()
+
+        cmds = cmds.split('\n')
+        for item in cmds:
+            item = item.lstrip()
+            if item == '':
+                continue
+
+            if item[0] == '-':
+                os.system(item[1:].lstrip())
+
+        # keep current directory
+        os.chdir(cwd)
+        return
+
+if __name__ == '__main__':
+    ci = CI()
+    env_folder = os.path.abspath(os.path.join('.', 'env_test'))
+
+    # ci.pkgsUpdate(env_folder)
+    cmds = '''
+        # test
+        - dir
+        - dir tools
+    '''
+
+    ci.run(cmds)

+ 59 - 0
bsp/d1-allwinner-nezha/tools/get_toolchain.py

@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Copyright (c) 2022, RT-Thread Development Team
+#
+# SPDX-License-Identifier: GPL-2.0
+#
+# Change Logs:
+# Date           Author       Notes
+# 2022-02-1      Bernard      The first version
+#
+
+import os
+import sys
+import platform
+
+from ci import CI
+
+toolchains_config = {
+    'arm':
+    {
+        'Linux': 'arm-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2',
+        'Windows': 'arm-linux-musleabi_for_i686-w64-mingw32_latest.zip'
+    },
+    'aarch64':
+    {
+        'Linux' : 'aarch64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2',
+        'Windows' : 'aarch64-linux-musleabi_for_i686-w64-mingw32_latest.zip'
+    },
+    'riscv64': 
+    {
+        'Linux': 'riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2',
+        'Windows': 'riscv64-linux-musleabi_for_i686-w64-mingw32_latest.zip'
+    }
+}
+
+if __name__ == '__main__':
+    # download toolchain
+    if len(sys.argv) > 1:
+        target = sys.argv[1]
+    else:
+        target = 'arm'
+
+    ci = CI()
+    toolchain_path = os.path.join(os.path.abspath('.'), 'gnu_gcc')
+
+    platform = platform.system()
+
+    try:
+        zfile = toolchains_config[target][platform]
+        URL = 'http://117.143.63.254:9012/www/rt-smart/' + zfile
+    except:
+        print('not found target')
+        exit(0)
+
+    ci.downloadFile(zfile, URL)
+    ci.extractZipFile(zfile, toolchain_path)
+    ci.delFile(zfile)

+ 5 - 0
components/lwp/arch/risc-v/rv64/lwp_arch.h

@@ -54,6 +54,11 @@ rt_inline unsigned long ffz(unsigned long x)
     return __builtin_ffs(~x) - 1;
 }
 
+rt_inline void icache_invalid_all(void)
+{
+    //TODO:
+}
+
 #ifdef __cplusplus
 }
 #endif

+ 5 - 0
libcpu/risc-v/t-head/c906/cpuport.c

@@ -120,3 +120,8 @@ int rt_hw_cpu_id(void)
 {
     return 0;   /* d1 has one core */
 }
+
+void set_process_id(int pid)
+{
+    //TODO
+}

+ 28 - 0
libcpu/risc-v/t-head/c906/mmu.c

@@ -22,6 +22,34 @@
 
 void *current_mmu_table = RT_NULL;
 
+static rt_mutex_t mm_lock;
+
+void rt_mm_lock(void)
+{
+    if (rt_thread_self())
+    {
+        if (!mm_lock)
+        {
+            mm_lock = rt_mutex_create("mm_lock", RT_IPC_FLAG_FIFO);
+        }
+        if (mm_lock)
+        {
+            rt_mutex_take(mm_lock, RT_WAITING_FOREVER);
+        }
+    }
+}
+
+void rt_mm_unlock(void)
+{
+    if (rt_thread_self())
+    {
+        if (mm_lock)
+        {
+            rt_mutex_release(mm_lock);
+        }
+    }
+}
+
 static void rt_hw_cpu_tlb_invalidate()
 {
     rt_size_t satpv = read_csr(satp);