Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    RTT D1s RDC2022纪念版开发板开箱使用分享与折腾记录

    MR Series
    5
    5
    2999
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      canxuetian LV 2 last edited by

      1:开发板介绍

      RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板,尺寸仅为5.5cm*4cm,能够已非常小的体积带来舒适的开发感受:

      到手开箱:

      1包装盒.jpg

      包装盒很精致,开发板暂时不用的时候可以放起来。

      2主板正面.jpg

      3主板背面.jpg

      主板正面和背面集成了很多的元件,而且可供用户使用的也不少,以下是部分解析:

      4-正面解析.png

      5-背面解析.png

      全志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纪念版开发板使用了核心板+底板的设计方式,一般核心板使用多层板设计,完成最小系统设计后,底板可以使用双面板设计,这样可以节省制作成本,也方便开发板在项目直接购核心板,自行根据项目需求设计底板,降低了硬件设计的繁琐程度。

      98a06dfd-d182-40f0-8fe8-04ccd626b0e2-image.png

      主供电采用EA3036,提供0.9V, 1.8V, 3.3V三路电源供电,其中0.9V电压为内核电压,1.8V为全志D1S内封的DDR2内存供电,3.3V为外设接口供电。

      a59fcb29-d224-4dbe-a39b-81c0356a0289-image.png

      80601111-d65e-4491-9949-9e62bed79a64-image.png

      3.png
      板载了一颗贴片SD卡,四线SDIO模式,方便量产时直接SMT即可完成贴片,通过丝印查找出其型号为苏州澜智公司推出的1Gb (128MByte) SD NAND,采用SLC,稳定性比普通的TF卡高。

      6-串口原理图.png

      板载的CH340连接到的是D1s的GP8/PG9/USART3引脚,这个有印象即可,其他接口后面使用到的时候再做提及。

      2: RT-Thread smart开发

      RT-Thread smart介绍

      RT-Thread Smart 是基于 RT-Thread 操作系统上的混合操作系统,简称为 rt-smart,它把应用从内核中独立出来,形成独立的用户态应用程序,并具备独立的地址空间(32 位系统上是 4G 的独立地址空间)。

      以下是 rt-smart 的整体结构框图,在硬件平台的基础上通过 MMU、系统调用的方式把整个系统分成了内核态及用户态。

      7-RTT-smart架构.png

      基于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卡中的分区如下图:

      8-emmc_partition.png

      • 从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
      

      结果出现了报错:
      1.png

      打开脚本后,发现是SHELL_FOLDER这个变量获取失败了,他获取的是执行该命令时第一个参数的所在位置。我们这个脚本是通过source命令来执行的。

      SHELL_FOLDER=$(cd $(dirname $0); pwd)
      

      我们可以通过直接硬编码其位置来修复这个问题,就像下图这样:
      9-fix_err.png

      再次执行,没有再出现错误。

      10-fix_err_ok.png

      配置工具链:

      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 
      

      11_enable_uart.png

      然后检查内核是否是使用的uart3

      > RT-Thread Kernel > Kernel Device Object 
      

      12_kernel_uart3.png

      后面我们会需要点亮屏幕,所以在这里提前打开LCD驱动:

      > General Drivers Configuration ─────
      

      12_1_LCD.png

      使用 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.elf
         text    data     bss     dec     hex filename
       879356   60472  274136 1213964  12860c rtthread.elf
      ./mksdimg.sh
      Allwinner TOC1 Image
      Size: 1072640 bytes
      Contents: 3 items
       00000000:00000490 Headers
       00000600:000188e0 => 40000000 opensbi
       00019000:00007475 => 40200000 dtb
       00020600:000e5748 => 40400000 kernel
      scons: done building targets.
      
      

      13-build-kernel.png

      编译用户态程序

      打包用户态程序需要用到当前目录下制作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卡的对应位置。

      14_mkcard_ok.png

      下载烧录

      通过前文的努力,我们已经获得了所需的3个文件,分别是rt-smart提供的SPL,我们自己编译的内核文件和用户态文件,下面我介绍将其下载到开发板上SD卡的方法:

      我们需要使用带数据传输功能的USB-TYPE-C线缆连接开发板的USB接口和电脑。这里有两种方法:

      • 首先按住开发板上的FEL按键,然后插入电脑上电
      • 先把线缆连接好,然后按住FEL按键,点击一次RST按键

      ,默认情况下会出现一个新的USB设备,但是会提示没有驱动。

      15_DRV_1.png

      然后我们需要使用zadig这个软件给该设备强制安装winusb驱动,zadig这个软件在前面的帖子里或者互联网上都可以找到。打开软件后,确认当前显示的设备是Unknown Device #1,然后安装驱动。

      15_DRV_2.png

      15_DRV_3.png

      驱动安装完成之后,我们就可以使用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,len=512, cmdlen=512
      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,len=512, cmdlen=512
      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,len=512, cmdlen=512
      Found SD card 125173760 bytes
      100% [================================================] 8.000 MB, 217.951 KB/s
      

      烧录完成后,我们将串口的USB接口连接到电脑,然后重新上电即可运行。

      串口的软件这里推荐使用mobaXterm,打开软件后, 创建一个新的串口,波特率默认为500000。依次点击以下按钮:

      16_uart_open.png

      然后按下重启键,就可以看到rt-smart系统已经运行起来了。

       \ | /
      - RT -     Thread Smart Operating System
       / | \     5.0.0 build Feb 22 2023 22:26:54
       2006 - 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 fail
      
      
      msh />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 failure
      
      msh />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的文件夹,里面存放的就是用户程序的代码,每个程序以文件夹的形式分开。

      17_userapp_1.png

      默认带的这些程序就是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文件夹:
      18_userapp_2.png

      因为我手上只有一块不支持电容触摸的RGB-LCD屏幕,所以很遗憾,我在这里将lvgldemo 里的auto play打开,达到不需要触屏,自动播放的效果。

      19_userapp_3.png

      然后依然是使用scons编译用户程序,mksdcard.sh打包镜像,重新下载到贴片TF卡中后,即可运行lvgl程序下面是效果演示:

      4-lvg.jpg

      可以看到效果还是很不错的,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

      aldfaaa S 2 Replies Last reply Reply Quote Share 0
      • aldfaaa
        whycan矿工-小叶 LV 7 @canxuetian last edited by

        @canxuetian 参见大佬~~~写得真不错

        1 Reply Last reply Reply Quote Share 0
        • S
          sczh01 LV 3 @canxuetian last edited by xiaowenge

          @canxuetian

          谢谢大佬的分享,我一开始按照淘宝上的地址 https://bbs.aw-ol.com/topic/2905/快来尝鲜-使用-d1s-rdc2022-纪念版-运行-rt-smart?lang=en-US

          上面在烧录boot时没有加sd 所以我烧录后 串口就没有输出了

          在我看到你的如下记录后,发现了如上连接的坑
          烧录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

          但是我用xfel工具,把该工具下缺省的boot/内核重新再烧录一次 任然还是没有任何输出:(刚收到上电后是有输出的)

          (base) PS U:\prj\D1s\D1s_rtt\fw_tool\xfel_v1.2.9> .\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, 144.392 KB/s
          (base) PS U:\prj\D1s\D1s_rtt\fw_tool\xfel_v1.2.9> .\xfel.exe sd write 57344 .\sd.bin
          align up to 8KB, write 7413248 ==> 7240Kbytes
          swap buf:00023E00,len=512, cmdlen=512
          Found SD card 126877696 bytes
          100% [================================================] 7.070 MB, 176.058 KB/s
          (base) PS U:\prj\D1s\D1s_rtt\fw_tool\xfel_v1.2.9> .\xfel.exe sd write 8388608 ..\..\cus\sdroot.bin
          write 4096Kbytes
          swap buf:00023E00,len=512, cmdlen=512
          Found SD card 126877696 bytes
          100% [================================================] 4.000 MB, 171.101 KB/s
          

          a35058f2-1171-4a86-bd81-6f099ce34b18-image.png

          Z 1 Reply Last reply Reply Quote Share 0
          • Z
            zhkag LV 2 @sczh01 last edited by

            @sczh01 需要注意的是,串口有没有配置正确,这里不是正确的话,是不会有输出的
            10cac25e-8efe-4ca1-ae6c-9b4984ec3a18-image.png

            1 Reply Last reply Reply Quote Share 0
            • Referenced by  S sczh01 
            • Referenced by  S sczh01 
            • Referenced by  S sczh01 
            • Referenced by  S sczh01 
            • Referenced by  S sczh01 
            • Referenced by  C cnxiaoma 
            • Referenced by  C cnxiaoma 
            • Referenced by  C cnxiaoma 
            • Q
              qinchangzu LV 3 last edited by

              请问mksdimg.sh的工具mkimage有windows版本的吗

              1 Reply Last reply Reply Quote Share 0
              • 1 / 1
              • First post
                Last post

              Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

              行为准则 | 用户协议 | 隐私权政策