R328-S3 fes1 逆向工程
工程背景
我这个平台上全志的 boot0 启动性能有些低,其中读取 SPI NAND uboot 的代码耗时有0.5秒以上。
我相信这是通病,而 boot0 是闭源的。Tina SDK 中倒是有一些早期架构的 boot0 代码可以参考。
如果想要重写 boot0 ,我评估下来最难的其实是 DDR 的初始化,也就是 fes1 这部分。
fes1 就是设计用来辅助全志量产工具初始化 PLL 和 DDR 的,且大小非常小,只有 16KB。
把他逆向就可以搞定 DDR 的初始化。
工程目的
1.学习全志的相关底层。
2.提高逆向水平,证明自己拥有力量。
3.通过逆向工程,重新编写处该平台的 DDR 初始化 C 代码。
4.为后续重写 boot0 铺路。
工程准备
IDA Pro 7.5
Visual Studio 2012
GNU ARM NONE Toolchain for windows
工程经验
平时要上班,只能挤出业余时间,全部工程历时5天,终于完成,中间有一些弯路,我可以分享下。
例如复原的 C 代码,看起来已经和原始代码高度吻合,但运行是失败的,无法成功初始化 DDR。
调试了一天后我决定,再逆一遍,仔细比对每个语句。中间确实发现了几处错误,并修正了,但仍然无法成功初始化 DDR。
后来我想到一个办法,把 IDAPro Product ASM file 把代码贴到 .s 文件里然后编译。
将有嫌疑的函数替换为原始的 fes 汇编代码,最终终于排查出来问题。具体是什么问题就不分享了,还是不够仔细……
文件列表
fes1.fex 编译后 OUT 目录中的 fes1.fex 会被打包到烧录镜像中
fes1_sun8iw18p1.bin SDK中的原始 fes1 闭源文件
fes1_sun8iw18p1.bin.idb IDA 工程
fes1re 逆向工程 Visual Studio
另外 uboot 主线中也有一些平台的 PLL、DDR 代码可以参考
我看了不是官方的代码,应该也是国外先辈们逆向后参考 SDK 代码写出来的
全志平台我是新手,欢迎大家一起交流
mengxp works 2021
QQ: 4003032
离线
谢谢大佬分享,想请教一个问题,auto_set_timing_para这个函数里面的ddr参数时怎么一个个对应起来的呢?
看起来像参照的主线uboot的代码,不知道能不能分享下思路呢?
离线
谢谢大佬分享,想请教一个问题,auto_set_timing_para这个函数里面的ddr参数时怎么一个个对应起来的呢?
看起来像参照的主线uboot的代码,不知道能不能分享下思路呢?
所有代码都是全志的,我只是做RE工程。
DRAM控制器的寄存器定义是不开放的,usermanual里面都没有,所以很多dram初始化代码只能抄。
你问的那些时序参数都是DDR的标准,可以查询DDR spec手册。每家的dram颗粒时序可能不一样。
他这个代码应该是比较低配的初始化代码,用来适配绝大多数DRAM时序。
一开始我也以为主线uboot代码是全志的,但其实主线uboot代码也是抄的官方代码,或是参考了sdk中开放的早期soc的boot0代码。
全志并不参与维护主线uboot。
离线
不错不错,DDR部分的代码
离线
@mengxp
主线 u-boot 里的 DDR 代码的确是基于早期放出来的代码改的,但是因为全志新的 DDR 控制器的代码都没开源,现在代码已经改得没什么相关性了(
离线