Bootstrap

【RDC2022纪念板】RT-Smart D1s上手

环境准备

  • windows电脑(用于烧录固件和串口日志查看)
  • Ubuntu虚拟机(用于编译生成固件)
  • RDC2022纪念板
  • TypeC数据线

开发板硬件介绍

在这里插入图片描述
在这里插入图片描述
开发板使用了全志科技的D1s芯片,全志RISC-V D1s芯片是一款基于RISC-V架构的低功耗、高性能的嵌入式处理器,该芯片主要用于智能家居、智能音箱、智能门锁、智能监控等物联网应用领域,全志RISC-V D1s芯片的主要技术特点包括:

  • 处理器:采用RISC-V架构,主频高达1.5GHz,性能强劲。

  • 显卡:集成Mali400 MP2 GPU,支持OpenGL ES 2.0/1.1、OpenVG 1.1等图形加速技术,能够提供流畅的图像处理和游戏体验。

  • 存储:支持DDR3/DDR3L/LPDDR2/LPDDR3等多种内存类型,最大支持4GB RAM和64GB eMMC存储。

  • 视频:支持1080P H.264/H.265硬解码,能够提供高清视频播放和流畅的视频通话体验。

  • 音频:支持多种音频格式,包括AAC、MP3、WMA、FLAC等,能够提供高品质的音频播放和语音识别体验。

  • 网络:支持多种网络连接方式,包括Wi-Fi、蓝牙、以太网等,能够提供快速、稳定的网络连接。

总之,全志RISC-V D1s芯片是一款功能强大、性能优异的嵌入式处理器,适用于各种物联网应用领域。它能够提供高清视频播放、流畅的游戏体验、高品质的音频播放和语音识别等功能,同时还具有RISC-V架构的优点,如开放、灵活、可扩展等,是物联网应用开发的理想选择。

板载的两个USB-TypeC座子一个是用来烧录,一个用来显示串口日志,由于开发板上已经集成了USB转串口芯片,故可以直接接USB串口。

开发板上的三个按键分别是:

  • FEL 程序下载按键,用来进入烧录状态
  • RST复位按键
  • USR用户按键

开发板贴了一片128Mb的SD card,可以直接烧录固件到这里。

开发环境搭建

  1. 首先下载RT-Smart 用户态应用开发SDK
# git clone https://github.com/RT-Thread/userapps.git
  1. 进入到userapps目录,下载rt-smart源码(目前rt-smart的源码已经合入master仓库,可以直接clone)
userapps# git clone https://github.com/RT-Thread/rt-thread.git
  1. 配置编译工具链,由于D1s是RISCV架构,所以直接用riscv64
root@ubuntu:/home/RDC2022_D1s/userapps# python3 tools/get_toolchain.py riscv64
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 1.66%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 15.74%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 28.31%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 35.43%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 41.75%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 46.03%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 50.80%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 59.79%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 72.06%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 79.57%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 83.99%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 89.86%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 95.91%
riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2: 100%

  1. 刷新环境变量
root@ubuntu:/home/RDC2022_D1s/userapps# source smart-env.sh riscv64
Arch      => riscv64
CC        => gcc
PREFIX    => riscv64-unknown-linux-musl-
EXEC_PATH => /home/RDC2022_D1s/userapps/tools/gnu_gcc/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin

  1. 下载scons,如果已经有scons环境则忽略。
sudo apt install scons
  1. 配置串口
    进入 rt-thread/bsp/allwinner/d1s 目录下
    使用 scons --menuconfig 查看配置。smart 使用的串口为 UART3 ,对应引脚为 PG8 和 PG9。检查 UART3 是否开启,以及引脚是否正确。
    在这里插入图片描述
    在这里插入图片描述
  2. 编译内核源码
root@ubuntu:/home/RDC2022_D1s/userapps/rt-thread/bsp/allwinner/d1s# scons # 直接在d1s目录scons进行编译

在这里插入图片描述
8. 编译app源码
打包用户态程序,需要用到当前目录下的SDCard制作脚本,我们回到userapp目录,然后把这个脚本copy过来

root@ubuntu:/home/RDC2022_D1s/userapps# cp rt-thread/bsp/allwinner/d1s/mksdcard.sh ./mksdcard.sh

然后运行scons,编译用户态代码

root@ubuntu:/home/RDC2022_D1s/userapps# scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
CC apps/webclient/packages/webclient-v2.1.2/src/webclient.o
CC apps/webclient/packages/webclient-v2.1.2/src/webclient_file.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_alias.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_asp.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_auth.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_cgi.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_index.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_ssi.o
CC apps/webserver/packages/webnet-v2.0.2/module/wn_module_upload.o
CC apps/webserver/packages/webnet-v2.0.2/samples/wn_sample.o
CC apps/webserver/packages/webnet-v2.0.2/samples/wn_sample_upload.o
CC apps/webserver/packages/webnet-v2.0.2/src/webnet.o
CC apps/webserver/packages/webnet-v2.0.2/src/wn_mimetype.o
CC apps/webserver/packages/webnet-v2.0.2/src/wn_module.o
CC apps/webserver/packages/webnet-v2.0.2/src/wn_request.o
CC apps/webserver/packages/webnet-v2.0.2/src/wn_session.o
CC apps/webserver/packages/webnet-v2.0.2/src/wn_utils.o
CC build/hello/main.o
CC build/ping/main.o
CC build/pong/main.o
CC build/umailbox/lwp_umailbox.o
CC build/umailbox/umailbox_test.o
CC build/vi/optparse-v1.0.0/optparse.o
CC build/vi/vi.o
CC build/vi/vi_utils.o
CC build/webclient/main.o
CC build/webserver/main.o
LINK root/bin/hello.elf
LINK root/bin/ping.elf
LINK root/bin/pong.elf
LINK root/bin/umailbox.elf
LINK root/bin/vi.elf
LINK root/bin/webclient.elf
LINK root/bin/webserver.elf
scons: done building targets.

编译完成后,运行sdcard.sh脚本来打包用户态代码

root@ubuntu:/home/RDC2022_D1s/userapps# ./mksdcard.sh 
4+0 records in
4+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0160885 s, 261 MB/s
mkfs.fat 4.1 (2017-01-24)
root@ubuntu:/home/RDC2022_D1s/userapps# ls
apps  build  cconfig.h  configs  figures  Kconfig  linker_scripts  mksdcard.sh  prebuilt  README.md  README_ZH.md  root  rtconfig.h  rt-thread  SConstruct  sdk  sdroot.bin  smart-env.bat  smart-env.sh  tools

至此,我们完成了内核源码和用户态源码的编译,主要生成了sd.bin(内核态bin)和sdroot.bin(用户态)两个文件用于烧录。

烧录

  1. 开发板进入烧录状态,首先将TypeC线插到USER那个typeC口,然后按住FEL按键,接着按一下RST按键,让开发板进入烧录模式。第一次进入烧录模式需要安装驱动,如下图所示:
    在这里插入图片描述
  2. 我们找到附件中的Zadig软件,双击打开,他会自动识别未知USB设备,然后点击Install Driver即可。
    在这里插入图片描述
    在这里插入图片描述
  3. 驱动安装成功后,我们就可以使用XFEL软件来烧录了。将之前编译生成的bin文件都放到xfel目录下
PS D:\test\d1s_xfel> ls


    目录: D:\test\d1s_xfel


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          2022/9/8     12:00          49152 boot0_sdcard_sun20iw1p1_f133.bin
-ar---         2023/1/17     10:44         252580 libusb-1.0.dll
-a----          2023/5/5     14:29         799232 sd.bin
-a----          2023/5/5     14:28        4194304 sdroot.bin
-a----          2022/9/7     15:41         267264 xfel.exe
  1. 执行烧录命令来烧录
PS D:\test\d1s_xfel> ./xfel.exe sd write 8192 boot0_sdcard_sun20iw1p1_f133.bin
write 48Kbytes
swap buf:00023E00,len=512, cmdlen=512
Found SD card 126877696 bytes
100% [================================================] 48.000 KB, 179.791 KB/s
PS D:\test\d1s_xfel> ./xfel.exe sd write 57344 sd.bin
align up to 8KB, write 799232 ==> 784Kbytes
swap buf:00023E00,len=512, cmdlen=512
Found SD card 126877696 bytes
100% [================================================] 784.000 KB, 209.118 KB/s
PS D:\test\d1s_xfel> ./xfel.exe sd write 8388608 sdroot.bin
write 4096Kbytes
swap buf:00023E00,len=512, cmdlen=512
Found SD card 126877696 bytes
100% [================================================] 4.000 MB, 213.683 KB/s
  1. 重新将Type C线插到UART口,重新上电后就可以正常打印(500000 N 1),并且也可以正常执行hello world程序
 \ | /
- RT -     Thread Smart Operating System
 / | \     5.0.1 build May  4 2023 03:14:58
 2006 - 2022 Copyright by RT-Thread team
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 0x0000000000004000, size:0x000000000002d000
found part[1], begin: 102760448, size: 23.0MB
found partition:sd1 of mbr at offset 0x0000000000031000, size:0x000000000000b800
hal_sdc_create 1
card_detect insert
Initial card failed!!
[E/drv-sdmmc] init sdmmc failed!
[E/drv-sdmmc] sdmmc_init failed!
[D/FAL] (fal_flash_init:47) Flash device |                  sdcard0 | addr: 0x00000000 | len: 0x07900000 | 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
msh />Mount "sd0p0" on "/" success
Mount "sd0p1" on "/data" fail
hal_sdc_create 1
[os E] OS_MutexCreate():42, handle 0x405263e0
card_detect insert
mmc_send_app_op_cond,109 100
Initial card failed!!
[E/drv-sdmmc] init sdmmc failed!
sdmmc bytes_per_secotr:200, sector count:0
[E/drv-sdmmc] read offset 0 over part sector 0
[E/drv-sdmmc] device read mbr 1-sector failure


msh />ls
Directory /:
hello.elf           255488                   
ping.elf            261272                   
pong.elf            256416                   
umailbox.elf        271608                   
vi.elf              425896                   
webclient.elf       304496                   
webserver.elf       401048                   
msh />./he
msh />./hello.elf
msh />hello world!

msh />

;