网站基础建设英文翻译,专门做网站的科技公司,少林寺网站谁做的,微信小程序店铺怎么推广原文链接#xff1a;https://bbs.aw-ol.com/topic/3021/ 作者caoxuetian
1#xff1a;开发板介绍
RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板#xff0c;尺寸仅为5.5cm*4cm#xff0c;能够已非常小的体积带来舒适的开发感受#…原文链接https://bbs.aw-ol.com/topic/3021/ 作者caoxuetian
1开发板介绍
RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板尺寸仅为5.5cm*4cm能够已非常小的体积带来舒适的开发感受
到手开箱 包装盒很精致开发板暂时不用的时候可以放起来。 主板正面和背面集成了很多的元件而且可供用户使用的也不少以下是部分解析 全志D1S芯片介绍
全志D1S是由全志公司推出的基于阿里平头哥的C906内核的全新一代应用处理器。
C906兼容RISC-V架构标配内存管理单元可运行Linux等操作系统。C906采用5级整型流水线设计并可选性能优异的单双精度浮点和128位矢量运算单元 适用于消费类IPC、多媒体、消费类电子等应用领域
全志D1s又名 F133它是今年早些时候和支持 Linux 的开发板一起推出的全志D1 RISC-V 处理器的低成本版它和D1的主要区别在于D1s内置的RAM是 64MB DDR2。
芯片框图如下
原理图解析
RTT D1s RDC2022纪念版开发板使用了核心板底板的设计方式一般核心板使用多层板设计完成最小系统设计后底板可以使用双面板设计这样可以节省制作成本也方便开发板在项目直接购核心板自行根据项目需求设计底板降低了硬件设计的繁琐程度。 主供电采用EA3036提供0.9V, 1.8V, 3.3V三路电源供电其中0.9V电压为内核电压1.8V为全志D1S内封的DDR2内存供电3.3V为外设接口供电。 板载了一颗贴片SD卡四线SDIO模式方便量产时直接SMT即可完成贴片通过丝印查找出其型号为苏州澜智公司推出的1Gb (128MByte) SD NAND采用SLC稳定性比普通的TF卡高。 板载的CH340连接到的是D1s的GP8/PG9/USART3引脚这个有印象即可其他接口后面使用到的时候再做提及。
2: RT-Thread smart开发
RT-Thread smart介绍
RT-Thread Smart 是基于 RT-Thread 操作系统上的混合操作系统简称为 rt-smart它把应用从内核中独立出来形成独立的用户态应用程序并具备独立的地址空间32 位系统上是 4G 的独立地址空间。
以下是 rt-smart 的整体结构框图在硬件平台的基础上通过 MMU、系统调用的方式把整个系统分成了内核态及用户态。 基于RTT D1s 开发板运行RT-smart
从上面的架构图中我们可以看出RM-smart层级关系是和linux内核具有一些相似之处的都是分为用户态和内核态我们开发一般也是从这两方面入手。
通过查阅全志D1的用户手册我们可以知道在默认情况下其启动顺序为
SMHC0 - SPI NOR - SPI NAND - SMHC2而RTT D1s开发板上的贴片SD卡连接到的正是SDIO0 (也就是SMHC0)那么我们只要把rt-smart的系统烧录到贴片SD卡里面上电后就能够运行rt-smart操作系统了。
RT-smart操作系统在SD卡中的分区如下图 从0处开始的8KB空间是MBR分区头这是文件系统规定的直接跳过即可。从0x2000开始的是SPL SPL类似于arm 嵌入式开发中常用的uboot主要起到的功能是初始化DDR2从SD卡中把内核或下一阶段的引导程序等复制到DDR2中然后把程序指针指向内存空间中对应的起始地址并运行。从0xE000开始的就是OpenSBI 设备树和RT-smart内核这一段代码会被复制到内存中以内核态运行。从0x800000开始的是用户态程序用户自己编写的程序就下载到这个位置以用户态运行。
内核态与用户态的编译
本段内容主要参考了这篇文章快来尝鲜使用 D1s (RDC2022 纪念版) 运行 RT-Smart
SPL
当前阶段RT-smart的SPL程序尚未开源所以该部分程序我们直接在上面的帖子里翻到最后下载附件里的二进制文件即可。最终SPL程序文件名称为boot0_sdcard_sun20iw1p1_f133.bin
内核程序
开发环境
虚拟机/实体机等方式运行Ubuntu20.04
首先创建一个工作文件夹
mkdir ~/work/rttd1s
cd ~/work/rttd1s然后克隆用户态仓库到该目录:
git clone https://github.com/RT-Thread/userapps.git进入该目录后下载RT-smart内核代码并执行环境变量配置
cd userapps
git clone https://github.com/RT-Thread/rt-thread.git
source smart-env.sh riscv64结果出现了报错
打开脚本后发现是SHELL_FOLDER这个变量获取失败了他获取的是执行该命令时第一个参数的所在位置。我们这个脚本是通过source命令来执行的。
SHELL_FOLDER$(cd $(dirname $0); pwd)我们可以通过直接硬编码其位置来修复这个问题就像下图这样
再次执行没有再出现错误。 配置工具链
python3 tools/get_toolchain.py riscv64编译内核程序
进入 rt-thread/bsp/allwinner/d1s 目录下
使用 scons --menuconfig 查看配置。smart 使用的串口为 UART3 对应引脚为 PG8 和 PG9。检查 UART3 是否开启以及引脚是否正确。 General Drivers Configuration General Purpose UARTs Enable UART3 然后检查内核是否是使用的uart3 RT-Thread Kernel Kernel Device Object 后面我们会需要点亮屏幕所以在这里提前打开LCD驱动 General Drivers Configuration ─────使用 scons 命令编译 内核 编译完内核之后会自动执行打包命令 ./mksdimg.sh 打包出 sd.bin 镜像文件。该文件就是rt-smart系统的内核文件根据上文中描述的那样我们后面就会将其下载到SD卡的对应位置。
......
LINK rtthread.elf
riscv64-unknown-linux-musl-objcopy -O binary rtthread.elf rtthread.bin
riscv64-unknown-linux-musl-size rtthread.elftext data bss dec hex filename879356 60472 274136 1213964 12860c rtthread.elf
./mksdimg.sh
Allwinner TOC1 Image
Size: 1072640 bytes
Contents: 3 items00000000:00000490 Headers00000600:000188e0 40000000 opensbi00019000:00007475 40200000 dtb00020600:000e5748 40400000 kernel
scons: done building targets. 编译用户态程序
打包用户态程序需要用到当前目录下制作SDcard镜像的脚本我们回到userapps主目录然后把脚本复制过去.
cd ~/work/rttd1s/userapps/
cp rt-thread/bsp/allwinner/d1s/mksdcard.sh ./mksdcard.sh在当前目录下执行scons 编译用户态程序当出现提示scons: done building targets后即为编译成功。
$ scons
.....
....
scons: done building targets然后在当前目录下运行mkcard.sh没有提示报错即为成功在当前目录下会生成sdroot.bin这就是我们的用户态镜像我们会将其烧录到sd卡的对应位置。 下载烧录
通过前文的努力我们已经获得了所需的3个文件分别是rt-smart提供的SPL我们自己编译的内核文件和用户态文件下面我介绍将其下载到开发板上SD卡的方法
我们需要使用带数据传输功能的USB-TYPE-C线缆连接开发板的USB接口和电脑。这里有两种方法
首先按住开发板上的FEL按键然后插入电脑上电先把线缆连接好然后按住FEL按键点击一次RST按键
默认情况下会出现一个新的USB设备但是会提示没有驱动。 然后我们需要使用zadig这个软件给该设备强制安装winusb驱动zadig这个软件在前面的帖子里或者互联网上都可以找到。打开软件后确认当前显示的设备是Unknown Device #1然后安装驱动。 驱动安装完成之后我们就可以使用xfel这个软件来下载程序了改软件同样在上面帖子最后的附件里。
烧录的命令有三个分别如下
烧录boot镜像
xfel.exe sd write 8192 boot0_sdcard_sun20iw1p1_f133.bin
烧录内核镜像
xfel.exe sd write 57344 sd.bin
烧录用户态应用
xfel.exe sd write 8388608 sdroot.bin我们把从Ubuntu中编译完的镜像复制到xfel同级目录然后依次运行以上命令即可。命令中的sd write就是指烧录到贴片sd卡里后面的数字是烧录的起始地址就对应着SPL 内核和用户态程序的起始地址。
PS E:\MP\RTT-D1S\RDC资料\出厂固件工具 ./xfel.exe sd write 8192 boot0_sdcard_sun20iw1p1_f133.bin
write 48Kbytes
swap buf:00023E00,len512, cmdlen512
Found SD card 125173760 bytes
100% [] 48.000 KB, 226.353 KB/s
PS E:\MP\RTT-D1S\RDC资料\出厂固件工具 ./xfel.exe sd write 57344 sd.bin
align up to 8KB, write 1072640 1048Kbytes
swap buf:00023E00,len512, cmdlen512
Found SD card 125173760 bytes
100% [] 1.023 MB, 218.882 KB/s
PS E:\MP\RTT-D1S\RDC资料\出厂固件工具 ./xfel.exe sd write 8388608 sdroot.bin
write 8192Kbytes
swap buf:00023E00,len512, cmdlen512
Found SD card 125173760 bytes
100% [] 8.000 MB, 217.951 KB/s烧录完成后我们将串口的USB接口连接到电脑然后重新上电即可运行。
串口的软件这里推荐使用mobaXterm打开软件后 创建一个新的串口波特率默认为500000。依次点击以下按钮 然后按下重启键就可以看到rt-smart系统已经运行起来了。 \ | /
- RT - Thread Smart Operating System/ | \ 5.0.0 build Feb 22 2023 22:26:542006 - 2022 Copyright by RT-Thread team
hal_sdc_create 0
card_detect insert
Initial card success. capacity :60014MB
sdmmc bytes_per_secotr:200, sector count:7537400
found part[0], begin: 8388608, size: 58.614GB
found partition:sd0 of mbr at offset 0x0000000000004000, size:0x0000000007533400
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: 0xa6e80000 | 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 failmsh /Mount sd0p0 on / success
hal_sdc_create 1
[os E] OS_MutexCreate():42, handle 0x4056e348
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 failuremsh /ls bin/
Directory bin/:
hello.elf 341224
ping.elf 347336
pong.elf 342160
umailbox.elf 357440
vi.elf 517464
webclient.elf 393032
webserver.elf 489416
msh /而RT-smart的msh就类似于linux里的shell,使用ls命令是查看文件 用户态程序存放在bin文件夹下。
用户程序开发
RT-smart的用户态程序是和内核分离的我们在userapps文件夹下可以看到一个叫做apps的文件夹里面存放的就是用户程序的代码每个程序以文件夹的形式分开。 默认带的这些程序就是rt-smart自带的示例用于演示相关api的使用。
比如这里的hello程序执行后功能就是在控制台打印出一行hello, world!\n。
我们需要开发任何用户程序都是按照类似的流程做的。
我们在msh里运行bin/hello查看一下效果
msh /bin/hello.elf
msh /hello world!如果我们要创建新的程序就复制hello程序目录到当前文件夹然后在此基础上进行开发程序写完后依然是使用scons命令完成编译mksdcard.sh打包镜像即可
运行lvgl
在rt-smart上运行lvgl也很方便而且得益于rt-smart的内核态与用户态分离我们可以很方便的借zhao鉴chao大佬们之前的研究成果。
这里非常感谢网友Rb君的努力他的工作如下
丝滑的在RT-Smart用户态运行LVGL
https://club.rt-thread.org/ask/article/e8bc90918bd055eb.html具体的原理我这里不再赘述大家可以进他的帖子看看我这里给出最快速的体验方法
首先克隆 lvgl用户态程序
mkdir git_projs
cd git_projs/
git clone https://github.com/Rbb666/RT-Smart-UserAPP.git
cd .. # 回到userapps目录
cp -r git_projs/RT-Smart-UserAPP/userapps/media/ ./ # 复制media文件夹到我们的userapps然后我们需要修改scons的编译脚本这里用任何喜欢的编辑器打开userapps目录下的SConstruct文件翻到最后添加一行编译media文件夹
因为我手上只有一块不支持电容触摸的RGB-LCD屏幕所以很遗憾我在这里将lvgldemo 里的auto play打开达到不需要触屏自动播放的效果。 然后依然是使用scons编译用户程序mksdcard.sh打包镜像重新下载到贴片TF卡中后即可运行lvgl程序下面是效果演示 可以看到效果还是很不错的480*272分辨率的屏幕能够达到60fps.
3: 感想
RISCV内核是一种全新开放指令集risc核心打断了之前arm内核在相关领域内的垄断低位几年内就推出了应用处理器级别的SOC具有强大的性能而且开发方式和之前基于arm的开发基本没有什么区别。
RT-smart操作系统其实我之前并未怎么了解只知道是一种用于应用处理器带MMU的实时操作系统。
经过实际使用下来我感觉用起来还是很舒服的有别于linux其具有启动快中断快等优点arm-linux启动一般都需要数十秒rt-smart可能只需要1秒
使用scons开发这一点也有别于linux的那一套makefile。需要一定的学习过程。
但是最大的问题是相关的文档还是太缺少了光是对rt-smart这一套概念的理解就花了不少的时间希望国内厂商以后还是能够在文档相关的工作做的更好。
4 感谢
快来尝鲜使用 D1s (RDC2022 纪念版) 运行 RT-Smart
丝滑的在RT-Smart用户态运行LVGL