Browse Source

!603 添加D1S相关README
Merge pull request !603 from Rb/d1s

bernard 2 years ago
parent
commit
c3694ad6e2

+ 6 - 46
bsp/allwinner/d1s/.config

@@ -194,11 +194,12 @@ CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_COUNT=2
 CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048
 # CONFIG_RT_USING_SENSOR is not set
 CONFIG_RT_USING_TOUCH=y
-CONFIG_RT_TOUCH_PIN_IRQ=y
+# CONFIG_RT_TOUCH_PIN_IRQ 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_DEV_BUS=y
 CONFIG_RT_USING_WIFI=y
 CONFIG_RT_WLAN_DEVICE_STA_NAME="wlan0"
 CONFIG_RT_WLAN_DEVICE_AP_NAME="wlan1"
@@ -411,18 +412,7 @@ CONFIG_RT_LWP_SHM_MAX_NR=64
 # Wiced WiFi
 #
 # CONFIG_PKG_USING_WLAN_WICED is not set
-CONFIG_PKG_USING_RW007=y
-CONFIG_PKG_RW007_PATH="/packages/iot/WiFi/rw007"
-CONFIG_PKG_USING_RW007_V201=y
-# CONFIG_PKG_USING_RW007_V200 is not set
-# CONFIG_PKG_USING_RW007_V111 is not set
-# CONFIG_PKG_USING_RW007_V110 is not set
-# CONFIG_PKG_USING_RW007_V100 is not set
-# CONFIG_PKG_USING_RW007_LATEST_VERSION is not set
-CONFIG_PKG_RW007_VER="v2.0.1"
-CONFIG_RW007_NOT_USE_EXAMPLE_DRIVERS=y
-# CONFIG_RW007_USING_STM32_DRIVERS is not set
-CONFIG_RW007_SPI_MAX_HZ=25000000
+# CONFIG_PKG_USING_RW007 is not set
 # CONFIG_PKG_USING_COAP is not set
 # CONFIG_PKG_USING_NOPOLL is not set
 # CONFIG_PKG_USING_NETUTILS is not set
@@ -511,9 +501,6 @@ CONFIG_RW007_SPI_MAX_HZ=25000000
 #
 # CONFIG_PKG_USING_SIMPLE_XML is not set
 # CONFIG_PKG_USING_EZXML is not set
-# CONFIG_PKG_USING_EZXML_LATEST_VERSION is not set
-# CONFIG_PKG_USING_EZXML_V0681 is not set
-# CONFIG_PKG_USING_EZXML_V068 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
@@ -648,9 +635,7 @@ CONFIG_RW007_SPI_MAX_HZ=25000000
 # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set
 # CONFIG_PKG_USING_CAIRO is not set
 # CONFIG_PKG_USING_PIXMAN is not set
-CONFIG_PKG_USING_PARTITION=y
-CONFIG_PKG_PARTITION_PATH="/packages/system/partition"
-CONFIG_PKG_PARTITION_VER="v1.0.1"
+# CONFIG_PKG_USING_PARTITION 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
@@ -677,33 +662,7 @@ CONFIG_PKG_PARTITION_VER="v1.0.1"
 # CONFIG_PKG_USING_ARM_2D is not set
 # CONFIG_PKG_USING_MCUBOOT is not set
 # CONFIG_PKG_USING_TINYUSB is not set
-CONFIG_PKG_USING_CHERRYUSB=y
-CONFIG_PKG_CHERRYUSB_DEVICE=y
-# CONFIG_PKG_CHERRYUSB_DEVICE_FS is not set
-CONFIG_PKG_CHERRYUSB_DEVICE_HS=y
-# CONFIG_PKG_CHERRYUSB_DEVICE_BL is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_CH32 is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_FSDEV is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_DWC2 is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_MM32 is not set
-CONFIG_PKG_CHERRYUSB_DEVICE_MUSB=y
-# CONFIG_PKG_CHERRYUSB_DEVICE_NUVOTON is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_IMXRT is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_MUSB_MSP432 is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_MUSB_ES32F3 is not set
-CONFIG_PKG_CHERRYUSB_DEVICE_MUSB_SUNXI=y
-# CONFIG_PKG_CHERRYUSB_DEVICE_CDC is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_HID is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_MSC is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_AUDIO is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_VIDEO is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_RNDIS is not set
-# CONFIG_PKG_CHERRYUSB_DEVICE_DFU is not set
-# CONFIG_PKG_CHERRYUSB_DEVIEC_HUB is not set
-# CONFIG_PKG_CHERRYUSB_HOST is not set
-CONFIG_PKG_CHERRYUSB_PATH="/packages/system/CherryUSB"
-CONFIG_PKG_USING_CHERRYUSB_LATEST_VERSION=y
-CONFIG_PKG_CHERRYUSB_VER="latest"
+# 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
@@ -937,6 +896,7 @@ CONFIG_UART0_RX_USING_GPIOE3=y
 CONFIG_BSP_USING_SDMMC=y
 CONFIG_SD_CARD_CHECK=y
 CONFIG_BSP_USING_FS=y
+# CONFIG_BSP_USING_G2D is not set
 # CONFIG_BSP_USING_LCD is not set
 
 #

+ 283 - 0
bsp/allwinner/d1s/README-M7.md

@@ -0,0 +1,283 @@
+# 基于柿饼M7运行 RT-Smart
+
+## 准备工作
+
+#### 开发环境
+
+推荐使用 ubuntu20.04(虚拟机/docker/服务器) + Window10/11
+
+- ubuntu:用于编译、开发、打包镜像
+- windows:用于下载打包好的镜像
+
+#### 常用工具
+
+**Ubuntu:**
+
+```bash
+sudo apt install libncurses5-dev scons gcc qemu-system
+```
+
+- qemu:用于仿真运行RISC-V程序
+- gcc:用于编译menucofig的程序
+- libncurses5-dev :menucofig功能依赖此库
+- scons:编译RT-Smart需要的构建工具
+
+**Windows:**
+
+- vscode:windows上安装,用于远程连接ubuntu系统,可以在win上体验原生的linux开发环境。
+- MobaXterm:终端工具,可以ssh远程ubuntu系统,也可以通过串口连接柿饼M7模块
+- env_riscv_1.1.3.zip:针对risc-v平台的ENV工具。
+
+#### 相关仓库权限
+
+- https://gitee.com/rtthread/rt-thread :rtthread内核仓库,以submodule的形式存在于rtthread-smart仓库中,这里使用的是rt-smart分支
+
+获取上面的仓库权限,并将rtthread-smart克隆到ubuntu系统目录下。目录结构如下所示:
+
+在做好上面的准备后,就可以真正的开始搭建RT-Smart的开发环境了。
+
+## 模拟仿真环境搭建
+
+在真实的硬件上开发之前,可以先搭建基于QEMU的模拟仿真环境。
+
+参考这篇文章,完成 qemu-riscv64 上 RT-Smart 环境搭建:https://gitee.com/guozhanxin/rtthread-smart/tree/master/docs/risc-v64
+
+最后能够在 qemu-riscv64 上正常运行RT-Smart系统,并运行一个 `hello.elf` 用户态应用。
+
+```
+msh /bin>hello.elf
+msh /bin>hello world!
+```
+
+## 真实硬件环境搭建
+
+#### 硬件连接
+
+按照下图中的连接方式,为开发板供电,并使用USB转TTL工具连接串口调试。
+
+<img src="figures/board.png" style="zoom:50%;" />
+
+#### 驱动安装
+
+1. 按住下载模式按钮的情况下为开发板上电。
+
+2. 解压tools目录下fel驱动安装.zip文件。参照如下所示的“驱动安装示意图”,安装fel驱动。
+
+![1662705678296](figures/fel_driver.png)
+
+#### 连接串口工具
+
+打开 MobaXterm 终端工具,并连接到对应的端口,波特率为:500000。
+
+>  注意:如果系统没有固件的话,不会有任何输出,是正常现象。
+
+<img src="figures/mobaxterm.png" alt="1662708288766" style="zoom: 50%;" />
+
+#### 制作系统固件
+
+参照 qemu-riscv64 上编译内核的步骤,配置环境变量,并使用 scons 命令编译 RT-Smart 内核
+
+编译完内核之后,会自动执行打包命令 `./mksdimg.sh` 打包出sd.bin镜像文件。此文件将在后面的步骤中借助下载工具,下载到 D1s 上运行。
+
+#### 烧录系统内核
+
+我们借助fel工具烧录系统内核。
+
+1. 解压tools目录下的 xfel_v1.2.9.7z 文件,里面包含三个文件
+
+```shell
+boot0_sdcard_sun20iw1p1_f133.bin   ---- 第一次烧录需要烧录此boot文件
+sd.bin                             ---- 打包好的系统内核镜像
+xfel.exe                           ---- 烧录工具
+```
+
+2. 解压tools目录下 env_riscv_1.1.3.zip 文件,打开env工具,并进入解压好的 xfel_v1.2.9 目录下。运行下面的命令烧录系统内核
+
+- 烧录boot镜像: xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin
+- 烧录内核镜像: xfel.exe sd write 57344 sd.bin
+- 复位系统: xfel.exe reset
+
+>  注意:执行烧录命令前,需要使开发板处于fel下载模式(按住下载按钮并上电)
+
+日志如下所示:
+
+```shell
+11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\env_riscv_1.1.3
+> cd E:\workspace\d1s-smart\xfel_v1.2.9
+
+11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
+> xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin
+ERROR: Can't found any FEL device  ----  如果开发板没有处于fel下载模式的话,会提示错误。
+
+## 第一次使用需要先烧录boot镜像文件
+11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
+> xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin
+100% [================================================] 48.000 KB, 364.927 KB/s
+
+## 烧录内核镜像文件
+11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
+> xfel.exe sd write 57344 sd.bin
+write 7240Kbytes
+swap buf:00023E00,len=512, cmdlen=512
+Found SD card 126877696 bytes
+100% [================================================] 7.070 MB, 219.468 KB/s
+
+## 复位系统
+11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
+> xfel.exe reset
+usb bulk recv error
+```
+
+如果此时连接着 MobaXterm 终端工具,可以看到系统以及正常启动,并可以通过 **msh** 命令和系统交互了。
+
+```bash
+[I/I2C] I2C bus [i2c2] registered
+
+ \ | /
+- RT -     Thread Smart Operating System
+ / | \     5.0.0 build Oct 20 2022
+ 2006 - 2020 Copyright by rt-thread team
+lwIP-2.0.2 initialized!
+winusb class register done.
+set samplerate:48000
+set samplebits:16
+set channels:2
+set volume:80%
+hal_sdc_create 0
+card_detect insert
+Initial card success. capacity :121MB
+sdmmc bytes_per_secotr:200, sector count:3c800
+found part[0], begin: 8388608, size: 90.0MB
+found partition:sd0 of mbr at offset 0000000000004000, size:000000000002d000
+found part[1], begin: 102760448, size: 23.0MB
+found partition:sd1 of mbr at offset 0000000000031000, size:000000000000b800
+hal_sdc_create 1
+card_detect insert
+Initial card success. capacity :7624MB
+sdmmc bytes_per_secotr:200, sector count:ee4000
+found part[0], begin: 512, size: 4194303.1023GB
+found partition:sd0 of mbr at offset 0000000000000001, size:ffffffffffffffff
+[I/sal.skt] Socket Abstraction Layer initialize success.
+[D/FAL] (fal_flash_init:47) Flash device |                  sdcard0 | addr: 0x00000000 | len: 0x07900000 | blk_size: 0x00000200 |initialized finish.
+```
+
+#### 运行用户态应用(可选)
+
+在 D1s 上运行系统应用有两种方式:一种是制作 `sdroot.bin` 并借助 `xfel工具` 烧录到 `sdmmc` 对应的位置上;二是使用 romfs 的方式,和内核镜像编译在一起,然后整个的烧录到 `sdmmc` 上。
+
+**1、借助 romfs 运行用户态应用**
+
+romfs 方式优点:打包、调试方便,无需外部 emmc 挂载文件系统,使能 romfs 文件系统即可使用,缺点是 romfs 是只读文件系统。
+
+这部分可以参考 qemu-riscv64 上运行用户态应用的部分。使用 python 命令将 userapps 下 root 目录下的用户态应用打包为  `romfs.c` ,并重新编译系统内核,重复上面的系统内核烧录步骤。最后复位并运行系统。参照下面的运行日志,运行对应的用户态应用。
+
+```bash
+msh />cd bin
+msh /bin>ls
+Directory /bin:
+syslogd.elf         423024
+ping.elf            368104
+webserver.elf       510216
+hello.elf           366096
+em.elf              601336
+pong.elf            367024
+syslog.elf          391128
+vi.elf              528096
+hdc_test.elf        367520
+ntp.elf             392168
+mmapctrl.elf        366992
+pmq.elf             371600
+webclient.elf       413784
+lwIPKit.elf         998504
+msh /bin>hello.elf
+msh /bin>hello world!
+```
+
+**2、在存储设备上运行用户态应用**
+
+sdroot.bin 挂载方式优点:使用 emmc 存储设备的文件系统是可读可写的,更加灵活方便。
+
+首先下载 RT-Smart 用户态应用代码:
+
+```
+git clone https://github.com/RT-Thread/userapps.git
+```
+
+![](figures\MQ1.png)
+
+拷贝之前克隆好的 rtthread rt-smart 分支的仓库到 `userapps` 目录下,进入 `userapps` 目录,使用 scons 编译用户态程序,然后运行 `./mksdcard.sh` 打包脚本,将生成的 `sdroot.bin` 复制到 window 下存在 `xfel.exe ` 的目录下,使用以下命令即可烧录用户态程序到存储设备 :
+
+```bash
+xfel.exe sd write 8388608 sdroot.bin
+```
+
+参照下面的运行日志,运行对应的用户态应用:
+
+```C
+msh />ls
+Directory /:
+bin                 <DIR>
+data                <DIR>
+Directory /bin:
+syslogd.elf         423024
+ping.elf            368104
+webserver.elf       510216
+hello.elf           366096
+em.elf              601336
+pong.elf            367024
+syslog.elf          391128
+vi.elf              528096
+hdc_test.elf        367520
+ntp.elf             392168
+mmapctrl.elf        366992
+pmq.elf             371600
+webclient.elf       413784
+lwIPKit.elf         998504
+msh /bin>hello.elf
+msh /bin>hello world!
+```
+
+## D1S-EMMC 分区示意图
+
+![](figures/emmc_partition.png)
+
+## Q&A
+
+Q:使用 `VSCode` 发现有些已经定义的宏变灰,头文件报错:
+
+A:打开 `VSCode`,按下 “Crtl+Shift+P” 打开 `VSCode` 的控制台,然后输入 “C/C++: **Edit configurations(JSON)** ”,打开 C/C++编辑配置文件,添加如下配置选项
+
+```json
+{
+    "configurations": [
+        {
+            "name": "Linux",
+            "includePath": [
+                "${workspaceFolder}/**",
+                "${workspaceFolder}/bsp/allwinner/d1s",
+                "${workspaceFolder}/include",
+                "${workspaceFolder}/components/drivers/include",
+                "${workspaceFolder}/bsp/allwinner/libraries/sunxi-hal/include"
+            ],
+            "defines": [],
+            "compilerPath": "/usr/bin/gcc",
+            "cStandard": "gnu17",
+            "cppStandard": "gnu++14",
+            "intelliSenseMode": "linux-gcc-x64"
+        }
+    ],
+    "version": 4
+}
+```
+
+---
+
+Q:开机后,出现了 **mount** 失败的错误
+
+![](figures/mount.png)
+
+A:原因是没有下载 all_bin/sdroot.bin(用户态) 固件导致,重新烧录 all_bin/sdroot.bin 到 8388608 地址后,即可 mount 成功,,烧录命令如下:
+
+```bash
+xfel.exe sd write 8388608 all.bin/sdroot.bin
+```

+ 183 - 0
bsp/allwinner/d1s/README-MQ.md

@@ -0,0 +1,183 @@
+# 基于麻雀D1运行 RT-Smart
+
+### 下载代码
+
+下载 RT-Smart 用户态应用代码:
+
+```
+git clone https://github.com/RT-Thread/userapps.git
+```
+
+![](figures/MQ1.png)
+
+进入到 `userapps` 目录,克隆 RT-Thread rt-smart 分支
+
+```shell
+git clone -b rt-smart https://gitee.com/rtthread/rt-thread.git
+```
+
+![](figures/MQ2.png)
+
+### 配置工具链
+
+在 userapps\tools 目录下运行 `get_toolchain.py` 的脚本,会下载对应的工具链并展开到 userapps\tools\gun_gcc 目录。后面的工具链名称可以是 arm | riscv64。
+
+因为 D1S 是 RISCV-64 架构的,所以输入下面的命令:
+
+```
+python3 get_toolchain.py riscv64
+```
+
+在 userapps 目录下,运行 `smart-env.sh` 配置工具链路径,目前支持的参数可以是 arm | riscv64
+
+```
+source smart-env.sh riscv64
+```
+
+![](figures/MQ3.png)
+
+
+### 编译内核程序
+
+进入 `rt-thread/bsp/allwinner/d1s` 目录下,执行以下命令拉取一下软件包
+
+* 注:若系统没有安装 env,需要手动输入 `scons --menuconfig` 命令手动下载 env
+
+```shell
+source ~/.env/env.sh
+pkgs --update
+```
+
+使用 scons 命令进行编译,编译成功后会在 `userapps/rt-thread/bsp/allwinner/d1s` 目录下生成 sd.bin,这个文件就是我们需要烧录到开发板中的文件,它包括了 uboot.dtb,opensbi,rtthread.bin。
+
+### 烧录程序
+
+1、首先准备一张容量在 128G 以内的空白 TF卡
+
+2、使用 fdisk 分区。将 TF卡 挂载到 ubuntu 系统后,使用 df 查看设备路径。笔者使用的 32GB TF卡,扇区大小 512 字节,我们需要预留前 8M 的空间,那么计算得知分区扇区开始于:16384,使用命令:`sudo fdisk /dev/sdb`,选择:o,n,p,1,16384,回车。
+
+```shell
+Command (m for help): o
+Created a new DOS disklabel with disk identifier 0x3668b987.
+
+Command (m for help): n
+Partition type
+   p   primary (0 primary, 0 extended, 4 free)
+   e   extended (container for logical partitions)
+Select (default p): p
+Partition number (1-4, default 1): 1
+First sector (2048-62410751, default 2048): 16384
+Last sector, +sectors or +size{K,M,G,T,P} (16384-62410751, default 62410751): 
+
+Created a new partition 1 of type 'Linux' and of size 29.8 GiB.
+
+Command (m for help): w
+The partition table has been altered.
+```
+
+正确的分区效果如下:
+
+![](figures/MQ5.png)
+
+然后格式化 sdb1 分区为 fat32 格式:
+
+```shell
+$ sudo mkfs -t fat /dev/sdb1
+```
+
+这里可以使用 **Gparted** 工具可视化查看一下分区状况:
+
+![](figures/MQ6.png)
+
+3、接下来使用以下命令烧录 RT-SMART 内核:
+
+```shell
+sudo dd if=boot0_sdcard_sun20iw1p1.bin of=/dev/sdb bs=1024 seek=8
+sudo dd if=sd.bin of=/dev/sdb bs=1024 seek=56
+```
+
+* 注:**boot0_sdcard_sun20iw1p1.bin** 文件在 `userapps/rt-thread/bsp/allwinner/d1s/tools` 路径下
+* 这里的 /dev/sdb 设备要根据自己的选择
+
+下面是烧录成功的显示:
+
+![](figures/MQ7.png)
+
+### 启动 RT-Smart
+
+方式二(TF 卡)启动:
+
+此时将 TF 卡放入开发板,串口0(底部排针的7,8脚),串口波特率 500000,然后上电,如下 RT-Smart 已经成功启动
+
+![](figures/MQ8.png)
+
+```shell
+ \ | /
+- RT -     Thread Smart Operating System
+ / | \     5.0.0 build Nov  1 2022
+ 2006 - 2022 Copyright by rt-thread team
+lwIP-2.0.2 initialized!
+hal_sdc_create 0
+card_detect insert
+Initial card success. capacity :30436MB
+sdmmc bytes_per_secotr:200, sector count:3b72400
+found part[0], begin: 8388608, size: 29.732GB
+found partition:sd0 of mbr at offset 0000000000004000, size:0000000003b6e400
+hal_sdc_create 1
+card_detect insert
+Initial card failed!!
+[E/drv-sdmmc] init sdmmc failed!
+[E/drv-sdmmc] sdmmc_init failed!
+[I/sal.skt] Socket Abstraction Layer initialize success.
+[D/FAL] (fal_flash_init:47) Flash device |                  sdcard0 | addr: 0x00000000 | len: 0x76e480000 | blk_size: 0x00000200 |initialized finish.
+[I/FAL] ==================== FAL partition table ====================
+[I/FAL] | name       | flash_dev |   offset   |    length  |
+[I/FAL] -------------------------------------------------------------
+[I/FAL] | download   | sdcard0   | 0x00800000 | 0x00800000 |
+[I/FAL] | easyflash  | sdcard0   | 0x01000000 | 0x00100000 |
+[I/FAL] | filesystem | sdcard0   | 0x01100000 | 0x00c00000 |
+[I/FAL] =============================================================
+[I/FAL] RT-Thread Flash Abstraction Layer initialize success.
+Hello RISC-V
+[W/DBG] disp:[parser_disp_init_para 575]of_property_read screen1_output_type fail
+msh />Mount "sd0p0" on "/" success
+msh />
+```
+
+### 编译用户态程序
+
+进入 `userapps` 目录下,使用 scons 编译用户态程序,编译好的文件会生成在 `root/bin` 目录下。
+
+![](figures/MQ9.png)
+
+### 运行用户态程序
+
+从 `root/bin` 目录下拷贝出 hello 程序,到 TF卡 的文件系统中。
+
+![](https://oss-club.rt-thread.org/uploads/20221101/f7709c3708b1d45f496e10c040d99f10.png)
+
+拔出 TF 卡,插入到开发板,上电。即可体验属于自己的 helloworld 程序了。
+
+```shell
+msh /bin>ls
+Directory /bin:
+dbkit_client.elf    616960
+elmFATKit.elf       373880
+em.elf              585504
+hdc_test.elf        339976
+hello.elf           339624
+lvgl.elf            1382168
+lwIPKit.elf         976784
+mmapctrl.elf        339976
+ntp.elf             363560
+ping.elf            344208
+pmq.elf             345176
+pong.elf            339624
+syslog.elf          364736
+syslogd.elf         377560
+vi.elf              446568
+webclient.elf       358048
+msh /bin>
+msh /bin>hello.elf
+msh /bin>hello world!
+```

+ 3 - 330
bsp/allwinner/d1s/README.md

@@ -1,331 +1,4 @@
-# 基于柿饼M7(F133)运行 RT-Smart
+# 全志 D1s 运行 RT-Smart
 
-## 准备工作
-
-#### 开发环境
-
-推荐使用 ubuntu20.04(虚拟机/docker/服务器) + Window10/11
-
-- ubuntu:用于编译、开发、打包镜像
-- windows:用于下载打包好的镜像
-
-#### 常用工具
-
-**Ubuntu:**
-
-```bash
-sudo apt install libncurses5-dev scons gcc qemu-system
-```
-
-- qemu:用于仿真运行RISC-V程序
-- gcc:用于编译menucofig的程序
-- libncurses5-dev :menucofig功能依赖此库
-- scons:编译RT-Smart需要的构建工具
-
-**Windows:**
-
-- vscode:windows上安装,用于远程连接ubuntu系统,可以在win上体验原生的linux开发环境。
-- MobaXterm:终端工具,可以ssh远程ubuntu系统,也可以通过串口连接柿饼M7模块
-- env_riscv_1.1.3.zip:针对risc-v平台的ENV工具。
-
-#### 相关仓库权限
-
-- https://gitee.com/rtthread/rt-thread :rtthread内核仓库,以submodule的形式存在于rtthread-smart仓库中,这里使用的是rt-smart分支
-
-获取上面的仓库权限,并将rtthread-smart克隆到ubuntu系统目录下。目录结构如下所示:
-
-在做好上面的准备后,就可以真正的开始搭建RT-Smart的开发环境了。
-
-## 模拟仿真环境搭建
-
-在真实的硬件上开发之前,可以先搭建基于QEMU的模拟仿真环境。
-
-参考这篇文章,完成 qemu-riscv64 上 RT-Smart 环境搭建:https://gitee.com/guozhanxin/rtthread-smart/tree/master/docs/risc-v64
-
-最后能够在 qemu-riscv64 上正常运行RT-Smart系统,并运行一个 `hello.elf` 用户态应用。
-
-```
-msh /bin>hello.elf
-msh /bin>hello world!
-```
-
-## 真实硬件环境搭建
-
-#### 硬件连接
-
-按照下图中的连接方式,为开发板供电,并使用USB转TTL工具连接串口调试。
-
-<img src="figures/board.png" style="zoom:50%;" />
-
-#### 驱动安装
-
-1. 按住下载模式按钮的情况下为开发板上电。
-
-2. 解压tools目录下fel驱动安装.zip文件。参照如下所示的“驱动安装示意图”,安装fel驱动。
-
-![1662705678296](figures/fel_driver.png)
-
-#### 连接串口工具
-
-打开 MobaXterm 终端工具,并连接到对应的端口,波特率为:500000。
-
->  注意:如果系统没有固件的话,不会有任何输出,是正常现象。
-
-<img src="figures/mobaxterm.png" alt="1662708288766" style="zoom: 50%;" />
-
-#### 制作系统固件
-
-参照 qemu-riscv64 上编译内核的步骤,配置环境变量,并使用 scons 命令编译 RT-Smart 内核
-
-```bash
-rb:~/realtouch/kernel/bsp/allwinner/f133$ scons -j12
-scons: Reading SConscript files ...
-scons: done reading SConscript files.
-scons: Building targets ...
-scons: building associated VariantDir targets: build
-CC build/applications/main.o
-CC build/applications/mnt.o
-... ...
-CC /home/blue/work/rtthread-smart/ibsp/libraries/sunxi-hal/hal/source/twi/hal_twi.o
-CC /home/blue/work/rtthread-smart/ibsp/libraries/libos/src/os.o
-LINK rtthread.elf
-riscv64-unknown-linux-musl-objcopy -O binary rtthread.elf rtthread.bin
-riscv64-unknown-linux-musl-size rtthread.elf
-   text    data     bss     dec     hex filename
-7221249   59608  269222 7550079  73347f rtthread.elf
-./mksdimg.sh
-Allwinner TOC1 Image
-Size: 7413760 bytes
-Contents: 3 items
- 00000000:00000490 Headers
- 00000600:000188e0 => 40000000 opensbi
- 00019000:00007475 => 40200000 dtb
- 00020600:006f18f8 => 40400000 kernel
-scons: done building targets.
-```
-
-编译完内核之后,会自动执行打包命令 `./mksdimg.sh` 打包出sd.bin镜像文件。此文件将在后面的步骤中借助下载工具,下载到 F133 上运行。
-
-#### 烧录系统内核
-
-我们借助fel工具烧录系统内核。
-
-1. 解压tools目录下的 xfel_v1.2.9.7z 文件,里面包含三个文件
-
-```shell
-boot0_sdcard_sun20iw1p1_f133.bin   ---- 第一次烧录需要烧录此boot文件
-sd.bin                             ---- 打包好的系统内核镜像
-xfel.exe                           ---- 烧录工具
-```
-
-2. 解压tools目录下 env_riscv_1.1.3.zip 文件,打开env工具,并进入解压好的 xfel_v1.2.9 目录下。运行下面的命令烧录系统内核
-
-- 烧录boot镜像: xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin
-- 烧录内核镜像: xfel.exe sd write 57344 sd.bin
-- 复位系统: xfel.exe reset
-
->  注意:执行烧录命令前,需要使开发板处于fel下载模式(按住下载按钮并上电)
-
-日志如下所示:
-
-```shell
-11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\env_riscv_1.1.3
-> cd E:\workspace\d1s-smart\xfel_v1.2.9
-
-11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
-> xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin
-ERROR: Can't found any FEL device  ----  如果开发板没有处于fel下载模式的话,会提示错误。
-
-## 第一次使用需要先烧录boot镜像文件
-11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
-> xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin
-100% [================================================] 48.000 KB, 364.927 KB/s
-
-## 烧录内核镜像文件
-11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
-> xfel.exe sd write 57344 sd.bin
-write 7240Kbytes
-swap buf:00023E00,len=512, cmdlen=512
-Found SD card 126877696 bytes
-100% [================================================] 7.070 MB, 219.468 KB/s
-
-## 复位系统
-11714@DESKTOP-VEL6MD9 E:\workspace\d1s-smart\xfel_v1.2.9
-> xfel.exe reset
-usb bulk recv error
-```
-
-如果此时连接着 MobaXterm 终端工具,可以看到系统以及正常启动,并可以通过 **msh** 命令和系统交互了。
-
-```bash
-[I/I2C] I2C bus [i2c2] registered
-
- \ | /
-- RT -     Thread Smart Operating System
- / | \     5.0.0 build Oct 20 2022
- 2006 - 2020 Copyright by rt-thread team
-lwIP-2.0.2 initialized!
-winusb class register done.
-set samplerate:48000
-set samplebits:16
-set channels:2
-set volume:80%
-hal_sdc_create 0
-card_detect insert
-Initial card success. capacity :121MB
-sdmmc bytes_per_secotr:200, sector count:3c800
-found part[0], begin: 8388608, size: 90.0MB
-found partition:sd0 of mbr at offset 0000000000004000, size:000000000002d000
-found part[1], begin: 102760448, size: 23.0MB
-found partition:sd1 of mbr at offset 0000000000031000, size:000000000000b800
-hal_sdc_create 1
-card_detect insert
-Initial card success. capacity :7624MB
-sdmmc bytes_per_secotr:200, sector count:ee4000
-found part[0], begin: 512, size: 4194303.1023GB
-found partition:sd0 of mbr at offset 0000000000000001, size:ffffffffffffffff
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[D/FAL] (fal_flash_init:47) Flash device |                  sdcard0 | addr: 0x00000000 | len: 0x07900000 | blk_size: 0x00000200 |initialized finish.
-
-```
-
-#### 运行用户态应用(可选)
-
-在 F133 上运行系统应用有两种方式:一种是制作 `sdroot.bin` 并借助 `xfel工具` 烧录到 `sdmmc` 对应的位置上;二是使用 romfs 的方式,和内核镜像编译在一起,然后整个的烧录到 `sdmmc` 上。
-
-**1、借助 romfs 运行用户态应用**
-
-romfs 方式优点:打包、调试方便,无需外部 emmc 挂载文件系统,使能 romfs 文件系统即可使用,缺点是 romfs 是只读文件系统。
-
-这部分可以参考 qemu-riscv64 上运行用户态应用的部分。使用 python 命令将 userapps 下 root 目录下的用户态应用打包为  `romfs.c` ,并重新编译系统内核,重复上面的系统内核烧录步骤。最后复位并运行系统。参照下面的运行日志,运行对应的用户态应用。
-
-```bash
-msh />cd bin
-msh /bin>ls
-Directory /bin:
-syslogd.elf         423024
-ping.elf            368104
-webserver.elf       510216
-hello.elf           366096
-em.elf              601336
-pong.elf            367024
-syslog.elf          391128
-vi.elf              528096
-hdc_test.elf        367520
-ntp.elf             392168
-mmapctrl.elf        366992
-pmq.elf             371600
-webclient.elf       413784
-lwIPKit.elf         998504
-msh /bin>hello.elf
-msh /bin>hello world!
-```
-
-**2、在存储设备上运行用户态应用**
-
-sdroot.bin 挂载方式优点:使用 emmc 存储设备的文件系统是可读可写的,更加灵活方便。
-
-首先让我们进入 `realtouch/userapps` 目录,使用 scons 编译用户态程序,然后运行 `./mksdcard.sh` 打包脚本,接下来进入 `realtouch/kernel/bsp/allwinner/f133` 目录将 `sdroot.bin` 复制到 window 下存在 `xfel.exe ` 的目录下,使用以下命令即可烧录用户态程序到存储设备 :
-
-```bash
-xfel.exe sd write 8388608 sdroot.bin
-```
-
-参照下面的运行日志,运行对应的用户态应用:
-
-```C
-msh />ls
-Directory /:
-bin                 <DIR>
-data                <DIR>
-Directory /bin:
-syslogd.elf         423024
-ping.elf            368104
-webserver.elf       510216
-hello.elf           366096
-em.elf              601336
-pong.elf            367024
-syslog.elf          391128
-vi.elf              528096
-hdc_test.elf        367520
-ntp.elf             392168
-mmapctrl.elf        366992
-pmq.elf             371600
-webclient.elf       413784
-lwIPKit.elf         998504
-msh /bin>hello.elf
-msh /bin>hello world!
-```
-
-## F133-DDR 分布示意图
-
-![](figures/ddr_partition.png)
-
-## F133-EMMC 分区示意图
-
-![](figures/emmc_partition.png)
-
-## Q&A
-
-Q:使用 `VSCode` 发现有些已经定义的宏变灰,头文件报错:
-
-A:打开 `VSCode`,按下 “Crtl+Shift+P” 打开 `VSCode` 的控制台,然后输入 “C/C++: **Edit configurations(JSON)** ”,打开 C/C++编辑配置文件,添加如下配置选项
-
-```json
-{
-    "configurations": [
-        {
-            "name": "Linux",
-            "includePath": [
-                "${workspaceFolder}/**",
-                "${workspaceFolder}/bsp/allwinner/f133",
-                "${workspaceFolder}/include",
-                "${workspaceFolder}/components/drivers/include",
-                "${workspaceFolder}/bsp/allwinner/libraries/sunxi-hal/include"
-            ],
-            "defines": [],
-            "compilerPath": "/usr/bin/gcc",
-            "cStandard": "gnu17",
-            "cppStandard": "gnu++14",
-            "intelliSenseMode": "linux-gcc-x64"
-        }
-    ],
-    "version": 4
-}
-```
-
----
-
-Q:添加 RW007 后开机崩溃,断言在 **rt_thread_resume()**
-
-A:增大 **tcpip** 线程堆栈(原 1k,到 8K),使用 `menuconfig` 配置如图:
-
-![](figures/lwip.png)
-
----
-
-Q:在 wifi join AP 热点之后,无法执行用户态程序,提示 **command not found.**
-
-A:原因:sys_work 线程出现满栈,**RT_SYSTEM_WORKQUEUE_STACKSIZE** 栈大小增大至 4k 后解决。
-
-![](figures/user_app.png)
-
----
-
-Q:在 **EMMC** 初始化分区时遇到了卡死情况
-
-![](figures/error_name.png)
-
-A:原因是软件包 **partition-v1.0.1/partition.h** 中 struct rt_partition 结构体成员 name 问题,改成 char name[8] 即可
-
----
-
-Q:开机后,出现了 **mount** 失败的错误
-
-![](figures/mount.png)
-
-A:原因是没有下载 all_bin/sdroot.bin(用户态) 固件导致,重新烧录 all_bin/sdroot.bin 到 8388608 地址后,即可 mount 成功,,烧录命令如下:
-
-```bash
-xfel.exe sd write 8388608 all.bin/sdroot.bin
-```
+* [基于柿饼M7运行 RT-Smart](./README-M7.md)
+* [基于麻雀MQ运行 RT-Smart](./README-MQ.md)

BIN
bsp/allwinner/d1s/figures/MQ1.png


BIN
bsp/allwinner/d1s/figures/MQ2.png


BIN
bsp/allwinner/d1s/figures/MQ3.png


BIN
bsp/allwinner/d1s/figures/MQ4.png


BIN
bsp/allwinner/d1s/figures/MQ5.png


BIN
bsp/allwinner/d1s/figures/MQ6.png


BIN
bsp/allwinner/d1s/figures/MQ7.png


BIN
bsp/allwinner/d1s/figures/MQ8.png


BIN
bsp/allwinner/d1s/figures/MQ9.png


+ 4 - 2
bsp/allwinner/d1s/ports/fal/fal_norflash_sfud_port.c

@@ -1,6 +1,8 @@
 /*
- * COPYRIGHT (C) 2012-2022, Shanghai Real-Thread Technology Co., Ltd
- * All rights reserved.
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
  * Change Logs:
  * Date           Author       Notes
  * 2018-01-26     RT-Thread    the first version

+ 3 - 2
bsp/allwinner/d1s/ports/fal/fal_sd_sfud_port.c

@@ -1,6 +1,7 @@
 /*
- * File      : fal_flash_sfud_port.c
- * COPYRIGHT (C) 2012-2022, Shanghai Real-Thread Technology Co., Ltd
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date           Author       Notes

+ 11 - 0
bsp/allwinner/d1s/ports/partition/SConscript

@@ -0,0 +1,11 @@
+from building import *
+import rtconfig
+
+cwd = GetCurrentDir()
+
+src = Glob('*.c')
+CPPPATH = [cwd]
+
+group = DefineGroup('partition', src, depend = ['BSP_USING_SDMMC'], CPPPATH = CPPPATH)
+
+Return('group')

+ 167 - 0
bsp/allwinner/d1s/ports/partition/partition.c

@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2016-09-20     Bernard      the first version
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#include "partition.h"
+
+// #define PARTITION_DEBUG
+
+#ifdef PARTITION_DEBUG
+#define DEBUG_TRACE         rt_kprintf("[part] "); rt_kprintf
+#else
+#define DEBUG_TRACE(...)
+#endif
+
+struct partition_device
+{
+    struct rt_device parent;            /* parent block device */
+
+    int sector_size;
+    int block_size;
+
+    struct rt_device *block_device;
+    const struct rt_partition *partition;
+};
+
+/* RT-Thread device interface */
+static rt_err_t partition_init(rt_device_t dev)
+{
+    return RT_EOK;
+}
+
+static rt_err_t partition_open(rt_device_t dev, rt_uint16_t oflag)
+{
+    return RT_EOK;
+}
+
+static rt_err_t partition_close(rt_device_t dev)
+{
+    return RT_EOK;
+}
+
+#if RTTHREAD_VERSION >= 30000
+static rt_err_t partition_control(rt_device_t dev, int cmd, void *args)
+#else
+static rt_err_t partition_control(rt_device_t dev, rt_uint8_t cmd, void *args)
+#endif
+{
+    struct partition_device *part;
+
+    part = (struct partition_device*) dev;
+    RT_ASSERT(part != RT_NULL);
+
+    if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME)
+    {
+        struct rt_device_blk_geometry *geometry;
+
+        geometry = (struct rt_device_blk_geometry *)args;
+        if (geometry == RT_NULL) return -RT_ERROR;
+
+        geometry->bytes_per_sector = part->sector_size;
+        geometry->sector_count = part->partition->size / part->sector_size;
+        geometry->block_size = part->block_size;
+    }
+
+    return RT_EOK;
+}
+
+static rt_size_t partition_read(rt_device_t dev,
+                                   rt_off_t pos,
+                                   void* buffer,
+                                   rt_size_t size)
+{
+    struct partition_device *part;
+
+    part = (struct partition_device*) dev;
+    RT_ASSERT(part != RT_NULL);
+
+    DEBUG_TRACE("read block: %d, size=%d\n", pos + part->partition->offset/part->sector_size, size);
+
+    return rt_device_read(part->block_device, pos + part->partition->offset/part->sector_size, buffer, size);
+}
+
+static rt_size_t partition_write(rt_device_t dev,
+                                    rt_off_t pos,
+                                    const void* buffer,
+                                    rt_size_t size)
+{
+    struct partition_device *part;
+
+    part = (struct partition_device*) dev;
+    RT_ASSERT(part != RT_NULL);
+
+    if (part->partition->flags & PARTITION_WRITEABLE)
+    {
+        DEBUG_TRACE("write block: %d, size=%d\n", pos + part->partition->offset/part->sector_size, size);
+
+        return rt_device_write(part->block_device, pos + part->partition->offset/part->sector_size,
+                buffer, size);
+    }
+
+    DEBUG_TRACE("read-only partition!\n");
+    return 0;
+}
+
+int rt_partition_init(const char* flash_device, const struct rt_partition* parts, rt_size_t num)
+{
+    struct rt_device *device;
+    struct partition_device *part_dev;
+    const struct rt_partition* part;
+    struct rt_device_blk_geometry geometry;
+
+    device = (struct rt_device *)rt_device_find(flash_device);
+    if(device == RT_NULL)
+    {
+        DEBUG_TRACE("block device %s not found!\r\n", flash_device);
+        return -RT_ENOSYS;
+    }
+
+    /* open the block device */
+    rt_device_open(device, RT_DEVICE_OFLAG_RDWR);
+    /* get block device geometry */
+    rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
+
+    /* create each partition device */
+    while(num --)
+    {
+        part = parts ++;
+        part_dev = (struct partition_device*)rt_malloc (sizeof(struct partition_device));
+        if (part_dev)
+        {
+            part_dev->block_device = device;
+            part_dev->partition = part;
+            part_dev->sector_size = geometry.bytes_per_sector;
+            part_dev->block_size  = geometry.block_size;
+
+            /* register device */
+            part_dev->parent.type    = RT_Device_Class_Block;
+            part_dev->parent.init    = partition_init;
+            part_dev->parent.open    = partition_open;
+            part_dev->parent.close   = partition_close;
+            part_dev->parent.read    = partition_read;
+            part_dev->parent.write   = partition_write;
+            part_dev->parent.control = partition_control;
+            /* no private */
+            part_dev->parent.user_data = RT_NULL;
+
+            DEBUG_TRACE("add partition: %s\n", part->name);
+            rt_device_register(RT_DEVICE(part_dev), part->name,
+                               RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
+        }
+    }
+
+    return RT_EOK;
+}

+ 30 - 0
bsp/allwinner/d1s/ports/partition/partition.h

@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2016-09-20     Bernard      the first version
+ */
+
+#ifndef PARTITION_H__
+#define PARTITION_H__
+
+#define PARTITION_RDONLY          0x000
+#define PARTITION_WRITEABLE       0x100     /* Device is writable */
+#define PARTITION_POWERUP_LOCK    0x200     /* Always locked after reset */
+
+struct rt_partition
+{
+    char name[8];
+
+    rt_uint32_t offset;
+    rt_uint32_t size;
+
+    rt_uint32_t flags;
+};
+
+int rt_partition_init(const char* flash_device, const struct rt_partition* parts, rt_size_t num);
+
+#endif

+ 4 - 2
bsp/allwinner/d1s/ports/wifi/rw007_pin_port.c

@@ -1,6 +1,8 @@
 /*
- * COPYRIGHT (C) 2012-2022, Shanghai Real-Thread Technology Co., Ltd
- * All rights reserved.
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
  * Change Logs:
  * Date           Author       Notes
  * 2018-12-04     RT-Thread    the first version

+ 0 - 0
bsp/allwinner/f133/sbi.bin → bsp/allwinner/d1s/sbi.bin