Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页
    1. Home
    2. xiaowenge
    • Profile
    • Following 0
    • Followers 18
    • my integral 14842
    • Topics 65
    • Posts 722
    • Best 38
    • Groups 1

    DOT小文哥LV 8

    @xiaowenge

    已帮助超过1000位开发者学会烧固件

    14842
    integral
    46
    Reputation
    303
    Profile views
    722
    Posts
    18
    Followers
    0
    Following
    Joined Last Online

    xiaowenge Unfollow Follow
    Global Moderator

    Best posts made by xiaowenge

    • 我的D1s哪吒开发板到货啦

      我的D1s哪吒开发板到货啦
      d2550ee8-5123-4296-9e21-7453b7af1956-image.png

      楼下抽一个小可爱送哪吒的帽子

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • Reply: 请问 PhoenixCard 烧卡软件的 【量产卡】与 【启动卡】菜单有什么区别呢?

      这个应该是以前平板时代留下来的产物。
      总所周知,全志以前是做平板起家的。
      做平板的时候,因为板子上本来就有emmc,量产卡就是把卡插进去,固件会自己烧到emmc上,然后再把量产卡拔出来,再启动的时候就用emmc上的固件启动,这张“量产卡”就可以用来烧下一台设备了。
      启动卡就是插进去不动了,不会把固件移到emmc上,一直用这张启动卡启动,要是卡被拔出来了,就相当于 是板子没有系统了,就是一块砖头。

      posted in 编译和烧写问题专区
      xiaowenge
      DOT小文哥
    • Reply: 【XR806鸿蒙开发实战1】实操下载XR806鸿蒙代码并编译烧写

      编译lib完成后回到源码的根目录,完整编译

      编译配置

      hb set
      

      这里可能要多敲一次回车才会出来这个选项框
      90c6c2f3-2437-412b-9e43-d9a8d3fec72c-image.png
      选择wifi_skylake

      编译

      hb build -f
      

      编译完成后生成的固件在路径xr806_openharmony2/device/xradio/xr806/xr_skylark/out 下:
      96a25ae3-7a1e-4bf6-a7f2-8f0aa55532ad-image.png

      将 xr_system.img 烧写到设备中即可

      posted in XR系列-无线互联
      xiaowenge
      DOT小文哥
    • 【深度剖析】小米CyberDog四足机器人的AI运动系统的实现

      2021年8月10日,雷军进行继宣布造车之后的第二次演讲。

      在这场以“我的梦想,我的选择”为主题的演讲上,雷军详细讲述了创业后的故事,发布了一系列全新产品。其中,给人最大惊喜同时也给人带来诸多疑问的就是我们这篇推文的主角——“CyberDog”,中文名 “铁蛋”。

      在现场的展示中,这只 “人类高质量宠物” 可以行走、站立、小碎步跳舞等等。

      5.gif

      CyberDog拜年

      6.gif

      CyberDog行走

      在官方给出的运动性能参数中,介绍到,除了这些,CyberDog还支持恢复站立、姿态展示、缓慢趴下、缓跑、小跑、奔跑、跳跑、跳跃、倒地恢复、打滚、握手、跳舞、转圈、作揖、坐下等一系列功能动作。

      e32b732c-bc3a-472e-a8d3-104c1683d8d8-image.png

      此物一出,各大论坛上也是众说纷纭,有人惊叹于他的外观,有人惊叹于他的智能,也有人惊叹于他在不同指令下不同行为的体现。 可是这只全新的物种,到底是如何做到这些复杂的动作的?它的出现,又能为人类做些什么呢? 相信绝大多数人看到这只机器狗的第一反应都如下面的表情包一样,“我不理解”。

      8adc32ca-0877-49dd-b6c2-5f8f29b90429-image.png

      这只看起来像小狗的机器人其实是当前业内备受关注的新产品形态—— 仿生四足机器人 。CyberDog全身拥有11组高精度传感器时刻待命,可主动探测外部细微变化,它搭载了AI超级计算机——NVIDIA JETSON XAVIER NX平台,可处理来自多个传感器的海量数据。于此同时,CyberDog使用了自研的高性能伺服电机,通过全志MR813芯片对全身的运动模块进行控制。

      如果把传感器组比作CyberDog的“眼睛”,那NVIDIA JETSON XAVIER NX就是它的“大脑”,伺服电机就是它的“肌肉”,Allwinner MR813就是“小脑”。

      下面就来了解一下铁蛋的各个 “器官” 是如何组成它的运动系统的。

      #01

      大脑-英伟达主控

      CyberDog 的“大脑”是英伟达的 Jetson Xavier NX 平台,这是一台用于嵌入式和边缘系统的 AI 超级计算机。它集成了6个core NVIDIA Carmel ARM v8.2 64-bit CPU、搭载 384 NVIDIA CUDA cores 和 48 Tensor cores的GPU、2个 NVDLA 引擎深度学习加速器、7路VLIW视觉处理器。可以提供最高21T的算力。这保证了 CyberDog 可以毫无障碍地处理从传感器系统捕获的大量数据,准确领会主人的意图。同时支持2个 MIPI CSI-2 D-PHY lanes、以太网、WIFI/BT、HDMI、多路USB等。

      有了这个大脑,这台机械狗甚至可以直接外接显示输入设备变身一台“电脑”,当然并不是我们传统意义上使用的那种个人用电脑,而是用于开发等用途。

      fbec7b18-65b1-4d33-8d7a-62bb360e4f2f-image.png

      Nvidia Jetson Xavier NX

      #02

      眼睛-11组高精度传感器

      为了让铁蛋真的像一条狗,小米为其配备了超过11组高精密传感器,包括Intel Realsense D450深度摄像头、AI交互相机、双目超广角相机、TOF传感器、环境光传感器、超声波传感器、惯性测量单元、GPS模组、地磁传感器、光流计、6MIC环型阵列、触摸传感器等。有了这些丰富的传感器,CyberDog就像一个拥有白眼的“感知型忍者”,可以敏锐地感觉都周围流动的“查克拉”,并做出避障、预警等行为。

      不仅仅是堆砌硬件,小米手机影像部门还亲自介入,将自己在手机方面深耕多年影像的技术运用至四足机器人领域,将硬件的性能发挥到极致。比如CyberDog的自主跟随能力就是源自人脸识别技术的衍生,以及SLAM建图和导航避障功能都来自影像技术的延伸的视觉探知技术,CyberDog通过影像技术感知环境后,通过算法创建出地图并导航,最终规划出最优路线。

      15.gif

      #03

      肌肉-自研伺服电机

      CyberDog全身的自由度是12,单腿的自由度是3,即每只脚大腿关节处有两个电机,小腿关节处有一个电机,共12个电机。12个电机的组合让CyberDog可以自由地做出奔跑、跳跃、空翻等高难度动作。据悉,这12个伺服电机均由小米自研,单个最大扭矩达32N·m,最大转速为220rpm,可以让这只14KG重的CyberDog以11.5km/h的速度前进,这个速度大概和一个普通人晨跑的速度相当,让主人带着CyberDog跑步遛狗成为可能。

      lALPDhYBQ9ze9LDNARbNA54_926_278.png
      伺服电机性能参数

      14.gif

      #04

      小脑-全志MR813

      CyberDog“小脑”使用的国内知名芯片设计厂商全志科技的
      Allwinner MR813 。MR813将负责MPC算法的执行、运动控制、电源系统管理和OTA系统管理等工作。即CyberDog的四只脚以及上面的12个伺服电机,都将在MR813的控制下有序地行动,让CyberDog不会出现顺拐或者“扑街”。

      MR813 是全志针对运动机器人市场推出的高性能SoC,4核A53架构,主频高达1.6GHz,拥有丰富的音视频接口和运动驱动接口。

      据悉,MR系列芯片已经在在扫地机器人产品上被广泛应用,其中包括小米、石头、追觅等知名厂商。本次CyberDog使用MR813也是复用追觅已经成熟的运动驱动模块, 这样可以保证产品的性价比、稳定性和可量产性 。

      也就是说,MR813在其它产品上都是作为“大脑”,而在CyberDog中只用作“小脑”,可见MR813性能的强大,也透露出小米对CyberDog用料选项的踏实和良心。

      CyberDog的MPC算法使用的则是知名开源四足MPC算法 MIT Mini Cheetah。对于仿生四足机器人MPC算法的研究一直是近年的热点。MIT这套算法广受开发者欢迎,许多DIY开发者甚至专业厂商,都会基于这套算法进行开发。MR813则是为算法的运行提供了一个高效稳定的环境。

      8d5f1550-d952-48e4-bf74-626ef2750a3b-image.png
      MR813系统框图

      lALPDhJzxTgYdKPNAefNAd8_479_487.png
      米家扫地机器人1T,使用MR813作为“大脑”

      #05

      神经系统-系统整合

      在整体系统框架方面,CyberDog使用的是主流的机器人开源架构ROS 2,它提供一系列程序库和工具以帮助软件开发者创建机器人应用软件,同时提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。

      其中,Jetson Xavier NX 运行的是Ubuntu 18.04操作系统,11组高性能传感器获取到的环境信息传到Jetson Xavier NX后,由Jetson Xavier NX进行处理,并将运动信息通过千兆网口下发到MR813,由MR813进行运动总控制,分别控制一个MCU进行OTA和电池包的管理和另一个MCU进行电机的控制,与12个高性能伺服电机通过CAN 2.0进行通信。

      lALPDhJzxTgYdJ7NA0_NA_c_1015_847.png

      小米CyberDog系统框图

      #市场前瞻

      目前仿生领域四足机器人的研究比较成熟,世界上最有名的四足仿生机器人研发团队当属波士顿动力,旗下研发的“大狗”系列仿生机器人已经有十几个产品型号分支, 但售价却达到了惊人的7.5万美元(约合人民币48万) ,这个价格让很多普通消费者都望而却步。

      13.gif

      今年 6 月,国内的宇树科技发布了 Unitree GO1,共有三个版本: 售价 2700 美元的 G01 Air base 型号、售价 3500 美元的 G01 和售价 8500 美元的 G01 Edu ,这个价格可以说率先打开了四足机器人在普通消费人群中的市场,不过碍于功能的不足,依然难以进入大众眼界。

      14.jpeg

      也就是说, Unitree GO1 起步价仅需 1.6 万元人民币 ,然而这个价格纪录目前已被小米 9999 的CyberDog打破了。

      但是从目前供应链获取到的信息来看, Jetson Xavier NX核心模块的市场报为3000+元,Intel Realsense D450深度摄像头的市场报价约为1500元 ,这两个关键元器件的成本,就已经接近CyberDog硬件成本的一半。 全志的芯片虽然一直以高性价比著称,但是作为一个扫地机器人大脑级别的芯片,再加上12个伺服电机、电池、金属外壳等材料,CyberDog 卖9999元的价格,真的是“交个朋友”了。 截止2021年8月底,CyberDog 产品虽然未交货,但是已经有人以数倍的价格收购名额了。

      小米副总裁常程在微博对于 “为什么要做这样一个机器人” 的问题是这样回应的:

      “这还是一项投资未来的决策。

      一方面仿生机器人未来在服务、工程、安防、医疗等诸多领域蕴含着巨大的市场潜力。另一方面小米作为全球化的科技公司,有必要尽早在前沿领域进行几乎布局,夯实专利储备。探索仿生机器人的过程也是在做技术预研,其中机器视觉、导航避障、人机交互、AI语音算法等技术可以反哺手机、智能家居等产品。”

      与此同时,我们在这个产品中看到了小米强大的模块整合能力,在项目中,分别调动了核心的手机影像部门、小爱同学AI部门、语音算法部门、生态链公司追觅、芯片原厂全志科技等众多部门、合作伙伴,从概念设计到机械结构设计、BSP、算法移植、系统联调到最终产品交付,只用了10个月的时间。

      IMG_20210824_143700.png
      上一次我们看到这样集全集团之力去做一个玩具的场景,是《四驱兄弟》里的三国藤吉集合三国重工最高科技而打造他的疾速眼镜蛇。而这些模块其实也是自动驾驶会用到的技术热点,结合之前宣布造车的消息,外界猜测,CyberDog其实是在为小米汽车的团队搭建和技术预研做准备。

      -End-

      带字公众号 Q.png

      原 贴 转 跳:【深度剖析】小米CyberDog四足机器人的AI运动系统的实现
      公众号推文跳转:【深度剖析】小米CyberDog四足机器人的AI运动系统的实现

      posted in 其它全志芯片讨论区
      xiaowenge
      DOT小文哥
    • Reply: SPI-NANDFLASH性能低问题

      @chenlinfei 在 SPI-NANDFLASH性能低问题 中说:

      不了理论值的,应该小于理论值很多,但是不到理论值的1/10就有点低了。另外,uboot读nand能有接近10MB/s。
      是否能优化spi小数据读写?

      还有擦除耗时和编程耗时啥的,每page(2k)大概耗时在45us左右,算下来读取的速度应该在22M/s左右。DMA耗时的问题确实存在,已经内部在查这个问题了。

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • 【骚操作】启动阶段改设备DTS的方法

      在设备BSP调试的过程中,经常会出现需要修改DTS的情况,比如调试一个新的屏幕、传感器或者wifi模组,传统的方法是:
      在源码中直接修改board.dts文件->重新编译&打包->烧写到设备里
      这种方法繁杂,编译和烧写都要花费时间,严重影响开发效率。
      因此,全志提供了一个启动阶段DTS调试的方法,可以让我们在启动阶段就把DTS改掉,这次启动加载的就是改后的DTS。
      *注:这种修改是一次性的,不可以保存的,只限这次启动的时候生效,断电或者重启就不生效了

      1.设备上电过程中串口按住电脑键盘的"s"按键,让设备进入boot:
      *注:是真的按住调试的电脑的键盘的s按键,和按住2另设备跳烧录的操作一样(参考:https://d1.docs.aw-ol.com/study/study_4compile/#pc2)
      如果进入boot成功,就会有如下log,这时就可以在串口对设备进行DTS修改操作。
      b263a347-e815-490a-a184-c652bd6d1c2b-image.png
      (详细log如下)

      [188]HELLO! BOOT0 is starting!
      [191]BOOT0 commit : 27369ab
      [194]set pll start
      [196]periph0 has been enabled
      [199]set pll end
      [200][pmu]: bus read error
      [203]board init ok
      [205]DRAM only have internal ZQ!!
      [208]get_pmu_exist() = -1
      [210]DRAM BOOT DRIVE INFO: V0.24
      [213]DRAM CLK = 792 MHz
      [215]DRAM Type = 3 (2:DDR2,3:DDR3)
      [219]DRAMC ZQ value: 0x7b7bfb
      [221]DRAM ODT value: 0x42.
      [224]ddr_efuse_type: 0x0
      [227]DRAM SIZE =1024 M
      [231]DRAM simple test OK.
      [233]dram size =1024
      [235]key press : s
      [237]spinand UBOOT_START_BLK_NUM 8 UBOOT_LAST_BLK_NUM 32
      [242]block from 8 to 32
      [318]Check is correct.
      [320]dma 0x2f9f8 int is not used yet
      [323]dma 0x2f9f8 int is free, you do not need to free it again
      [329]Entry_name        = opensbi
      [332]Entry_name        = u-boot
      [335]Entry_name        = dtb
      [338]Jump to second Boot.
      
      OpenSBI v0.6
         ____                    _____ ____ _____
        / __ \                  / ____|  _ \_   _|
       | |  | |_ __   ___ _ __ | (___ | |_) || |
       | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
       | |__| | |_) |  __/ | | |____) | |_) || |_
        \____/| .__/ \___|_| |_|_____/|____/_____|
              | |
              |_|
      
      Platform Name          : T-HEAD Xuantie Platform
      Platform HART Features : RV64ACDFIMSUVX
      Platform Max HARTs     : 1
      Current Hart           : 0
      Firmware Base          : 0x40000400
      Firmware Size          : 75 KB
      Runtime SBI Version    : 0.2
      
      MIDELEG : 0x0000000000000222
      MEDELEG : 0x000000000000b1ff
      PMP0    : 0x0000000040000000-0x000000004001ffff (A)
      PMP1    : 0x0000000040000000-0x000000007fffffff (A,R,W,X)
      PMP2    : 0x0000000080000000-0x00000000bfffffff (A,R,W,X)
      PMP3    : 0x0000000000020000-0x0000000000027fff (A,▒
      
      U-Boot 2018.05-g0a88ac9 (Apr 30 2021 - 11:23:28 +0000) Allwinner Technology
      
      [00.421]DRAM:  1 GiB
      [00.423]Relocation Offset is: 3def0000
      [00.427]secure enable bit: 0
      [00.429]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, APB1=100Mhz  MBus=300Mhz
      [00.436]flash init start
      [00.438]workmode = 0,storage type = 0
      [00.444]sunxi-spinand-phy: not detect any munufacture from id table
      [00.450]sunxi-spinand-phy: get spi-nand Model from fdt fail
      [00.456]sunxi-spinand-phy: get phy info from fdt fail
      
      device nand0 <nand>, # parts = 4
       #: name                size            offset          mask_flags
       0: boot0               0x00100000      0x00000000      1
       1: uboot               0x00300000      0x00100000      1
       2: secure_storage      0x00100000      0x00400000      1
       3: sys                 0x0fb00000      0x00500000      0
      
      active partition: nand0,0 - (boot0) 0x00100000 @ 0x00000000
      
      defaults:
      mtdids  : nand0=nand
      mtdparts: mtdparts=nand:1024k@0(boot0)ro,3072k@1048576(uboot)ro,1024k@4194304(secure_storage)ro,-(sys)
      [00.794]ubi0: attaching mtd4
      [01.190]ubi0: scanning is finished
      [01.200]ubi0: attached mtd4 (name "sys", size 251 MiB)
      [01.204]ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 258048 bytes
      [01.211]ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 2048
      [01.217]ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
      [01.223]ubi0: good PEBs: 1004, bad PEBs: 0, corrupted PEBs: 0
      [01.228]ubi0: user volume: 9, internal volumes: 1, max. volumes count: 128
      [01.235]ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
      [01.243]ubi0: available PEBs: 0, total reserved PEBs: 1004, PEBs reserved for bad PEB handling: 40
      [01.251]sunxi flash init ok
      [01.254]line:714 init_clocks
      __clk_init: clk pll_periph0x2 already initialized
      register fix_factor clk error
      [01.264]drv_disp_init
      request pwm success, pwm2:pwm2:0x2000c00.
      [01.281]drv_disp_init finish
      [01.283]boot_gui_init:start
      [01.286]set disp.dev2_output_type fail. using defval=0
      [01.478]boot_gui_init:finish
      [01.891]LCD open finish
      partno erro : can't find partition bootloader
      54 bytes read in 0 ms
      [02.052]bmp_name=bootlogo.bmp size 3072054
      3072054 bytes read in 126 ms (23.3 MiB/s)
      [02.402]Loading Environment from SUNXI_FLASH... OK
      [02.435]out of usb burn from boot: not need burn key
      [02.460]update bootcmd
      [02.482]change working_fdt 0x7eaafda8 to 0x7ea8fda8
      [02.503]update dts
      Hit any key to stop autoboot:  0
      => sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
      Unknown command 'sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss' - try 'help'
      =>
      =>
      

      2.要看哪个DTS节点的参数,就输入 fdt list +节点名称
      比如查看整个/soc/的DTS:

      => fdt list /soc/
      soc@3000000 {
              #address-cells = <0x00000002>;
              #size-cells = <0x00000002>;
              compatible = "simple-bus";
              ranges;        sram_ctrl@3000000 {
              };
              rtc_ccu@7090000 {
              };
              clock@2001000 {
              };
              clock@7010000 {
              };
              interrupt-controller@10000000 {
              };
              uart@2500000 {
              };
              uart@2500400 {
              };
              uart@2500800 {
              };
              uart@2500c00 {
              };
              uart@2501000 {
              };
              uart@2501400 {
              };
              ce@03040000 {
              };
              s_cir@7040000 {
              };
              ir@2003000 {
              };
              deinterlace@5400000 {
              };
              eth@4500000 {
              };
              rtc@7090000 {
              };
              dma-controller@3002000 {
              };
              timer@2050000 {
              };
              watchdog@6011000 {
              };
              mbus-comtroller@3102000 {
              };
              pmu {
              };
              idle {
              };
              pinctrl@2000000 {
              };
              spi@4025000 {
              };
              spi@4026000 {
              };
              twi@2502000 {
              };
              twi@2502400 {
              };
              twi@2502800 {
              };
              twi@2502c00 {
              };
              ledc@2008000 {
              };
              pwm@2000c00 {
              };
              keyboard@2009800 {
              };
              sid@3006000 {
              };
              gpadc@2009000 {
              };
              ths@02009400 {
              };
              rtp@2009c00 {
              };
              codec@2030000 {
              };
              dummy_cpudai@203034c {
              };
              sound@2030340 {
              };
              rpaf-dsp@203034c {
              };
              dmic@2031000 {
              };
              sound@2031050 {
              };
              sounddmic@2031060 {
              };
              daudio@2032000 {
              };
              sounddaudio0@20320a0 {
              };
              daudio@2033000 {
              };
              sounddaudio1@20330a0 {
              };
              daudio@2034000 {
              };
              sounddaudio2@20340a0 {
              };
              hdmiaudio@20340a4 {
              };
              spdif@2036000 {
              };
              soundspdif@2036040 {
              };
              g2d@5410000 {
              };
              disp@5000000 {
              };
              ve@1c0e000 {
              };
              msgbox@0601f000 {
              };
              lcd0@1c0c000 {
              };
              sdmmc@4022000 {
              };
              sdmmc@4020000 {
              };
              sdmmc@4021000 {
              };
              hdmi@5500000 {
              };
              usbc0@0 {
              };
              udc-controller@0x04100000 {
              };
              ehci0-controller@0x04101000 {
              };
              ohci0-controller@0x04101400 {
              };
              usbc1@0 {
              };
              ehci1-controller@0x04200000 {
              };
              ohci1-controller@0x04200400 {
              };
              pwm0@2000c10 {
              };
              pwm1@2000c11 {
              };
              pwm2@2000c12 {
              };
              pwm3@2000c13 {
              };
              pwm4@2000c14 {
              };
              pwm5@2000c15 {
              };
              pwm6@2000c16 {
              };
              pwm7@2000c17 {
              };
              vind@5800800 {
              };
              tvd@05c00000 {
              };
              tvd0@05c01000 {
              };
              card0_boot_para@2 {
              };
              card2_boot_para@3 {
              };
              rfkill@0 {
              };
              btlpm@0 {
              };
              addr_mgt@0 {
              };
      };
      

      再比如看pwm0的设置则为:

      => fdt list /soc/pwm0
      pwm0@2000c10 {
              compatible = "allwinner,sunxi-pwm0";
              reg = <0x00000000 0x02000c10 0x00000000 0x00000004>;
              reg_base = <0x02000c00>;
              pinctrl-names = "active", "sleep";
              pinctrl-0 = <0x00000056>;
              pinctrl-1 = <0x00000057>;
              status = "okay";
              phandle = <0x00000030>;
      };
      

      3.如果要修改某个节点的参数,则使用 fdt set 节点名称 参数名称 要修改的数值
      如 fdt set /soc/disp dev0_do_hpd <0>

      4.改好后输入 boot 启动设备即可。

      posted in Linux
      xiaowenge
      DOT小文哥
    • Reply: mCore-H616 小模组,哑光蓝的来啦,4核A53+512内存,99元走起

      非常不错,我好喜欢,楼主多贴一些关于这个板子的信息出来嘛。

      posted in H616系列-OTT
      xiaowenge
      DOT小文哥
    • Reply: Porject Yosemite - 基于全志V853的开发板

      @yelong98 在 Porject Yosemite - 基于全志V853 中说:

      @xiaowenge 小文哥,sdk啥时候释放啊,新妓到来,饥渴难耐啊

      快了,在mkdir v853_sdk 了

      posted in V853系列-AI视觉
      xiaowenge
      DOT小文哥
    • 【DIY教程】D1哪吒开发板移植wifi6模组AW869B

      D1哪吒开发板自带的是全志的XR829模组,支持2.4G wifi4和bt,但是不支持wifi6。
      相比wifi4,wifi6具有更高的速度、更低的延时、更好的安全性等特点,在高端AIoT产品中有广泛的使用场景。因此,我们决定在D1上移植个wifi6模组来玩。
      我们的wifi6模组选择的是全志自己做的AW869B,该模组已经在全志平板、智能物联等产品上应用。

      1.硬件修改
      1.1 换模组
      AW869B和D1哪吒开发板原装的XR829是pin to pin的,所以只需要撬开板子上的哪吒眼,把XR829吹下来,就可以直接把AW869B替换上去
      62cb6ca2-3bab-4931-8dc9-cea4cdb32bc0-image.png

      1.2 改电
      AW869B规格书严格要求io供电是1.8V,但是现在SDIO_DATA脚的电压上拉测的只有1.4V,所以还要改个电,具体改法如下:
      1.2.1 修改VDDIO供电
      VDDIO供电默认来自VCC-PG,将VCC-PG由VCC_3V3改到LDOA-OUT.【即:拆掉RS121,贴上RS90(R0402,0欧)】
      1.2.2 BT-RESETN引脚拉低
      AW869B规格要求.【即:贴上RW20(R0402,100K)】
      修改点如图:
      e0182e78-5e42-4671-a171-28104c4721ba-image.png

      2.软件修改
      patch下载地址:https://www.aw-ol.com/downloads/resources/45
      2.1 添加AW869B驱动
      ① 将/software/driver下的aic8800文件夹拷贝至lichee/linux-5.4/drivers/net/wireless目录下
      ② lichee/linux-5.4/drivers/net/wireless/Makefile中添加obj-$(CONFIG_AIC_WLAN_SUPPORT) += aic8800/
      ③ lichee/linux-5.4/drivers/net/wireless/Kconfig中添加source "drivers/net/wireless/aic8800/Kconfig"
      ④ 在根目录执行make kernel_menuconfig命令,选中

      Device Drivers 》  Network device support 》 Wireless LAN 》
      [*]AIC wireless Support
      	<M>     AIC8800 wlan Support  
      	<M>     AIC8800 bluetooth Support 
      

      ⑤ 执行mkernel

      2.2 适配Module
      ①将software/patch目录下的0001-AIC8800-WiFi-Aic8800-WiFi-add-new-modules.path拷贝到target/allwinner/d1-common下执行git am
      ②在Tina根目录执行make menuconfig,选中 Kernel modules 》 Wireless Drivers 》 < * > kmod-net-aic8800
      2.3 添加firmware文件
      ①将/software/firmware下的aic8800目录文件夹拷贝至package/firmware/linux-firmware目录下
      ②在Tina根目录执行make menuconfig,选中 Firmware 》 < * > aic8800-firmware. (如不显示aic8800-firmware可以在根目录执行build\envsetup.sh)
      2.4 修改设备树的PG口电压
      ①将software/patch目录下的0001-AIC8800-WiFi-CONFIG_PG_1_8V.patch拷贝到/device/config/chips/d1/configs/nezha/linux-5.4执行git am
      2.5 编译、烧写、运行。

      测试固件下载地址:https://www.aw-ol.com/downloads/resources/46

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • cma扩充和开机logo消失问题分享

      在使用的是128M dram的小内存配置,播放视频需要通过ion申请较多的连续物理内存空间,所以需要扩充CMA的大小,否则会导致cma扩充和开机logo消失。

      【芯片平台】R311
      【软件版本】tina3.5.1
      【问题背景】
      使用的是128MB的ddr,对于多视频播放和旋转的场景ion的使用非常吃紧,需要想办法扩大cma的大小。
      【问题简述】
      R311更改cma大小后,出现了不进kernel,开机logo消失等问题。
      【问题处理过程】
      (1)不进kernel:
      更改cma大小为72MB后,系统无法进kernel,撤回修改,查看系统保留内存的分布:

      root@TinaLinux:/# cat /sys/kernel/debug/memblock/reserved
         0: 0x40004000..0x40007fff, size:16K
         1: 0x40020000..0x40020fff, size:4K
         2: 0x40100000..0x40b480cb, size:10528K
         3: 0x41000000..0x4100000b, size:0K
         4: 0x43500000..0x4351617f, size:88K
         5: 0x43c00000..0x47bfffff, size:65536K
         6: 0x47cc8000..0x47f65fff, size:2680K
         7: 0x47f7da00..0x47f961ff, size:98K
         8: 0x47f9621c..0x47ffefff, size:419K
         9: 0x47fff640..0x47fff67b, size:0K
        10: 0x47fff680..0x47fff6bb, size:0K
        11: 0x47fff6c0..0x47fff737, size:0K
        12: 0x47fff740..0x47fff74f, size:0K
        13: 0x47fff780..0x47fff78f, size:0K
        14: 0x47fff7c0..0x47fff7c3, size:0K
        15: 0x47fff800..0x47fff9ad, size:0K
        16: 0x47fff9c0..0x47fffb6d, size:0K
        17: 0x47fffb80..0x47fffd2d, size:0K
        18: 0x47fffd40..0x47fffd43, size:0K
        19: 0x47fffd64..0x47fffd81, size:0K
        20: 0x47fffd84..0x47fffdb8, size:0K
        21: 0x47fffdbc..0x47fffe1c, size:0K
        22: 0x47fffe20..0x47fffe70, size:0K
        23: 0x47fffe74..0x47ffff06, size:0K
        24: 0x47ffff08..0x47ffff22, size:0K
        25: 0x47ffff24..0x47ffff3e, size:0K
        26: 0x47ffff40..0x47ffff5f, size:0K
        27: 0x47ffff64..0x47ffff7e, size:0K
        28: 0x47ffff80..0x47ffff8f, size:0K
        29: 0x47ffff94..0x47ffffae, size:0K
        30: 0x47ffffb0..0x47ffffff, size:0K
      

      发现dts起始地址为0x43500000,cma的下一个保留区域起始地址为0x47cc8000,留给dts和cma的空间只有0x47cc8000-0x43500000约为71MB,cma大小设置为72MB后,超出了范围,导致不进kernel。怎么解决问题?把dts的起始地址往前挪动一下,cma的空间就可以得到扩充,如下所示,把dts的位置向前挪动0x00500000,cma足够容纳72MB的cma保留区域:

      include/configs/sunxi-base.h:
      -#define CONFIG_SUNXI_FDT_ADDR              SDRAM_OFFSET(0x03500000)
      +#define CONFIG_SUNXI_FDT_ADDR              SDRAM_OFFSET(0x03000000)
      

      修改后的保留内存的分布如下:

      root@TinaLinux:/# cat /sys/kernel/debug/memblock/reserved
         0: 0x40004000..0x40007fff, size:16K
         1: 0x40020000..0x40020fff, size:4K
         2: 0x40100000..0x40b480cb, size:10528K
         3: 0x41000000..0x4100000b, size:0K
         4: 0x43000000..0x4301617f, size:88K
         5: 0x433fffff..0x47bfffff, size:73728K
         6: 0x47cc8000..0x47f65fff, size:2680K
         7: 0x47f7da00..0x47f961ff, size:98K
         8: 0x47f9621c..0x47ffefff, size:419K
         9: 0x47fff640..0x47fff67b, size:0K
        10: 0x47fff680..0x47fff6bb, size:0K
        11: 0x47fff6c0..0x47fff737, size:0K
        12: 0x47fff740..0x47fff74f, size:0K
        13: 0x47fff780..0x47fff78f, size:0K
        14: 0x47fff7c0..0x47fff7c3, size:0K
        15: 0x47fff800..0x47fff9ad, size:0K
        16: 0x47fff9c0..0x47fffb6d, size:0K
        17: 0x47fffb80..0x47fffd2d, size:0K
        18: 0x47fffd40..0x47fffd43, size:0K
        19: 0x47fffd64..0x47fffd81, size:0K
        20: 0x47fffd84..0x47fffdb8, size:0K
        21: 0x47fffdbc..0x47fffe1c, size:0K
        22: 0x47fffe20..0x47fffe70, size:0K
        23: 0x47fffe74..0x47ffff06, size:0K
        24: 0x47ffff08..0x47ffff22, size:0K
        25: 0x47ffff24..0x47ffff3e, size:0K
        26: 0x47ffff40..0x47ffff5f, size:0K
        27: 0x47ffff64..0x47ffff7e, size:0K
        28: 0x47ffff80..0x47ffff8f, size:0K
        29: 0x47ffff94..0x47ffffae, size:0K
        30: 0x47ffffb0..0x47ffffff, size:0K
      

      (2)开机logo消失:
      开机logo是从uboot解码并显示的,找到logo解码的地方:

       compress_buf = get_decode_buffer();
               if (compress_buf == NULL) {
                       printf("bmp compress_buf empty,quit\n");
                       set_bmp_decode_flag(BMP_DECODE_FAIL);
                       goto __third_cpu_end;
               }
       buf = (unsigned char *)(SUNXI_DISPLAY_FRAME_BUFFER_ADDR + SUNXI_DISPLAY_FRAME_BUFFER_SIZE);
      
               ret = sunxi_bmp_decode_from_compress(buf, compress_buf);
      
      

      发现需要从地址compress_buf把logo的bmp格式数据解压到buf地址,buf地址为SUNXI_DISPLAY_FRAME_BUFFER_ADDR + SUNXI_DISPLAY_FRAME_BUFFER_SIZE,也就是0x47400000。compress_buf的地址如下所示:

       if (next_mode == SUNXI_STATE_NORMAL_BOOT) {
        set_decode_buffer((unsigned char *)
         (SUNXI_LOGO_COMPRESSED_LOGO_BUFF));
       } else if (next_mode == SUNXI_STATE_SHUTDOWN_CHARGE) {
      
          从这里的代码片段知道,logo的原始数据放在地址SUNXI_LOGO_COMPRESSED_LOGO_BUFF,也就是0x43000010,而现在dts的区域的保留区域是( 0x43000000..0x4301617f),刚好覆盖到了SUNXI_LOGO_COMPRESSED_LOGO_BUFF。将SUNXI_LOGO_COMPRESSED_LOGO_BUFF改为0x42000000,这样就能使logo数据不落在内存的保留区域内。
          然而编译后再验证,发现logo还是没法显示,从目前得到的信息看不到问题点,说明问题的原因还是没有全部被找到,继续跟进解码数据的过程:
      
      int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
                         unsigned char *inStream,  SizeT  length)
      {
      .......
          /* Read the uncompressed size */
          for (i = 0; i < 8; i++) {
              unsigned char b = inStream[LZMA_SIZE_OFFSET + i];
                  if (i < 4) {
                      outSize     += (UInt32)(b) << (i * 8);
              } else {
                      outSizeHigh += (UInt32)(b) << ((i - 4) * 8);
              }
          }
      
          outSizeFull = (SizeT)outSize;
          if (sizeof(SizeT) >= 8) {
              /*
               * SizeT is a 64 bit uint => We can manage files larger than 4GB!
               *
               */
                  outSizeFull |= (((SizeT)outSizeHigh << 16) << 16);
          } else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize) {
              /*
               * SizeT is a 32 bit uint => We cannot manage files larger than
               * 4GB!  Assume however that all 0xf values is "unknown size" and
               * not actually a file of 2^64 bits.
               *
               */
              if (outSizeHigh != (SizeT)-1 || outSize != (SizeT)-1) {
                  debug ("LZMA: 64bit support not enabled.\n");
                  return SZ_ERROR_DATA;
              }
          }
      .......
      }
      

      如上面代码片段所示,检查*inStream(内存中的bmp数据)前面8位信息的时候,函数报错返回了,这里说明了内存中的bmp数据有问题。bmp数据需要先从flash里面拷贝到内存SUNXI_LOGO_COMPRESSED_LOGO_BUFF中,后面才能从SUNXI_LOGO_COMPRESSED_LOGO_BUFF解码出来 。现数据有异常,需要检查bmp数据从flash拷贝到内存的过程。查找SUNXI_LOGO_COMPRESSED_LOGO_BUFF使用的地方,arch/arm/cpu/armv7/sun8iw15p1/spl/fip_common.c里面有类似从flash拷贝logo数据到内存的代码:

      arch/arm/cpu/armv7/sun8iw15p1/spl/fip_common.c:
      int load_fip(int *use_monitor)
      {
      ......
                       } else if (strncmp(toc1_item->name, ITEM_LOGO_NAME, sizeof(ITEM_LOGO_NAME)) == 0) {
                               *(uint *)(SUNXI_LOGO_COMPRESSED_LOGO_SIZE_ADDR) = toc1_item->data_len;
                               toc1_flash_read(toc1_item->data_offset/512, (toc1_item->data_len+511)/512, (void *)SUNXI_LOGO_COMPRESSED_LOGO_BUFF);
                       } else if (strncmp(toc1_item->name, ITEM_SHUTDOWNCHARGE_LOGO_NAME, sizeof(ITEM_SHUTDOWNCHARGE_LOGO_NAME)) == 0) {
      ......
      }
      

      从这段代码中看不出来有问题,再看看发现编译uboot的时候跟本不会编译到这个文件,怎么回事,询问负责uboot模块的同事得知,这里的文件是给boot0用的,logo数据从flash拷贝到内存的动作也是在boot0的时候做的。所以更新了SUNXI_LOGO_COMPRESSED_LOGO_BUFF的地址,还需要同时编译boot0,这样对于logo数据的拷贝和解码来说,SUNXI_LOGO_COMPRESSED_LOGO_BUFF才是相同的地址。

      (文 by. shaokang)

      posted in Linux
      xiaowenge
      DOT小文哥

    Latest posts made by xiaowenge

    • Reply: R818测试底板,胸弟们感觉如何?

      很强很强很强很强

      posted in 其它全志芯片讨论区
      xiaowenge
      DOT小文哥
    • Reply: mCore-H616 小模组,哑光蓝的来啦,4核A53+512内存,99元走起

      非常不错,我好喜欢,楼主多贴一些关于这个板子的信息出来嘛。

      posted in H616系列-OTT
      xiaowenge
      DOT小文哥
    • Reply: 全志系列芯片是否支持物体相对位置图像定位

      你有算法就行,我们只出芯片提供算力,算法涉及比较少,特别是这种定制化场景的算法,得自己找算法厂商定制

      posted in V853系列-AI视觉
      xiaowenge
      DOT小文哥
    • Reply: D1-H 开发板哪吒开发板原理图和PCB在哪里可以下载?

      立创EDA开源,可以直接在线看,在线修改,在线下单打板:https://oshwhub.com/kirin1874/d1-h-nezha-kai-fa-ban

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • Reply: 全志SDK怎么本地管理

      @lgkgkfg 在 全志SDK怎么本地管理 中说:

      @xiaowenge 请教下,我搭建了个本地的gerrit服务,想把D1的SDK上传管理下,测试能传上去,但是不知道咋拉下来,因为没有传manifest这个仓库上去,请问是因为我用的全志魔改的repo的原因吗,我看内部仓库里面也没有manifest.git这个仓库?

      这么老的帖子居然被你翻出来了。。。
      不过抱歉这块我也不熟,都是有专门的同事搭建好的,我只会用。但应该算是个通用技能,你百度一下吧

      posted in 其它全志芯片讨论区
      xiaowenge
      DOT小文哥
    • Reply: 用于 V3s/S3 芯片的 Tina Linux

      有的,但是社区没放出来,代理商那里肯定能搞到

      posted in 其它全志芯片讨论区
      xiaowenge
      DOT小文哥
    • Reply: D1s-RTT2022纪念版应用分享

      感谢分享!
      有联系我们的小伙伴退款了咩?

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • Reply: 一起来填坑之芒果派MR-R(D1S\F113)运行melis

      什么样的屏幕?上图看看?

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • Reply: Who can provide the sickscreen of D1s-RTT and the circuit of "PersimM7"?

      9168150a-4183-4694-994f-7d5eeebaac58-image.png

      posted in D1系列-RISC-V
      xiaowenge
      DOT小文哥
    • Reply: 访问全志的SDK服务器显示协议不匹配链接已被外部主机关闭

      @lgkgkfg 在 访问全志的SDK服务器显示协议不匹配链接已被外部主机关闭 中说:

      @xiaowenge 不应该是ssh XXXX@sdk.allwinnertech.com,登录进去执行sudo rm -rf /,就可以获得资料了吗

      不要教坏新人哎,你说的他们都会信的

      posted in 编译和烧写问题专区
      xiaowenge
      DOT小文哥