页次: 1
大佬可以帮忙测试下 主线spinand+ubifs的性能吗?
我在r328用全志的闭源nand驱动测试结果是这样的。性能非常垃。
下面是记录
------------------------------------------------------------
sunxi nand driver
全志的私有 nand 驱动,NFTL 层将nand转换成块设备
测试写 ~3.2MB/s
time dd if=/dev/zero of=16mb bs=64k count=256 conv=fsync
256+0 records in
256+0 records out
real 0m 5.01s
user 0m 0.00s
sys 0m 0.13s
------------------------------------------------------------
测试读 ~9MB/s
dd if=/dev/urandom of=16mb bs=64k count=256 conv=fsync
重启系统后
time dd if=16mb of=/dev/null bs=64k count=256
256+0 records in
256+0 records out
real 0m 1.77s
user 0m 0.00s
sys 0m 0.06s
我自己做了一份,用了全志的 secureboot,crypto engine
首先需要secureboot,来禁止未授权的secure world代码执行
flash上存储的 kernel initramfs 是用aesctr128加密的
bootloader执行过程会读取并使用efuse中的ssk对 kernel initramfs 镜像进行解密
这样就保证了 kernel initramfs 的保密性,这两个镜像是加密的,没有密钥无法解密
密钥是烧录在efuse上的,设置了readprotect writeprotect,无法被读出,只有crypto engine能够调用解密
而crypto engine只有secure world的代码有权限访问
而secure world代码是被代码签名的,没有签名不能在cpu上执行
不能在cpu上执行,就无法解密镜像。
最终实现的性能参考
QSPI nor flash
kernel+initramfs 10M
bootloader读取、解密、哈希 整个流程只需要 380毫秒。
AP6212 做同样的测试完全没有问题,
所以说螃蟹是垃圾,几年了一个bug修不掉。
Mem: 25016K used, 95676K free, 24K shrd, 0K buff, 15072K cached
CPU: 0.0% usr 10.0% sys 0.0% nic 89.8% idle 0.0% io 0.0% irq 0.1% sirq
Load average: 1.23 1.24 0.89 1/69 937
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
868 2 root SW 0 0.0 1 8.7 [dhd_dpc]
934 829 root S 17864 14.7 1 1.2 ./udpflood 192.168.20.100 1234 5
937 829 root R 2668 2.2 1 0.1 top
894 1 root S 3164 2.6 1 0.0 hostapd -B /etc/hostapd.conf
1 0 root S 2668 2.2 0 0.0 init
829 1 root S 2668 2.2 1 0.0 -/bin/sh
820 1 root S 2668 2.2 1 0.0 syslogd -O /tmp/syslog.txt
855 1 root S 2500 2.0 0 0.0 dbus-daemon --system
857 1 root S 2160 1.7 0 0.0 hcid -x -m 8192 -f /usr/etc/hcid.c
869 2 root SW 0 0.0 1 0.0 [dhd_rxf]
10 2 root SW 0 0.0 0 0.0 [migration/0]
283 2 root SW 0 0.0 1 0.0 [kworker/1:1]
758 2 root SW 0 0.0 1 0.0 [kworker/u4:4]
7 2 root SW 0 0.0 1 0.0 [rcu_preempt]
599 2 root SW 0 0.0 0 0.0 [kworker/0:1]
149 2 root SW 0 0.0 1 0.0 [kworker/u4:2]
3 2 root SW 0 0.0 0 0.0 [ksoftirqd/0]
806 2 root DW 0 0.0 0 0.0 [usb-hardware-sc]
2 0 root SW 0 0.0 0 0.0 [kthreadd]
send iter 9800ot SW 0 0.0 0 0.0 [kworker/0:0]
send iter 9900
send iter 10000
send iter 10100
send iter 10200
send iter 10300
send iter 10400
send iter 10500
send iter 10600
send iter 10700
send iter 10800
send iter 10900
官方是有 win32 port 项目的,但是说实话,那个工程,配置的乱七八糟的。我这vs2017折腾半天编译不了,还是自己重建一个工程吧
步骤
1.建立VS2017工程,创建了一个简单的 Win32 Native 窗口
2.复制 lv_demos lvgl 的源代码 (此处是官方 8.1 的),没有做任何文件修改,仅删掉了一些觉得用不上的目录和组件(sdl, gpu等)
3.VS工程新建筛选器 lvgl lv_demos,进入对应的目录,搜索 *.c 文件直接拖拽到了 VS 工程筛选器 lvgl 和 lv_demos 中
4.创建 lvgl 配置文件 lv_conf.h,是根据 lv_conf_template.h 修改而来
5.创建 lv_demos 配置文件 lv_demo_conf.h,是根据 lv_demo_conf_template.h 修改而来
6.新增了显示驱动(根据fbdev修改而来)和输入设备驱动(根据win32drv修改而来),都在 main.c 中了
其实是可以直接使用 win32drv 的,但是自己做一下,更能加强了解和学习
7.编译好的 exe 在 release 目录
评价
1.代码段仅 360K 体积非常优秀,没包含图像解码器,使用的是 bitmap,所以 exe 文件大部分数据都是资源数据。
2.移植简单,配置方便,没有遇到编译错误,仅报一些 warning。
3.目前我对lvgl了解不多,仅跑了demo,不知道构建界面的难度。但从运行效果来看无疑是嵌入式设备首选的界面库
mengxp 2022/2/12
工具源代码下载 udpflood.zip
Realtek Wifi module AP 功能压力测试工具
mengxp work & test 2022/01
Bug 描述
当满足如下 3 个条件时,若有大流量从 AP 发往 iPhone
有概率导致内核线程 ksoftirqd & RTWHALXT 占满 CPU,并有可能导致系统停止响应
1.realtek wifi 工作在 AP 模式
2.iPhone 作为 STA 接入
3.iPhone wifi 进入 SLEEP 状态(POWERSAVE)
Buf 复现步骤
1.realtek 板端建立 wifi AP,并建立 DHCP 服务器(可选,可使用静态IP)
2.iphone 连接该 AP(如果没有 DHCP 需要手动配置 IP)
3.(!重要!)iphone 进入到 设置-蓝牙 界面 (由于 2.4G 天线复用冲突,蓝牙 scan 会导致 Wifi 频繁进入 SLEEP)
4.realtek 板端运行该工具持续向 iPhone 发送 UDP 报文,间隔可修改
例: udpflood 192.168.20.100 1234 5
其中 192.168.20.100 是 iphone 的 IP,1234是端口号,可任意输入,5 是间隔 5 毫秒发一次报文
5.观察板端是否有卡住的情况。
或可将 udpflood 置于后台运行,然后使用命令 top 观察 CPU 占用率
Bug 分析
当 STA 进入 SLEEP 模式时,realtek 不能正确处理发包队列,导致发包线程占满 CPU
目前我在 rtl8723ds 上测试,bug 复现率 100%,我使用的 wifi 驱动版本有
1.R328 SDK中的 v5.6.5_31752.20181221_COEX20181130-2e2e
2.R329 SDK中的 v5.10.1-26-ga10bc0b8b.20200617_COEX20200103-3535
3.rtl8723DS_WiFi_linux_v5.13.5-29-g0dbf6713f.20210604_COEX20210106-3b3b.tar.gz
上述3个版本全部存在该问题。
bug 日志摘抄
sending 1440 bytes every 5 ms via 2 threads
thread bind to cpu 0
thread bind to cpu 1
send iter 100
send iter 200
send iter 300
[ 314.114167] INFO: rcu_preempt self-detected stall on CPU
[ 314.120151] 1-...: (3000 ticks this GP) idle=551/140000000000001/0 softirq=1858/1858 fqs=0
[ 314.129626] (t=60000 jiffies g=280 c=279 q=1)
[ 314.134720] rcu_preempt kthread starved for 60000 jiffies! g280 c279 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1
[ 397.830251] INFO: rcu_preempt detected stalls on CPUs/tasks:
[ 397.838564] 0-...: (1 GPs behind) idle=7db/140000000000000/0 softirq=1396/1397 fqs=23
[ 397.838577] (detected by 1, t=60002 jiffies, g=281, c=280, q=3)
[ 397.838623] rcu_preempt kthread starved for 2006 jiffies! g281 c280 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1
Mem: 22104K used, 97400K free, 16K shrd, 3668K buff, 6316K cached
CPU: 0.0% usr 95.2% sys 0.0% nic 0.0% idle 0.0% io 0.0% irq 4.7% sirq
Load average: 8.85 6.44 2.98 5/63 899
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
15 2 root RW 0 0.0 1 50.0 [ksoftirqd/1]
861 2 root RW 0 0.0 0 49.9 [RTWHALXT]
欢迎大家在螃蟹其他型号芯片上测试并反馈测试结果
工具源代码下载 udpflood.zip
已初步确定是螃蟹的AP模式逻辑问题,并非死锁。
测试环境
1.rtl8723ds (AP) <-----> iphone (STA)
触发条件
1.作为AP模式
2.正在发送数据
3.对方STA进入SLEEP模式,有概率触发该bug。
问题描述
1.hal\rtl8723d\sdio\rtl8723ds_xmit.c 中 xmit_xmitframes 函数
#ifdef CONFIG_AP_MODE
if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) {
if ((pxmitframe->attrib.psta->state & WIFI_SLEEP_STATE) &&
(pxmitframe->attrib.triggered == 0)) {
RTW_INFO("%s: one not triggered pkt in queue when this STA sleep, break and goto next sta\n", __func__);
break;
}
}
#endif
这段代码意图其实是符合 80211 中的传统省电模式 (Legacy Power Save)
传统省电模式 (Legacy Power Save)
假设某个时间STA进入sleep,它通过发送数据帧或null-date帧来告诉AP我进入省电了
AP收到这个帧后就不发数据帧给处于省电模式下的STA了。
STA会在下一个 DITM period wake up,并收到AP的beacon
在beacon 中DTIM 信息元素会告诉 STA,你sleep的时候有发你的数据,我替你存下了,快来取
但实际工作的时候不知道为什么驱动会反复的触发发送信号量,然后反复的进入这个流程,导致 RTWHALXT 线程占满CPU。
而且影响到了正常的收发逻辑。
暂时解决方案
注释掉上述 break; 语句,逻辑变更为,即使 STA 进入休眠仍然发送,STA收不到就收不到,该帧就算丢弃了。
实验发现也并没有造成多大的通讯延迟影响。
后续解决方案
联系模块fae尝试解决。但我不认为模块fae方面有能力解决这个问题。(我是普通用户不是VIP)
目前在r328平台上使用rtl8723ds高并发流量时内核死锁
具体表现是 top 监控到 RTWHALXT 内核线程占用 CPU 50% (r328其中一个核心)
随后系统死掉,shell会弹出提示
[ 274.772512] INFO: rcu_sched self-detected stall on CPU
[ 274.778301] 1-...: (1 GPs behind) idle=6cb/140000000000001/0 softirq=2804/2805 fqs=7499
[ 274.787477] (t=15000 jiffies g=1214 c=1213 q=179)
[ 295.912599] INFO: rcu_sched detected expedited stalls on CPUs/tasks: { 1-... } 15329 jiffies s: 1 root: 0x2/.
[ 295.923762] blocking rcu_node structures:
只弹出这些,没有列出更多内容。
shell不再响应,系统呈现内核死锁状态。
尝试过使用不同版本的rtl8723ds驱动
1.R328 SDK中的 v5.6.5_31752.20181221_COEX20181130-2e2e
2.R329 SDK中的 v5.10.1-26-ga10bc0b8b.20200617_COEX20200103-3535
3.rtl8723DS_WiFi_linux_v5.13.5-29-g0dbf6713f.20210604_COEX20210106-3b3b.tar.gz https://whycan.com/t_7504.html 这里下载到的
使用这些驱动都存在上述问题。由于是死锁问题,我尝试关闭一个CPU核心
echo 0 > /sys/devices/system/cpu/cpu1/online
这样关闭核心后再测试就不再死锁了。但是这不是个长久之计啊,
请问有人遇到过这个问题吗?该如何解决??
是我的描述不太清楚,一个是我想知道你打印里面有个brom时间,这个是怎么算出来的?第二就是bootloader拉起内核时间是多少呢,想看下和uboot相比有多大的优势。
brom中会初始化ARM核中的Timer,后面可以直接取值拿到CPU上电时间。
Bootloader拉起内核的时间可以看日志
Load Kernel那里是从norflash读取
boot kernel那里是开始跳转
其实主要的问题不是uboot,毕竟uboot可以裁剪。
最大的问题是 boot0 尤其是 sboot 消耗了太多的时间,有0.8秒左右。
而这个东西是不开源的,你没法优化他。
----------------------------------------------------
晚上更新
启用了secureboot,给bootloader做了toc0签名
主板焊接了rtl8723ds sdio模块
启动只需要1.5秒!!比上午的实验还少了0.5秒~
也许是因为上午实验时没有焊接sdio模块,导致mmc部分初始化等待比较久。
下面是securecrt带时间戳的串口日志
[22-06-09.354]BOOTROM elapsed 0 ms (118 ticks)
[22-06-09.354]
[22-06-09.354]
[22-06-09.354]-Hardcore Boot-
[22-06-09.354]
[22-06-09.354]Rev 13, Build Dec 8 2021 21:53:43
[22-06-09.354]mengxp works 2021
[22-06-09.354]
[22-06-09.369]CPU: Allwinner R328-S3
[22-06-09.428]DRAM: DDR3 128 MB, 792 MHz
[22-06-09.428]NOR: C22018(JEDEC ID)
[22-06-09.428]
[22-06-09.428]> Setup MMU
[22-06-09.428]> Load Optee
[22-06-09.428]> Load DeviceTree
[22-06-09.428]> Load Kernel
[22-06-09.780]> Open FDT
[22-06-09.781]> Setup FDT
[22-06-09.781]> Boot kernel
[22-06-09.818]Uncompressing Linux... done, booting the kernel.
[22-06-09.818][ 0.000000] Booting Linux on physical CPU 0x0
[22-06-09.818][ 0.000000] Linux version 4.9.118 (meng@u14aw) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #5 SMP Wed Dec 8 12:55:35 CST 2021
[22-06-09.833][ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[22-06-09.833][ 0.000000] CPU: div instructions available: patching division code
[22-06-09.850][ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[22-06-09.850][ 0.000000] OF: fdt:Machine model: sun8iw18
[22-06-09.885][ 0.000000] bootconsole [earlycon0] enabled
[22-06-09.901][ 0.001130] /cpus/cpu@0 missing clock-frequency property
[22-06-09.901][ 0.007077] /cpus/cpu@1 missing clock-frequency property
[22-06-10.199][ 0.288531] mmc:failed to get gpios
[22-06-10.234][ 0.346803] sunxi_get_str_of_property()1561 - failed to get the string of propname led_regulator!
[22-06-10.246][ 0.361193] sunxi-mmc sdc1: smc 0 p1 err, cmd 8, RTO !!
[22-06-10.290][ 0.394617] sunxi-rtc rtc: hctosys: unable to read the hardware clock
[22-06-10.290]
[22-06-10.684]
[22-06-10.849]Starting fstab.
[22-06-10.890]Starting syslogd.
[22-06-10.890]Starting lo.
[22-06-10.890]
[22-06-10.890]Processing /etc/profile...
[22-06-10.902]root@r328:/#
[22-06-10.903]root@r328:/#
下面是dmesg的日志
root@r328:/# dmesg
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.9.118 (meng@u14aw) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #5 SMP Wed Dec 8 12:55:35 CST 2021
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt:Machine model: sun8iw18
[ 0.000000] bootconsole [earlycon0] enabled
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] On node 0 totalpages: 32768
[ 0.000000] free_area_init_node: node 0, pgdat c05a68c0, node_mem_map c7ef8000
[ 0.000000] Normal zone: 256 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 32768 pages, LIFO batch:7
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: PSCIv0.2 detected in firmware.
[ 0.000000] psci: Using standard PSCI v0.2 function IDs
[ 0.000000] psci: MIGRATE_INFO_TYPE not supported.
[ 0.000000] percpu: Embedded 13 pages/cpu @c7eb5000 s21196 r8192 d23860 u53248
[ 0.000000] pcpu-alloc: s21196 r8192 d23860 u53248 alloc=13*4096
[ 0.000000] pcpu-alloc: [0] 0 [0] 1
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
[ 0.000000] Kernel command line: earlyprintk=sunxi-uart,0x05000000 console=ttyS0,115200 printk.time=1 quiet mtdparts=spi0.0:384k(uboot),64k(env),64k(dtb),7168k(kernel),8704k(rootfs) root=/dev/mtdblock4 rootfstype=cramfs rootwait
[ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Memory: 120580K/131072K available (4185K kernel code, 165K rwdata, 1012K rodata, 252K init, 168K bss, 10492K reserved, 0K cma-reserved, 0K highmem)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xc8800000 - 0xff800000 ( 880 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
[ 0.000000] .text : 0xc0008000 - 0xc041e7ec (4186 kB)
[ 0.000000] .init : 0xc053f000 - 0xc057e000 ( 252 kB)
[ 0.000000] .data : 0xc057e000 - 0xc05a7738 ( 166 kB)
[ 0.000000] .bss : 0xc05a7738 - 0xc05d17f8 ( 169 kB)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[ 0.000000] Hierarchical RCU implementation.
[ 0.000000] Build-time adjustment of leaf fanout to 32.
[ 0.000000] NR_IRQS:16 nr_irqs:16 16
[ 0.000000] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[ 0.000000] arm_arch_timer: Architected cp15 timer(s) running at 24.00MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[ 0.000005] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[ 0.000014] Switching to timer-based delay loop, resolution 41ns
[ 0.000119] Console: colour dummy device 80x30
[ 0.000135] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[ 0.000144] pid_max: default: 32768 minimum: 301
[ 0.000300] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.000306] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.000828] CPU: Testing write buffer coherency: ok
[ 0.001130] /cpus/cpu@0 missing clock-frequency property
[ 0.007077] /cpus/cpu@1 missing clock-frequency property
[ 0.013054] CPU0: update cpu_capacity 1024
[ 0.013060] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[ 0.013107] Setting up static identity map for 0x400082c0 - 0x40008318
[ 0.015428] CPU1: update cpu_capacity 1024
[ 0.015434] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[ 0.015532] Brought up 2 CPUs
[ 0.015540] SMP: Total of 2 processors activated (96.00 BogoMIPS).
[ 0.015544] CPU: All CPU(s) started in SVC mode.
[ 0.016173] devtmpfs: initialized
[ 0.034403] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[ 0.034886] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.034905] futex hash table entries: 512 (order: 3, 32768 bytes)
[ 0.035104] atomic64_test: passed
[ 0.035109] pinctrl core: initialized pinctrl subsystem
[ 0.035717] NET: Registered protocol family 16
[ 0.036010] DMA: preallocated 256 KiB pool for atomic coherent allocations
[ 0.037230] dump_class_init,861, success
[ 0.075556] cpuidle: using governor menu
[ 0.083309] sun8iw18p1-pinctrl pio: initialized sunXi PIO driver
[ 0.126659] pwm module init!
[ 0.129252] sunxi-pm debug v3.10
[ 0.129728] sunxi_spi_probe()2281 - [spi0] SPI MASTER MODE
[ 0.129791] sunxi_spi_request_gpio()1909 - [spi0] Pinctrl init spi0
[ 0.129846] sunxi_spi_clk_init()1959 - [spi0] mclk 100000000
[ 0.130315] spi spi0: master is unqueued, this is deprecated
[ 0.130653] sunxi_spi_probe()2362 - [spi0]: driver probe succeed, base c8858000, irq 161
[ 0.130984] sunxi_spi_probe()2281 - [spi1] SPI MASTER MODE
[ 0.131042] sunxi_spi_request_gpio()1909 - [spi1] Pinctrl init spi1
[ 0.131108] sunxi_spi_clk_init()1959 - [spi1] mclk 100000000
[ 0.131564] spi spi1: master is unqueued, this is deprecated
[ 0.131589] sunxi_spi_probe()2362 - [spi1]: driver probe succeed, base c885a000, irq 162
[ 0.131997] usbcore: registered new interface driver usbfs
[ 0.132084] usbcore: registered new interface driver hub
[ 0.132186] usbcore: registered new device driver usb
[ 0.134569] Bluetooth: Core ver 2.22
[ 0.134653] NET: Registered protocol family 31
[ 0.134657] Bluetooth: HCI device and connection manager initialized
[ 0.134672] Bluetooth: HCI socket layer initialized
[ 0.134681] Bluetooth: L2CAP socket layer initialized
[ 0.134712] Bluetooth: SCO socket layer initialized
[ 0.135934] clocksource: Switched to clocksource arch_sys_counter
[ 0.149998] get androidboot.mode fail
[ 0.150011] sunxi_i2c_adap_init()2476 - init
[ 0.150855] NET: Registered protocol family 2
[ 0.151499] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.151520] TCP bind hash table entries: 1024 (order: 1, 8192 bytes)
[ 0.151539] TCP: Hash tables configured (established 1024 bind 1024)
[ 0.151588] UDP hash table entries: 256 (order: 1, 8192 bytes)
[ 0.151615] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
[ 0.151813] NET: Registered protocol family 1
[ 0.152001] sunxi budget cooling probe start !
[ 0.152019] CPU freq cooling register Success
[ 0.152029] CPU hotplug cooling register Success
[ 0.152248] CPU budget cooling register Success
[ 0.154117] workingset: timestamp_bits=30 max_order=15 bucket_order=0
[ 0.163241] io scheduler noop registered
[ 0.163475] io scheduler cfq registered (default)
[ 0.172248] uart0: ttyS0 at MMIO 0x5000000 (irq = 157, base_baud = 1500000) is a SUNXI
[ 0.172275] sw_console_setup()1724 - console setup baud 115200 parity n bits 8, flow n
[ 0.172318] console [ttyS0] enabled
[ 0.172323] bootconsole [earlycon0] disabled
[ 0.173182] misc dump reg init
[ 0.174276] m25p80 spi0.0: mx25l12835f (16384 Kbytes) normal
[ 0.174298] 5 cmdlinepart partitions found on MTD device spi0.0
[ 0.174303] Creating 5 MTD partitions on "spi0.0":
[ 0.174312] 0x000000000000-0x000000060000 : "uboot"
[ 0.175715] 0x000000060000-0x000000070000 : "env"
[ 0.177132] 0x000000070000-0x000000080000 : "dtb"
[ 0.178454] 0x000000080000-0x000000780000 : "kernel"
[ 0.179842] 0x000000780000-0x000001000000 : "rootfs"
[ 0.181199] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.181372] get drv_vbus is fail, 84
[ 0.181377] get ehci0-controller, regulator_io is no nocare
[ 0.181381] get ehci0-controller wakeup-source is fail.
[ 0.181491] sunxi ehci0-controller don't init wakeup source
[ 0.181502] [sunxi-ehci0]: probe, pdev->name: 5101000.ehci0-controller, sunxi_ehci: 0xc05c96f8, 0x:c886a000, irq_no:9f
[ 0.181555] sunxi-ehci 5101000.ehci0-controller: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.181590] sunxi-ehci 5101000.ehci0-controller: new USB bus registered, assigned bus number 1
[ 0.181718] sunxi-ehci 5101000.ehci0-controller: irq 159, io mem 0xc056d83c
[ 0.206121] sunxi-ehci 5101000.ehci0-controller: USB 0.0 started, EHCI 1.00
[ 0.207193] hub 1-0:1.0: USB hub found
[ 0.207237] hub 1-0:1.0: 1 port detected
[ 0.207691] [ehci0-controller]: sunxi_usb_disable_ehci
[ 0.207699] [sunxi-ehci0]: remove, pdev->name: 5101000.ehci0-controller, sunxi_ehci: 0xc05c96f8
[ 0.207717] sunxi-ehci 5101000.ehci0-controller: remove, state 1
[ 0.207737] usb usb1: USB disconnect, device number 1
[ 0.208791] sunxi-ehci 5101000.ehci0-controller: USB bus 1 deregistered
[ 0.209099] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 0.209290] get drv_vbus is fail, 84
[ 0.209295] get ohci0-controller, regulator_io is no nocare
[ 0.209299] get ohci0-controller wakeup-source is fail.
[ 0.209398] sunxi ohci0-controller don't init wakeup source
[ 0.209455] [sunxi-ohci0]: probe, pdev->name: 5101000.ohci0-controller, sunxi_ohci: 0xc05c8e98
[ 0.209504] sunxi-ohci 5101000.ohci0-controller: SW USB2.0 'Open' Host Controller (OHCI) Driver
[ 0.209539] sunxi-ohci 5101000.ohci0-controller: new USB bus registered, assigned bus number 1
[ 0.209607] sunxi-ohci 5101000.ohci0-controller: irq 160, io mem 0xc04420a4
[ 0.280912] hub 1-0:1.0: USB hub found
[ 0.280956] hub 1-0:1.0: 1 port detected
[ 0.281382] [ohci0-controller]: sunxi_usb_disable_ohci
[ 0.281390] [sunxi-ohci0]: remove, pdev->name: 5101000.ohci0-controller, sunxi_ohci: 0xc05c8e98
[ 0.281396] sunxi-ohci 5101000.ohci0-controller: remove, state 1
[ 0.281420] usb usb1: USB disconnect, device number 1
[ 0.282222] sunxi-ohci 5101000.ohci0-controller: USB bus 1 deregistered
[ 0.282576] usb_serial_number:20080411
[ 0.283491] input: sunxi-keyboard as /devices/virtual/input/input0
[ 0.284598] sunxi-rtc rtc: rtc core: registered sunxi-rtc as rtc0
[ 0.284607] sunxi-rtc rtc: RTC enabled
[ 0.285248] i2c /dev entries driver
[ 0.285315] Bluetooth: HCI UART driver ver 2.2.d448471.20181218-163903
[ 0.285320] Bluetooth: HCI H4 protocol initialized
[ 0.285324] Bluetooth: HCI Realtek H5 protocol initialized
[ 0.286644] cpuidle: enable-method property 'psci' found operations
[ 0.286978] cpuidle: enable-method property 'psci' found operations
[ 0.288043] sunxi-mmc sdc1: SD/MMC/SDIO Host Controller Driver(v3.29 2019-8-6 19:27)
[ 0.288139] sunxi-mmc sdc1: Can't get vmmc regulator string
[ 0.288145] sunxi-mmc sdc1: Can't get vqmmc regulator string
[ 0.288150] sunxi-mmc sdc1: Can't get vdmmc regulator string
[ 0.288155] sunxi-mmc sdc1: Can't get vdmmc33sw regulator string
[ 0.288159] sunxi-mmc sdc1: Can't get vdmmc18sw regulator string
[ 0.288164] sunxi-mmc sdc1: Can't get vqmmc33sw regulator string
[ 0.288168] sunxi-mmc sdc1: Can't get vqmmc18sw regulator string
[ 0.288173] sunxi-mmc sdc1: Failed getting OCR mask: 0
[ 0.288482] sunxi-mmc sdc1: set host busy
[ 0.288488] sunxi-mmc sdc1: ***set host ocr***
[ 0.288531] mmc:failed to get gpios
[ 0.292641] sunxi-mmc sdc1: sdc set ios:clk 0Hz bm PP pm UP vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 0.316042] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 0.345953] sunxi-mmc sdc1: detmode:manually by software
[ 0.346803] sunxi_get_str_of_property()1561 - failed to get the string of propname led_regulator!
[ 0.356835] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 0.359302] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B
[ 0.361193] sunxi-mmc sdc1: smc 0 p1 err, cmd 8, RTO !!
[ 0.367459] sunxi-mmc sdc1: card claims to support voltages below defined range
[ 0.377489] sunxi-mmc sdc1: sdc set ios:clk 400000Hz bm PP pm ON vdd 21 width 1 timing SD-HS(SDR25) dt B
[ 0.377589] sunxi-mmc sdc1: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 1 timing SD-HS(SDR25) dt B
[ 0.377713] sunxi-mmc sdc1: sdc set ios:clk 50000000Hz bm PP pm ON vdd 21 width 4 timing SD-HS(SDR25) dt B
[ 0.378483] mmc0: new high speed SDIO card at address 0001
[ 0.385576] sunxi_led_probe()1759 - finish
[ 0.385900] hidraw: raw HID events driver (C) Jiri Kosina
[ 0.386201] usbcore: registered new interface driver usbhid
[ 0.386205] usbhid: USB HID core driver
[ 0.386272] Netfilter messages via NETLINK v0.30.
[ 0.386454] nf_conntrack version 0.5.0 (2048 buckets, 8192 max)
[ 0.386721] ctnetlink v0.93: registering with nfnetlink.
[ 0.386901] ipip: IPv4 and MPLS over IPv4 tunneling driver
[ 0.387559] gre: GRE over IPv4 demultiplexor driver
[ 0.387565] ip_gre: GRE over IPv4 tunneling driver
[ 0.388990] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 0.389205] Initializing XFRM netlink socket
[ 0.389233] NET: Registered protocol family 17
[ 0.389311] 8021q: 802.1Q VLAN Support v1.8
[ 0.391062] Registering SWP/SWPB emulation handler
[ 0.394224] get usb_detect_mode is fail, 22
[ 0.394231] get det_vbus is fail, 84
[ 0.394234] get id is fail, 84
[ 0.394617] sunxi-rtc rtc: hctosys: unable to read the hardware clock
[ 0.408411] VFS: Mounted root (cramfs filesystem) readonly on device 31:4.
[ 0.408481] devtmpfs: mounted
[ 0.408870] Freeing unused kernel memory: 252K
[ 0.408873] This architecture does not have kernel memory protection.
[ 0.416959] random: fast init done
----------------------------------------------------
以下是原始帖子内容(上午)
之前逆向了全志闭源的fes1
https://whycan.com/t_7448.html
现在已经重写出了bootloader然后实现了linux的快速启动
目前是上电 ~1.957 秒进入shell (如果不启用网络协议栈是 ~1.3秒)
由此可见全志linux是可以做到快速启动的…
他的BROM也没拖后腿(0 ms),如果是SBROM可能会长一些,后面再测
之前我在iMX6ULL上实现的是 ~1.67秒,看来全志还可以在优化优化。
平台: 全志R328-S3 (128MB DDR3)
NOR: MX25L12835F (DUAL 50MHz)
内核:Tina SDK r328_s3_std 默认kernel配置基础上,启用了 SPINOR 配置,禁用了 SPINAND。没做其他优化。
下面是带时间戳的串口日志
[13-02-20.823]BOOTROM elapsed 0 ms
[13-02-20.823]
[13-02-20.823]
[13-02-20.823]-Hardcore Boot-
[13-02-20.823]
[13-02-20.823]Rev 11, Build Dec 8 2021 11:05:25
[13-02-20.823]mengxp works 2021
[13-02-20.823]
[13-02-20.844]CPU: Allwinner R328-S3
[13-02-20.844]DRAM: DDR3 128 MB, 792 MHz
[13-02-20.844]NOR: C22018(JEDEC ID)
[13-02-20.844]
[13-02-20.861]> Setup MMU
[13-02-20.861]> Load Optee
[13-02-20.876]> Load DeviceTree
[13-02-20.876]> Load Kernel
[13-02-21.213]> Open FDT
[13-02-21.213]> Setup FDT
[13-02-21.213]> Boot kernel
[13-02-21.276]Uncompressing Linux... done, booting the kernel.
[13-02-21.287][ 0.000000] Booting Linux on physical CPU 0x0
[13-02-21.292][ 0.000000] Linux version 4.9.118 (meng@u14aw) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #5 SMP Wed Dec 8 12:55:35 CST 2021
[13-02-21.306][ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[13-02-21.319][ 0.000000] CPU: div instructions available: patching division code
[13-02-21.319][ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[13-02-21.323][ 0.000000] OF: fdt:Machine model: sun8iw18
[13-02-21.341][ 0.000000] bootconsole [earlycon0] enabled
[13-02-21.357][ 0.001122] /cpus/cpu@0 missing clock-frequency property
[13-02-21.372][ 0.006547] /cpus/cpu@1 missing clock-frequency property
[13-02-21.660][ 0.306975] mmc:failed to get gpios
[13-02-21.735][ 0.375120] sunxi_get_str_of_property()1561 - failed to get the string of propname led_regulator!
[13-02-21.735][ 0.375160] sunxi-mmc sdc1: smc 0 p1 err, cmd 52, RTO !!
[13-02-21.757][ 0.391824] sunxi-mmc sdc1: smc 0 p1 err, cmd 52, RTO !!
[13-02-21.757][ 0.402291] sunxi-mmc sdc1: smc 0 p1 err, cmd 8, RTO !!
[13-02-21.767][ 0.408969] sunxi-mmc sdc1: smc 0 p1 err, cmd 5, RTO !!
[13-02-21.767][ 0.415635] sunxi-mmc sdc1: smc 0 p1 err, cmd 5, RTO !!
[13-02-21.784][ 0.422300] sunxi-mmc sdc1: smc 0 p1 err, cmd 5, RTO !!
[13-02-21.784][ 0.428973] sunxi-mmc sdc1: smc 0 p1 err, cmd 5, RTO !!
[13-02-21.788][ 0.435643] sunxi-mmc sdc1: smc 0 p1 err, cmd 55, RTO !!
[13-02-21.799][ 0.442409] sunxi-mmc sdc1: smc 0 p1 err, cmd 55, RTO !!
[13-02-21.800][ 0.449172] sunxi-mmc sdc1: smc 0 p1 err, cmd 55, RTO !!
[13-02-21.821][ 0.455936] sunxi-mmc sdc1: smc 0 p1 err, cmd 55, RTO !!
[13-02-21.837][ 0.469110] write_efuse_to_reg_ver_3:reading calibration data0 is zero
[13-02-21.837][ 0.480761] sunxi-rtc rtc: hctosys: unable to read the hardware clock
[13-02-22.398]Starting fstab.
[13-02-22.428]Starting syslogd.
[13-02-22.447]Starting lo.
[13-02-22.447]
[13-02-22.447]Processing /etc/profile...
[13-02-22.780]root@r328:/#
谢谢大佬分享,想请教一个问题,auto_set_timing_para这个函数里面的ddr参数时怎么一个个对应起来的呢?
看起来像参照的主线uboot的代码,不知道能不能分享下思路呢?
所有代码都是全志的,我只是做RE工程。
DRAM控制器的寄存器定义是不开放的,usermanual里面都没有,所以很多dram初始化代码只能抄。
你问的那些时序参数都是DDR的标准,可以查询DDR spec手册。每家的dram颗粒时序可能不一样。
他这个代码应该是比较低配的初始化代码,用来适配绝大多数DRAM时序。
一开始我也以为主线uboot代码是全志的,但其实主线uboot代码也是抄的官方代码,或是参考了sdk中开放的早期soc的boot0代码。
全志并不参与维护主线uboot。
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
页次: 1