我的D1s哪吒开发板到货啦
楼下抽一个小可爱送哪吒的帽子
已帮助超过1000位开发者学会烧固件
这个应该是以前平板时代留下来的产物。
总所周知,全志以前是做平板起家的。
做平板的时候,因为板子上本来就有emmc,量产卡就是把卡插进去,固件会自己烧到emmc上,然后再把量产卡拔出来,再启动的时候就用emmc上的固件启动,这张“量产卡”就可以用来烧下一台设备了。
启动卡就是插进去不动了,不会把固件移到emmc上,一直用这张启动卡启动,要是卡被拔出来了,就相当于 是板子没有系统了,就是一块砖头。
编译lib完成后回到源码的根目录,完整编译
编译配置
hb set
这里可能要多敲一次回车才会出来这个选项框
选择wifi_skylake
编译
hb build -f
编译完成后生成的固件在路径xr806_openharmony2/device/xradio/xr806/xr_skylark/out 下:
将 xr_system.img 烧写到设备中即可
2021年8月10日,雷军进行继宣布造车之后的第二次演讲。
在这场以“我的梦想,我的选择”为主题的演讲上,雷军详细讲述了创业后的故事,发布了一系列全新产品。其中,给人最大惊喜同时也给人带来诸多疑问的就是我们这篇推文的主角——“CyberDog”,中文名 “铁蛋”。
在现场的展示中,这只 “人类高质量宠物” 可以行走、站立、小碎步跳舞等等。
CyberDog拜年
CyberDog行走
在官方给出的运动性能参数中,介绍到,除了这些,CyberDog还支持恢复站立、姿态展示、缓慢趴下、缓跑、小跑、奔跑、跳跑、跳跃、倒地恢复、打滚、握手、跳舞、转圈、作揖、坐下等一系列功能动作。
此物一出,各大论坛上也是众说纷纭,有人惊叹于他的外观,有人惊叹于他的智能,也有人惊叹于他在不同指令下不同行为的体现。 可是这只全新的物种,到底是如何做到这些复杂的动作的?它的出现,又能为人类做些什么呢? 相信绝大多数人看到这只机器狗的第一反应都如下面的表情包一样,“我不理解”。
这只看起来像小狗的机器人其实是当前业内备受关注的新产品形态—— 仿生四足机器人 。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等。
有了这个大脑,这台机械狗甚至可以直接外接显示输入设备变身一台“电脑”,当然并不是我们传统意义上使用的那种个人用电脑,而是用于开发等用途。
Nvidia Jetson Xavier NX
#02
眼睛-11组高精度传感器
为了让铁蛋真的像一条狗,小米为其配备了超过11组高精密传感器,包括Intel Realsense D450深度摄像头、AI交互相机、双目超广角相机、TOF传感器、环境光传感器、超声波传感器、惯性测量单元、GPS模组、地磁传感器、光流计、6MIC环型阵列、触摸传感器等。有了这些丰富的传感器,CyberDog就像一个拥有白眼的“感知型忍者”,可以敏锐地感觉都周围流动的“查克拉”,并做出避障、预警等行为。
不仅仅是堆砌硬件,小米手机影像部门还亲自介入,将自己在手机方面深耕多年影像的技术运用至四足机器人领域,将硬件的性能发挥到极致。比如CyberDog的自主跟随能力就是源自人脸识别技术的衍生,以及SLAM建图和导航避障功能都来自影像技术的延伸的视觉探知技术,CyberDog通过影像技术感知环境后,通过算法创建出地图并导航,最终规划出最优路线。
#03
肌肉-自研伺服电机
CyberDog全身的自由度是12,单腿的自由度是3,即每只脚大腿关节处有两个电机,小腿关节处有一个电机,共12个电机。12个电机的组合让CyberDog可以自由地做出奔跑、跳跃、空翻等高难度动作。据悉,这12个伺服电机均由小米自研,单个最大扭矩达32N·m,最大转速为220rpm,可以让这只14KG重的CyberDog以11.5km/h的速度前进,这个速度大概和一个普通人晨跑的速度相当,让主人带着CyberDog跑步遛狗成为可能。
伺服电机性能参数
#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则是为算法的运行提供了一个高效稳定的环境。
MR813系统框图
米家扫地机器人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进行通信。
小米CyberDog系统框图
#市场前瞻
目前仿生领域四足机器人的研究比较成熟,世界上最有名的四足仿生机器人研发团队当属波士顿动力,旗下研发的“大狗”系列仿生机器人已经有十几个产品型号分支, 但售价却达到了惊人的7.5万美元(约合人民币48万) ,这个价格让很多普通消费者都望而却步。
今年 6 月,国内的宇树科技发布了 Unitree GO1,共有三个版本: 售价 2700 美元的 G01 Air base 型号、售价 3500 美元的 G01 和售价 8500 美元的 G01 Edu ,这个价格可以说率先打开了四足机器人在普通消费人群中的市场,不过碍于功能的不足,依然难以进入大众眼界。
也就是说, 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个月的时间。
上一次我们看到这样集全集团之力去做一个玩具的场景,是《四驱兄弟》里的三国藤吉集合三国重工最高科技而打造他的疾速眼镜蛇。而这些模块其实也是自动驾驶会用到的技术热点,结合之前宣布造车的消息,外界猜测,CyberDog其实是在为小米汽车的团队搭建和技术预研做准备。
-End-
原 贴 转 跳:【深度剖析】小米CyberDog四足机器人的AI运动系统的实现
公众号推文跳转:【深度剖析】小米CyberDog四足机器人的AI运动系统的实现
@chenlinfei 在 SPI-NANDFLASH性能低问题 中说:
不了理论值的,应该小于理论值很多,但是不到理论值的1/10就有点低了。另外,uboot读nand能有接近10MB/s。
是否能优化spi小数据读写?
还有擦除耗时和编程耗时啥的,每page(2k)大概耗时在45us左右,算下来读取的速度应该在22M/s左右。DMA耗时的问题确实存在,已经内部在查这个问题了。
在设备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修改操作。
(详细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 启动设备即可。
@yelong98 在 Porject Yosemite - 基于全志V853 中说:
@xiaowenge 小文哥,sdk啥时候释放啊,新妓到来,饥渴难耐啊
快了,在mkdir v853_sdk 了
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替换上去
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)】
修改点如图:
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 编译、烧写、运行。
在使用的是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)
你有算法就行,我们只出芯片提供算力,算法涉及比较少,特别是这种定制化场景的算法,得自己找算法厂商定制
立创EDA开源,可以直接在线看,在线修改,在线下单打板:https://oshwhub.com/kirin1874/d1-h-nezha-kai-fa-ban
@lgkgkfg 在 全志SDK怎么本地管理 中说:
@xiaowenge 请教下,我搭建了个本地的gerrit服务,想把D1的SDK上传管理下,测试能传上去,但是不知道咋拉下来,因为没有传manifest这个仓库上去,请问是因为我用的全志魔改的repo的原因吗,我看内部仓库里面也没有manifest.git这个仓库?
这么老的帖子居然被你翻出来了。。。
不过抱歉这块我也不熟,都是有专门的同事搭建好的,我只会用。但应该算是个通用技能,你百度一下吧
@lgkgkfg 在 访问全志的SDK服务器显示协议不匹配链接已被外部主机关闭 中说:
@xiaowenge 不应该是ssh XXXX@sdk.allwinnertech.com,登录进去执行sudo rm -rf /,就可以获得资料了吗
不要教坏新人哎,你说的他们都会信的