diff --git a/bsp/allwinner/d1s/.config b/bsp/allwinner/d1s/.config index 1d1717007ac5b5ac8db1974f38f2192972d50701..713067b44bdf03d5cf3d30140c6a678cdca5cb97 100644 --- a/bsp/allwinner/d1s/.config +++ b/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 # diff --git a/bsp/allwinner/d1s/README-M7.md b/bsp/allwinner/d1s/README-M7.md new file mode 100644 index 0000000000000000000000000000000000000000..659778ded66ea966a9dd32a784d5fd1d7b9db43e --- /dev/null +++ b/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工具连接串口调试。 + + + +#### 驱动安装 + +1. 按住下载模式按钮的情况下为开发板上电。 + +2. 解压tools目录下fel驱动安装.zip文件。参照如下所示的“驱动安装示意图”,安装fel驱动。 + +![1662705678296](figures/fel_driver.png) + +#### 连接串口工具 + +打开 MobaXterm 终端工具,并连接到对应的端口,波特率为:500000。 + +> 注意:如果系统没有固件的话,不会有任何输出,是正常现象。 + +1662708288766 + +#### 制作系统固件 + +参照 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 +data +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 +``` diff --git a/bsp/allwinner/d1s/README-MQ.md b/bsp/allwinner/d1s/README-MQ.md new file mode 100644 index 0000000000000000000000000000000000000000..a6ab259a0f0e4a338510410956169cab8926a277 --- /dev/null +++ b/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! +``` diff --git a/bsp/allwinner/d1s/README.md b/bsp/allwinner/d1s/README.md index b70a0e590300b5aa4b4b42915c7873aca63a05fa..ab1aa971f7af191cefeed1e6bcc3e0de3ee398e1 100644 --- a/bsp/allwinner/d1s/README.md +++ b/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工具连接串口调试。 - - - -#### 驱动安装 - -1. 按住下载模式按钮的情况下为开发板上电。 - -2. 解压tools目录下fel驱动安装.zip文件。参照如下所示的“驱动安装示意图”,安装fel驱动。 - -![1662705678296](figures/fel_driver.png) - -#### 连接串口工具 - -打开 MobaXterm 终端工具,并连接到对应的端口,波特率为:500000。 - -> 注意:如果系统没有固件的话,不会有任何输出,是正常现象。 - -1662708288766 - -#### 制作系统固件 - -参照 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 -data -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) diff --git a/bsp/allwinner/d1s/figures/MQ1.png b/bsp/allwinner/d1s/figures/MQ1.png new file mode 100644 index 0000000000000000000000000000000000000000..c57fb529363d92e15c209c2ee0e068922116062a Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ1.png differ diff --git a/bsp/allwinner/d1s/figures/MQ2.png b/bsp/allwinner/d1s/figures/MQ2.png new file mode 100644 index 0000000000000000000000000000000000000000..3630d2a0b1a4563ee8bc2b9007e84e93dca98901 Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ2.png differ diff --git a/bsp/allwinner/d1s/figures/MQ3.png b/bsp/allwinner/d1s/figures/MQ3.png new file mode 100644 index 0000000000000000000000000000000000000000..2abe3aa1e0fd6159c6c0f43434ffa07f369b2549 Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ3.png differ diff --git a/bsp/allwinner/d1s/figures/MQ4.png b/bsp/allwinner/d1s/figures/MQ4.png new file mode 100644 index 0000000000000000000000000000000000000000..8781e6009fc01f0dfc7496d7e497edccbdae7f79 Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ4.png differ diff --git a/bsp/allwinner/d1s/figures/MQ5.png b/bsp/allwinner/d1s/figures/MQ5.png new file mode 100644 index 0000000000000000000000000000000000000000..954b2baf143a9b0ec5e66b1dc863f499a347ee6d Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ5.png differ diff --git a/bsp/allwinner/d1s/figures/MQ6.png b/bsp/allwinner/d1s/figures/MQ6.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9736f88a259767822e3fbc08b1beb4236c045b Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ6.png differ diff --git a/bsp/allwinner/d1s/figures/MQ7.png b/bsp/allwinner/d1s/figures/MQ7.png new file mode 100644 index 0000000000000000000000000000000000000000..f202be0509e530c80f059357ab5fc54d7bfbf4c2 Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ7.png differ diff --git a/bsp/allwinner/d1s/figures/MQ8.png b/bsp/allwinner/d1s/figures/MQ8.png new file mode 100644 index 0000000000000000000000000000000000000000..bad0297128b0788ea411d4fb2ccf097979e2964b Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ8.png differ diff --git a/bsp/allwinner/d1s/figures/MQ9.png b/bsp/allwinner/d1s/figures/MQ9.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc99fc274e2c3660547bff872b72b39be57fc0e Binary files /dev/null and b/bsp/allwinner/d1s/figures/MQ9.png differ diff --git a/bsp/allwinner/d1s/ports/fal/fal_norflash_sfud_port.c b/bsp/allwinner/d1s/ports/fal/fal_norflash_sfud_port.c index 23caccc8b268075b27f08455a2f9a9ee6b52fa4e..c7dd31a0e4d834c6fb6d0dfd5dce5ba0318bf1c5 100644 --- a/bsp/allwinner/d1s/ports/fal/fal_norflash_sfud_port.c +++ b/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 diff --git a/bsp/allwinner/d1s/ports/fal/fal_sd_sfud_port.c b/bsp/allwinner/d1s/ports/fal/fal_sd_sfud_port.c index 6b7c2b5d5ccbd153986d62fb04087b9ba8ec2d68..c9e1b184bd33a3de393f173dc219ab75ca5f6bd5 100644 --- a/bsp/allwinner/d1s/ports/fal/fal_sd_sfud_port.c +++ b/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 diff --git a/bsp/allwinner/d1s/ports/partition/SConscript b/bsp/allwinner/d1s/ports/partition/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..57f18deef649db51477abe8eafa8de5fa522a407 --- /dev/null +++ b/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') diff --git a/bsp/allwinner/d1s/ports/partition/partition.c b/bsp/allwinner/d1s/ports/partition/partition.c new file mode 100644 index 0000000000000000000000000000000000000000..37e3dbcb7b9986e878071c795de2a79c8a810f10 --- /dev/null +++ b/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 +#include +#include + +#include +#include + +#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; +} diff --git a/bsp/allwinner/d1s/ports/partition/partition.h b/bsp/allwinner/d1s/ports/partition/partition.h new file mode 100644 index 0000000000000000000000000000000000000000..3ed7c3f6458df2169da16beb862c3c3b592fafcf --- /dev/null +++ b/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 diff --git a/bsp/allwinner/d1s/ports/wifi/rw007_pin_port.c b/bsp/allwinner/d1s/ports/wifi/rw007_pin_port.c index 7a825038407262488759a31c90686c4018a57e40..0df06e8893a08c25196336da0443d156da20f1a7 100644 --- a/bsp/allwinner/d1s/ports/wifi/rw007_pin_port.c +++ b/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 diff --git a/bsp/allwinner/f133/sbi.bin b/bsp/allwinner/d1s/sbi.bin similarity index 100% rename from bsp/allwinner/f133/sbi.bin rename to bsp/allwinner/d1s/sbi.bin