环境准备
- 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,可以直接烧录固件到这里。
开发环境搭建
- 首先下载RT-Smart 用户态应用开发SDK
# git clone https://github.com/RT-Thread/userapps.git
- 进入到userapps目录,下载rt-smart源码(目前rt-smart的源码已经合入master仓库,可以直接clone)
userapps# git clone https://github.com/RT-Thread/rt-thread.git
- 配置编译工具链,由于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%
- 刷新环境变量
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
- 下载scons,如果已经有scons环境则忽略。
sudo apt install scons
- 配置串口
进入rt-thread/bsp/allwinner/d1s
目录下
使用scons --menuconfig
查看配置。smart 使用的串口为 UART3 ,对应引脚为 PG8 和 PG9。检查 UART3 是否开启,以及引脚是否正确。
- 编译内核源码
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(用户态)两个文件用于烧录。
烧录
- 开发板进入烧录状态,首先将TypeC线插到USER那个typeC口,然后按住FEL按键,接着按一下RST按键,让开发板进入烧录模式。第一次进入烧录模式需要安装驱动,如下图所示:
- 我们找到附件中的Zadig软件,双击打开,他会自动识别未知USB设备,然后点击Install Driver即可。
- 驱动安装成功后,我们就可以使用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
- 执行烧录命令来烧录
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
- 重新将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 />