恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9794|回复: 48

每台openwrt路由器都是编程器,wndr 4300 v1 当做Nand 编程器刷写ARM 机器的固件

    [复制链接]
发表于 2020-1-5 14:36 | 显示全部楼层 |阅读模式
本帖最后由 jiuweiljp 于 2020-6-29 07:41 编辑

本文的方法,不是在bootload中进行的,而是在openwrt中操作的,所以只要是能运行openwrt的机器及有nand flash的机器都可以。

第二篇已出 每台openwrt路由器都是编程器(二),大麦DW33D 当做Nand 编程器

一、使用环境
      1、编程的设备 WNDR 4300 v1
      2、系统:openwrt (最好是openwrt.org 发布的正式版本,因为要装一些软件,这些软件需要核心支持)
      3、目标机器:三层智能交换机 应该是arm 的cpu (这种机器有两台,一台能正常运行,一台不行)

二、限制条件

     1、编程的设备能运行openwrt;
     2、不同cpu之间救砖,必须要有目标设备的能用的nand flash,(必须是flash芯片不是文件);
     3、编程的设备用的flash与目标机用的flash结构大体相同(容量大小不同问题不大);

解释下:nand有自己的结构,也有数据位的区别有16bit的(很少用),8bit(绝大部分都用这种),还有一种1bit的(就是传说中的 spi接口nand,8针脚)

(1)美光2Gb(256MByte)的结构
m2.png

(2)
美光1Gb(128MByte)的结构
m1.png

(3)东芝
2Gb(256MByte)的结构
t2.png

这里只列举3个nand的结构可以发现他们的基本结构相同一个page 都是(2048+64)byte,一个block都是(128k+4k)byte

(4)下面的东芝TC58NVG0S3HTA00就不能用了它的一个page是(2048+128)byte,
一个block是(128k+8kbyte
t1.png

所以操作前一定要查查技术手册,为什么说这么多,因为我的wdnr 4300 是美光的芯片(128MB),而目标机用的是东芝TC58NVG1S3ETA00,
大家不要太担心很多机器用的nand flash 基本通用,绝大部分都是
page(2048+128)byte,block(128k+8kbyte。

我在X宝上买了几种芯片除了
TC58BVG0S3HTA00刷写后不能用以外都能用,不列举了看图吧
tb.png

三、硬件改造

参考帖:
https://www.anywlan.com/thread-412270-1-2.html?_dsign=30e03a32
https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=170402
https://www.right.com.cn/forum/thread-465595-1-1.html
在我记忆中本论坛有一个帖子说用4300刷博通芯片的机器,不能启动。(我也注意到这点了)。

这里注意有一种贴片座,个人认为这个基本不能用,太难
了,动不动这个座子的脚就连在一起了,焊盘都弄坏了,只有刮电路板了。
P91228-175206.jpg P91228-215112.jpg


四、遇到的困难
       1、breed不能对我的目标机器的flash 进行操作(读写都不行)breed的作者已经不对AR9344的bootload做更新了

  1. breed启动能知道安装的是toshiba的芯片
  2. ----------------------------------
  3. DRAM: 128MB
  4. Platform: Atheros AR9344 rev 2
  5. Board: Netgear WNDR4300/WNDR3700v4
  6. Clocks: CPU: 560MHz, DDR: 450MHz, AHB: 225MHz, Ref: 40MHz
  7. ath79-nand: NAND Parameter page read failed
  8. Flash: Toshiba NAND 256MiB 3.3V 8-bit (256MB) on ath79-nand
  9. Flash: Spansion S25FL032A (4MB) on ath79-spi.0
  10. ag71xx-eth: MAC address is invalid, using default settings.
  11. ag71xx-eth: Using MAC address 00:13:74:00:00:01
  12. Waiting for auto-negotiation complete ... OK
  13. eth0: Atheros AR8327/AR8328 rev 4
  14. -----------------------------------
  15. 读toshiba 芯片的内容
  16. -----------------------------------
  17. breed> flash bank 0 dump 0x0 0x800
  18. ath79-nand: ECC read error at 0x00000000, ecc = 426
  19. ath79-nand: ECC read error at 0x00000000, ecc = 426
  20. ath79-nand: ECC read error at 0x00000000, ecc = 426
  21. ath79-nand: ECC read error at 0x00000000, ecc = 426
  22. ath79-nand: ECC read error at 0x00000000, ecc = 426
  23. ath79-nand: operation failure at 0x00000000
  24. Another operation is in progress

复制代码

       2、ar9344的cpu 不认识toshiba的flash,我们知道能支持nand flash芯片的cpu内部都有一个bootrom,作用是好像能简单初始化内存,然后将nand的内容读到ram中运行
  1. find_hif: bootstrap = 0xaf055a
  2. WASP BootROM Ver. 1.1
  3. Nand Flash init
  4. Unknown Nand device: 0x15 90 da 98 0
  5. find_hif: bootstrap = 0xaf055a
  6. WASP BootROM Ver. 1.1
  7. Nand Flash init
  8. Unknown Nand device: 0x15 90 da 98 0
  9. -----------------------------------------
  10. 正常情况是这样的(美光芯片)
  11. -------------------------------------------
  12. find_hif: bootstrap = 0xaf055a
  13. WASP BootROM Ver. 1.1
  14. Nand Flash init
  15. ONFI: Control setting = 0xb44
  16. hdr: [0xbd004000 : 0xbd004000 : 0x3000 : 0xc200e86c]
  17. nand_load_fw: read 6 pages
  18. nand_load_fw: 0x10000 0x800 0xbd0047f0
  19. nand_load_fw: 0x20000 0x800 0xbd004ff0
  20. nand_load_fw: 0x30000 0x800 0xbd0057f0
  21. nand_load_fw: 0x40000 0x800 0xbd005ff0
  22. nand_load_fw: 0x50000 0x800 0xbd0067f0
  23. f/w 0 read complete, jumping to 0xbd004000
  24. initialize PLL & DDR
复制代码
五、解决办法
       启动到openwrt中对nand 的芯片读取并写入,使用热操作,
       1、启动openwrt后将装有openwrt nand flash卸下来
       2、将目标机器的好flash装上去读出来
       3、将空白flash装上去然后写进去

下面的操作有一定风险理论上在所有机器上都能用,如果你的机器只有一个nand flash最好是先将你的flash 备份到另外一个flash上去且这个flash与原flash型号大小最好一样(能进系统就行),如果误操作真的是能砖的 !!!
   
     我用的openwrt版本是 lede17.01.7 版本不限最好是能找到原的发行版
     1、将软件源刷出来
  1. opkg update
复制代码

     2、安装软件
     这里面
usbreset usbutils pciutils 不是必须的
  1. opkg install kmod-fs-ntfs kmod-fs-msdos kmod-fs-ext4 kmod-mtd-rw nand-utils usbreset usbutils pciutils kmod-mtdtests kmod-usb-storage-extras atftp
复制代码
    3、找一个U盘插到机器中最好是有ext2或ext4分区的,插上U盘后的信息,
  1. [  407.649166] usb-storage 1-1:1.0: USB Mass Storage device detected
  2. [  407.656279] scsi host0: usb-storage 1-1:1.0
  3. [  407.661118] usbcore: registered new interface driver usb-storage
  4. [  408.846319] scsi 0:0:0:0: Direct-Access     SMI      USB DISK         1100 PQ: 0 ANSI: 4
  5. [  408.857484] sd 0:0:0:0: [sda] 15826944 512-byte logical blocks: (8.10 GB/7.55 GiB)
  6. [  408.867130] sd 0:0:0:0: [sda] Write Protect is off
  7. [  408.872070] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
  8. [  408.878510] sd 0:0:0:0: [sda] No Caching mode page found
  9. [  408.883916] sd 0:0:0:0: [sda] Assuming drive cache: write through
  10. [  408.918640]  sda: sda1 sda2
复制代码
      4、mount ext分区
  1. root@LEDE:/# mkdir /mnt/sda2
  2. root@LEDE:/# mount /dev/sda2 /mnt/sda2
  3. [  735.640179] EXT4-fs (sda2): couldn't mount as ext3 due to feature incompatibilities
  4. [  735.650553] EXT4-fs (sda2): mounting ext2 file system using the ext4 subsystem
  5. [  735.663300] EXT4-fs (sda2): warning: mounting unchecked fs, running e2fsck is recommended
  6. [  735.688802] EXT4-fs (sda2): mounted filesystem without journal. Opts: (null)
复制代码
   5、载入mtd-rw模块,使mtd分区能读写
         如果你不是发行版可以看我的这个帖子https://www.right.com.cn/forum/thread-471113-1-1.html
  1. root@LEDE:/# insmod mtd-rw.ko i_want_a_brick=1

  2. [ 1045.823812] mtd-rw: mtd0: setting writeable flag
  3. [ 1045.828510] mtd-rw: mtd1: setting writeable flag
  4. [ 1045.833253] mtd-rw: mtd2: setting writeable flag
复制代码
      6、查看你的分区结构,及分区地址
  1. root@LEDE:/#mnt/sda2# cat /proc/mtd

  2. dev:    size   erasesize  name
  3. mtd0: 00040000 00020000 "u-boot"
  4. mtd1: 00040000 00020000 "u-boot-env"
  5. mtd2: 00040000 00020000 "caldata"
  6. mtd3: 00080000 00020000 "pot"
  7. mtd4: 00200000 00020000 "language"
  8. mtd5: 00080000 00020000 "config"
  9. mtd6: 00300000 00020000 "traffic_meter"
  10. mtd7: 00200000 00020000 "kernel"
  11. mtd8: 01700000 00020000 "ubi"
  12. mtd9: 01900000 00020000 "firmware"
  13. mtd10: 00040000 00020000 "caldata_backup"
  14. mtd11: 0e000000 00020000 "reserved"</font>

  15. root@LEDE:/#dmesg

  16. [    0.814508] 0x000000000000-0x000000040000 : "u-boot"
  17. [    0.820993] 0x000000040000-0x000000080000 : "u-boot-env"
  18. [    0.828060] 0x000000080000-0x0000000c0000 : "caldata"
  19. [    0.834896] 0x0000000c0000-0x000000140000 : "pot"
  20. [    0.841278] 0x000000140000-0x000000340000 : "language"
  21. [    0.848231] 0x000000340000-0x0000003c0000 : "config"
  22. [    0.854990] 0x0000003c0000-0x0000006c0000 : "traffic_meter"
  23. [    0.862309] 0x0000006c0000-0x0000008c0000 : "kernel"
  24. [    0.869094] 0x0000008c0000-0x000001fc0000 : "ubi"
  25. [    0.875646] 0x0000006c0000-0x000001fc0000 : "firmware"
  26. [    1.236048] 0x000001fc0000-0x000002000000 : "caldata_backup"
  27. [    1.243220] 0x000002000000-0x000010000000 : "reserved"
复制代码
      可以看到从地址0x0 开始为mtd0-mtd1-mtd2-mtd3-mtd4-mtd5-mtd6-mtd9-mtd10-mtd11 地址是连续的
       一共是0x10000000 (256MB)
注:我觉得,没必要对256MB都拷贝,对前6个mtd操作就够了0x3c0000 大概3.8MB,我想没有人将bootload做这么大吧,有bootload后干什么不行啊。

开始干活:
   1、 先不要拆下启动openwrt的flash 芯片读一下它,如果直接读目标机器的flash 软件会报io错
  1. nanddump -c -l 0x800 /dev/mtd0

  2. 0x00000000: bd 00 40 00 bd 00 40 00 00 00 30 00 c2 00 e8 6c  |..@...@...0....l|
  3. 0x00000010: 27 bd ff e0 af b1 00 18 3c 11 b8 06 36 22 00 90  |'.......<...6"..|
  4. 。。。。。。
  5. 0x000007e0: 00 00 00 00 00 00 00 00 3c 0c 41 c0 3c 0d 42 80  |........<.A.<.B.|
  6. 0x000007f0: 0b 40 12 00 00 00 00 00 00 00 00 00 3c 0c 29 c0  |.@..........<.).|
复制代码
   2、卸下芯片
  特别注意:不要装反了,装反了烧芯片,最好是将弹跳座,和芯片上都标注下(我是用白点标注的)
P00105-165202.jpg
    仔细看,能看到我的芯片已经烧过了,还好美光的芯片抗造
  
  3、安装目标机能用的芯片后将数据读出来
     注x 为mtd的数字本机能用(0-11),-f 是读出到文件 ,-nf 是
读出到文件并忽略ecc ,-of 读出到文件并读取oob ,-nof 读出到文件并读取oob忽略ecc
     有枣没枣先弄一杆子,全读出来再说。
  1. nanddump -f 5280_toshiba_mtdx /dev/mtdx
  2. nanddump -nf 5280_toshiba_mtdx_noecc /dev/mtdx
  3. nanddump -of 5280_toshiba_mtdx_oob /dev/mtdx
  4. nanddump -nof 5280_toshiba_mtdx_oob_noecc /dev/mtdx
复制代码
读flash会报ecc错不用管他,我估计目标机器是小端结构的cpu,与ar9344的mips 大端结构不同
  1. root@LEDE:/mnt/sda2/test# nanddump -f 5280_toshiba_mtd0 /dev/mtd0
  2. ECC failed: 0
  3. ECC corrected: 0
  4. Number of bad blocks: 0
  5. Number of bbt blocks: 0
  6. Block size 131072, page size 2048, OOB size 64
  7. Dumping data starting at 0x00000000 and ending at 0x00040000...
  8. ECC: 1 uncorrectable bitflip(s) at offset 0x00000000
  9. ECC: 1 uncorrectable bitflip(s) at offset 0x00000800
  10. ECC: 1 uncorrectable bitflip(s) at offset 0x00001000
复制代码
可以看到带oob数据的文件大一些,多8192byte,262144/2048(page)=128page,128*64(oob/page)=8192byte
  1. root@LEDE:/mnt/sda2/test# ls -all
  2. drwxr-xr-x    2 root     root          1024 Jan  5 09:19 .
  3. drwxr-xr-x    6 root     root          1024 Jan  4 10:26 ..
  4. -rw-r--r--    1 root     root        262144 Jan  5 09:19 5280_toshiba_mtd1
  5. -rw-r--r--    1 root     root        262144 Jan  5 09:19 5280_toshiba_mtd1_noecc
  6. -rw-r--r--    1 root     root        270336 Jan  5 09:19 5280_toshiba_mtd1_oob
  7. -rw-r--r--    1 root     root        270336 Jan  5 09:19 5280_toshiba_mtd1_oob_noecc
复制代码
  4、写nand 前先擦除下它
  1. root@LEDE:/mnt/sda2/test# mtd erase /dev/mtd1
  2. Unlocking /dev/mtd1 ...
  3. Erasing /dev/mtd1 ...
复制代码
       看看擦除结果 全是FF
  1. root@LEDE:/mnt/sda2/test# nanddump -c -l 0x800 /dev/mtd1
  2. ECC failed: 256
  3. ECC corrected: 0
  4. Number of bad blocks: 0
  5. Number of bbt blocks: 0
  6. Block size 131072, page size 2048, OOB size 64
  7. Dumping data starting at 0x00000000 and ending at 0x00000800...
  8. 0x00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
  9. 0x00000010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
  10. 。。。。。。
  11. 0x00000090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
复制代码
5、写入nand falsh 我测试过不同的cpu之间只能加这样写(忽略ecc 并加oob)
  1. root@LEDE:/mnt/sda2/test# nandwrite -nom /dev/mtd1 5280_toshiba_mtd1_oob_noecc
  2. Writing data to block 0 at offset 0x0
  3. Writing data to block 1 at offset 0x20000
复制代码
6、校验下可以看到md5值相同这样就写成功了
  1. root@LEDE:/mnt/sda2/test# nanddump -nof back_test-mtd1_oob_noecc /dev/mtd1
  2. Block size 131072, page size 2048, OOB size 64
  3. Dumping data starting at 0x00000000 and ending at 0x00040000...

  4. root@LEDE:/mnt/sda2/test# md5sum *noecc
  5. 8c167dd40a3d7aa93623e2ff0e7d46d8  5280_toshiba_mtd1_noecc
  6. de9cc0ab070143690e329767c13b25c0  5280_toshiba_mtd1_oob_noecc
  7. de9cc0ab070143690e329767c13b25c0  back_test-mtd1_oob_noecc
复制代码

总结:breed 只能对同类型的cpu救砖、刷写固件(我估计的),wndr 4300还有32MB的限制,支持的nand 类型也不多(Toshiba 就不行),原cpu的bootrom连Toshiba芯片都不识别,(当初我不太清楚cpu中还带rom,准备自己修改网件开源的Uboot 让它支持toshiba nand)。nand的编程器都太贵了,wndr 4300 x鱼卖的包邮55,折腾了很长时间,才找到了这个办法,希望对大家有用。












  

评分

参与人数 4恩山币 +4 收起 理由
云帆 + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!
zhlmm19971128 + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!
SkyTiger + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!
chenpiqqqq + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-1-5 17:44 | 显示全部楼层
本帖最后由 jiuweiljp 于 2020-1-12 01:27 编辑

通知下,我的wndr 4300 nand控制器被静电弄坏了,在第7脚与第9脚间焊接了个2.2K的电阻(这是最高可用的电阻了,更高控制器不识别nand flash)。
发现一个现象,不知道这个现象是不是弄坏控制器产生的,大家注意下,现象是:
如果你启动时安装的是128MB的flash,在nanddump时不能dump 256MB的flash,
如果你启动时安装的是256MB的flash就可以dump 256MB和128MB的nand flash。


后期补充下:经测试ar9344的U在载入bootload时要对固件进行ecc检测
                    为此测试本人还下载了wndr 4300的源码重新编译了u-boot
                    在写入时使用nandwrite -nm  /dev/mtd0 u-boot.bin
                    故意不写入oob数据。
结果就是显示如下:
  1. find_hif: bootstrap = 0xaf055a
  2. WASP BootROM Ver. 1.1
  3. Nand Flash init
  4. ONFI: Control setting = 0xb45
  5. hdr: [0xbd004000 : 0xbd004000 : 0x3000 : 0xc200e86c]
  6. nand_load_fw: read 6 pages
  7. nand_load_fw: 0x10000 0x800 0xbd0047f0
  8. nand_load_fw: 0x20000 0x800 0xbd004ff0
  9. nand_load_fw: 0x30000 0x800 0xbd0057f0
  10. nand_load_fw: 0x40000 0x800 0xbd005ff0
  11. nand_load_fw: 0x50000 0x800 0xbd0067f0
  12. f/w 0 read complete, jumping to 0xbd004000
  13. initialize PLL & DDR

  14. sri
  15. Wasp 1.2
  16. Wasp (32bit) ddr2 init
  17. setting for 40
  18. fw1: Nand Init
  19. leave FW1
  20. f/w 0 execution complete
  21. hdr: [0xa0100000 : 0xa0100000 : 0x34800 : 0x34147113]
  22. nand_load_fw: read 105 pages
  23. nand_load_fw: 0x70000 0x800 0xa01007f0
  24. nand_load_fw: 0x80000 0x800 0xa0100ff0

  25. ...........
  26. nand_load_fw: 0x6d0000 0x800 0xa01337f0
  27. nand_load_fw: 0x6e0000 0x800 0xa0133ff0
  28. Checksum mismatch. 0x34147113 != 0x34147102
复制代码



我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-1-5 17:50 | 显示全部楼层
本帖最后由 jiuweiljp 于 2020-1-11 18:10 编辑

拆了光猫huawei hg8321 小板,吐槽下这个光猫没有板载内存,应该是片载内存(64MB)垃圾一个。
另外这个huawei 把u-boot存放的位置配置文件放置到很远(32MB以后),给复制带来了很大困难,在openwrt中也有内存限制
在4300的机器上不能直接复制/dev/mtd11(0x2000000-0x8000000,32MB-128MB),如果自接复制会造成缓冲溢出,
只能用nanddump分片断复制,并且复制了2段后要换上原启动时用的flash芯片,清理下缓存,然后换芯片复制第三段。写新的flash 芯片也同样。
希望大家能找到大内存(256MB以上最好512MB)的设备干着活,不然会烦死



就TM二个分区,第二个分区还很大(1MB-128MB)配置文件不知道在那个地址上
  1. SD511x chip id:0x51163100
  2. Special nand id table Version 1.33
  3. Hisilicon Nand Flash Controller V301 Device Driver, Version 1.10
  4. Nand ID: 0x2C 0xF1 0x80 0x95 0x02 0x00 0x00 0x00
  5. now using default nand flash type,Block:128KB Page:2KB!
  6. Nand(Hardware): Block:128KB Page:2KB Chip:128MB OOB:64B ECC:4bit
  7. NAND device: Manufacturer ID: 0x2c, Chip ID: 0xf1 (Micron default_nand_flash), 128MiB, page size: 2048, OOB size: 64
  8. NAND_ECC_NONE selected by board driver. This is not recommended!
  9. 3 cmdlinepart partitions found on MTD device hinand
  10. Creating 3 MTD partitions on "hinand":
  11. 0x000000000000-0x000000100000 : "startcode"
  12. 0x000000100000-0x000008000000 : "ubifs"
  13. 0x000008000000-0x000008000000 : "reserved"
  14. mtd: partition "reserved" is out of reach -- disabled
复制代码

arm v7的核心
  1. Booting Linux on physical CPU 0x0
  2. Linux version 3.10.53-HULK2 (ci@SZX1000044441) (gcc version 4.7.1 (SDK V100R005C00SPC030B050) ) #1 SMP Fri Dec 18 09:38:25 UTC 2015
  3. CPU: ARMv7 Processor [414fc091] revision 1 (ARMv7), cr=10c53c7d
  4. CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
  5. Machine: Hisilicon A9, model: HISI-CA9
复制代码


目标设备照片(可以看见没有板载内存)
h5.jpg


cpu是麒麟sd5116(应该是sd5116L)nand flash 128mb
h3.jpg

开机啥活没干内存占用85%
h1.jpg



  1. 原nand flash 启动信息(nand id 0x2C 0xF1 0x80 0x95 0x04 0x00 0x00 0x00 )
  2. ++++++++++++++++++++++++
  3. HuaWei StartCode 2012.02 (R16C10 Dec 03 2015 - 23:43:03)

  4. NAND:  Nand ID: 0x2C 0xF1 0x80 0x95 0x04 0x00 0x00 0x00
  5. NAND FLASH Enter Low Driver Mode
  6. ECC Match pagesize:2K, oobzie:64, ecctype:4bit
  7. Nand(Hardware): 128 MiB
  8. startcode select the uboot to load
  9. the high RAM is :8040103c
  10. startcode uboot boot count:0
  11. use the main slave_param area from flash, the RAM data is not OK!!!
  12. Use the UbootA to load first
  13. Use the UbootA to load success


  14. U-Boot 2010.03 (R16C10 Mar 18 2016 - 20:33:22)

  15. DRAM:  64 MB
  16. Boot From NAND flash
  17. Chip Type is SD5116L
  18. NAND:  Special Nand id table Version 1.23
  19. Nand ID: 0x2C 0xF1 0x80 0x95 0x04 0x00 0x00 0x00
  20. NAND FLASH Enter Low Driver Mode
  21. ECC Match pagesize:2K, oobzie:64, ecctype:4bit
  22. Nand(Hardware): Block:128KB Page:2KB Chip:128MB*1 OOB:64B ECC:4bit
  23. 128 MiB
  24. Using default environment

  25. In:    serial
  26. Out:   serial
  27. Err:   serial
  28. PHY power down !!!
  29. [main.c__6080]::CRC:0x3d80a8b4, Magic1:0x5a5a5a5a, Magic2:0xa5a5a5a5, count:0, CommitedArea:0x0, Active:0x0, RunFlag:0x0
  30. Start from main system(0x0)!
  31. CRC:0x3d80a8b4, Magic1:0x5a5a5a5a, Magic2:0xa5a5a5a5, count:1, CommitedArea:0x0, Active:0x0, RunFlag:0x0
  32. 0x000000100000-0x000008000000 : "mtd=1"
  33. UBI: attaching mtd1 to ubi0
  34. Main area (A) is OK!
  35. CRC:0x93e83925, Magic1:0x5a5a5a5a, Magic2:0xa5a5a5a5, count:1, CommitedArea:0x0, Active:0x0, RunFlag:0x0
  36. Bootcmd:ubi read 0x82c00000 kernelA 0x19c372; bootm 0x82c00054
  37. BootArgs:noalign mem=59M console=ttyAMA1,115200 ubi.mtd=1 root=/dev/mtdblock11 rootfstype=squashfs mtdparts=hinand:0x100000(startcode),0x7f00000(ubifs),-(reserved) pcie0_sel=x1 maxcpus=0 l2_cache=off user_debug=0x1f panic=1 skb_priv=128 debug_ll=on
  38. U-boot Start from NORMAL Mode!
  39. ## Booting kernel from Legacy Image at 82c00054 ...
  40.    Image Name:   Linux-3.10.53-HULK2
  41.    Image Type:   ARM Linux Kernel Image (uncompressed)
  42.    Data Size:    1688286 Bytes =  1.6 MB
  43.    Load Address: 80e08000
  44.    Entry Point:  80e08000
  45.    Memory Start: 80500000
  46.    Loading Kernel Image ... OK
  47. OK
  48.    kernel loaded at 0x80508000, end = 0x806a42de
  49. --------------------------------------------------------------

  50. 拷贝了前32MB后的启动信息2个flash
  51. (id: 0x01 0xF1 0x00 0x1D 0x01 0xF1 0x00 0x1D, 0x2C 0xF1 0x80 0x95 0x02 0x00 0x00 0x00)
  52. 只能启动一半(TMD 华X)
  53. +++++++++++++++++++++
  54. HuaWei StartCode 2012.02 (R16C10 Dec 03 2015 - 23:43:03)

  55. NAND:  Nand ID: 0x01 0xF1 0x00 0x1D 0x01 0xF1 0x00 0x1D
  56. ECC Match pagesize:2K, oobzie:64, ecctype:4bit
  57. Nand(Hardware): 128 MiB
  58. startcode select the uboot to load
  59. the high RAM is :8040103c
  60. startcode uboot boot count:0
  61. Slave struct initializtion success!!
  62. Use the UbootA to load first
  63. Start from UbootA ERROR, Change to UbootB
  64. Both UbootA and UbootB are wrong, load it by JTAG!

  65. ================================
  66. HuaWei StartCode 2012.02 (R16C10 Dec 03 2015 - 23:43:03)

  67. NAND:  Nand ID: 0x2C 0xF1 0x80 0x95 0x02 0x00 0x00 0x00
  68. now using default nand flash type, Block:128KB Page:2KB!
  69. ECC Match pagesize:2K, oobzie:64, ecctype:4bit
  70. Nand(Hardware): 128 MiB
  71. startcode select the uboot to load
  72. the high RAM is :8040103c
  73. startcode uboot boot count:0
  74. Slave struct initializtion success!!
  75. Use the UbootA to load first
  76. Start from UbootA ERROR, Change to UbootB
  77. Both UbootA and UbootB are wrong, load it by JTAG!

  78. ----------------------------------------------------------------------

  79. 完全复制原片flash 后的启动信息(nand id:0x2C 0xF1 0x80 0x95 0x02 0x00 0x00 0x00)
  80. +++++++++++++++++++++++++++++++++++
  81. HuaWei StartCode 2012.02 (R16C10 Dec 03 2015 - 23:43:03)

  82. NAND:  Nand ID: 0x2C 0xF1 0x80 0x95 0x02 0x00 0x00 0x00
  83. now using default nand flash type, Block:128KB Page:2KB!
  84. ECC Match pagesize:2K, oobzie:64, ecctype:4bit
  85. Nand(Hardware): 128 MiB
  86. startcode select the uboot to load
  87. the high RAM is :8040103c
  88. startcode uboot boot count:0
  89. use the main slave_param area from flash, the RAM data is not OK!!!
  90. Use the UbootA to load first
  91. Use the UbootA to load success

  92. U-Boot 2010.03 (R16C10 Mar 18 2016 - 20:33:22)

  93. DRAM:  64 MB
  94. Boot From NAND flash
  95. Chip Type is SD5116L
  96. NAND:  Special Nand id table Version 1.23
  97. Nand ID: 0x2C 0xF1 0x80 0x95 0x02 0x00 0x00 0x00
  98. now using default nand flash type, Block:128KB Page:2KB!
  99. ECC Match pagesize:2K, oobzie:64, ecctype:4bit
  100. Nand(Hardware): Block:128KB Page:2KB Chip:128MB*1 OOB:64B ECC:4bit
  101. 128 MiB
  102. Using default environment

  103. In:    serial
  104. Out:   serial
  105. Err:   serial
  106. PHY power down !!!
  107. [main.c__6080]::CRC:0x3d80a8b4, Magic1:0x5a5a5a5a, Magic2:0xa5a5a5a5, count:0, CommitedArea:0x0, Active:0x0, RunFlag:0x0
  108. Start from main system(0x0)!
  109. CRC:0x3d80a8b4, Magic1:0x5a5a5a5a, Magic2:0xa5a5a5a5, count:1, CommitedArea:0x0, Active:0x0, RunFlag:0x0
  110. 0x000000100000-0x000008000000 : "mtd=1"
  111. UBI: attaching mtd1 to ubi0
复制代码

使用命令
1、读取原芯片命令前10个分区没有什么问题
  1. nanddump -nof hg8321_mt_mtd0_oob_noecc /dev/mtd0
  2. ....
  3. nanddump -nof hg8321_mt_mtd10_oob_noecc /dev/mtd10
复制代码
2、注意这个mtd11 要分片复制,并且在复制二个分区时
     要么重启路由,要么换原启动芯片清理缓存
   
2.1查看内存使用情况(重启后可用内存很多)
  1. root@LEDE:/# free
  2.                       total            used           free           shared     buffers       cached
  3. Mem:        125248        24364       100884           56           2048             6660
  4. -/+ buffers/cache:      15656     109592
  5. Swap:            0          0          0
复制代码
2.2 这条命令能看见使用情况
  1. root@LEDE:/# cat /proc/meminfo
  2. MemTotal:         125248 kB
  3. MemFree:          100884 kB
  4. MemAvailable:      81332 kB
  5. Buffers:            2048 kB
  6. Cached:             6660 kB
  7. SwapCached:            0 kB
  8. Active:             5904 kB
  9. Inactive:           3828 kB
  10. Active(anon):       1056 kB
  11. Inactive(anon):       24 kB
  12. Active(file):       4848 kB
  13. Inactive(file):     3804 kB
  14. Unevictable:           0 kB
  15. Mlocked:               0 kB
  16. SwapTotal:             0 kB
  17. SwapFree:              0 kB
  18. Dirty:                 0 kB
  19. Writeback:             0 kB
  20. AnonPages:          1032 kB
  21. Mapped:             1744 kB
  22. Shmem:                56 kB
  23. Slab:               7452 kB
  24. SReclaimable:       1392 kB
  25. SUnreclaim:         6060 kB
  26. KernelStack:         400 kB
  27. PageTables:          216 kB
  28. NFS_Unstable:          0 kB
  29. Bounce:                0 kB
  30. WritebackTmp:          0 kB
  31. CommitLimit:       62624 kB
  32. Committed_AS:       3256 kB
  33. VmallocTotal:    1048372 kB
  34. VmallocUsed:           0 kB
  35. VmallocChunk:          0 kB
复制代码
2.3 清除缓存
  1. root@LEDE:/# echo 1 > /proc/sys/vm/drop_caches
  2. [ 4977.007841] ash (495): drop_caches: 1
复制代码
drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

2.4 复制mtd11用的命令
  1. nanddump -s 0x0 -l 0x2000000 -nof hg8321_mt_mtd11_1_oob_noecc /dev/mtd11
  2. nanddump -s 0x2000000 -l 0x2000000 -nof hg8321_mt_mtd11_2_oob_noecc /dev/mtd11
  3. nanddump -s 0x4000000 -l 0x2000000 -nof hg8321_mt_mtd11_3_oob_noecc /dev/mtd11
复制代码



3、换芯片后 擦除新nand flash

  1. mtd erase /dev/mtd0
  2. ....
  3. mtd erase /dev/mtd11
复制代码

4、写如falsh用的命令
  1. nandwrite -on /dev/mtd0 hg8321_mt_mtd0_oob_noecc
  2. ......
  3. nandwrite -on /dev/mtd10 hg8321_mt_mtd10_oob_noecc
  4. ##mtd11 分片写入 TMD烦人啊
  5. nandwrite -s 0x0 -on /dev/mtd11 hg8321_mt_mtd11_1_oob_noecc
  6. nandwrite -s 0x2000000 -on /dev/mtd11 hg8321_mt_mtd11_2_oob_noecc
  7. nandwrite -s 0x4000000 -on /dev/mtd11 hg8321_mt_mtd11_3_oob_noecc
复制代码

   最后补充说明:
   花了点时间另外写了一份不带oob数据的flash

  1. <font size="4">nandwrite -n /dev/mtdX hg8321_mt_mtdX_noecc</font>
复制代码

(但心没有写好同时写了两个),在这台机器上启动结果是没有办法启动,什么提示也没有,看来这个onu在启动bootload过程中都要ecc校验
同时说明写oob数据是有效的,完美复制。

-------------------------
我的4300的nand 控制器挂了,应该被静电给弄坏了。。

评分

参与人数 1恩山币 +1 收起 理由
SkyTiger + 1 恩山全体路由党向你学习!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-5 19:44 | 显示全部楼层
开发竞斗云会不会更好呢?因为有双falsh

点评

多少钱,刚才X度了下没看清图片,好像有版本区别的  详情 回复 发表于 2020-1-5 20:23
来自苹果客户端来自苹果客户端
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-1-5 20:23 | 显示全部楼层
低叹生活 发表于 2020-1-5 19:44
开发竞斗云会不会更好呢?因为有双falsh

多少钱,刚才X度了下没看清图片,好像有版本区别的
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-5 21:26 | 显示全部楼层
坎坎坷坷扩
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 00:38 | 显示全部楼层
jiuweiljp 发表于 2020-1-5 20:23
多少钱,刚才X度了下没看清图片,好像有版本区别的

闲鱼120元

点评

2.0 版,还是 lite版本?  发表于 2020-1-6 11:14
来自苹果客户端来自苹果客户端
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 01:23 | 显示全部楼层
你遇到的各种问题,总结下来都是对NAND本身不熟,对NAND控制器不熟。有以下几点:

1. ECC 算法不符。
不同CPU的NAND控制器有不同的ECC算法,有些硬件不带ECC的,会使用软件ECC算法。
假定一个full page是刚erase过的,也就是包括oob区域都是ff。
假定此时开启了ECC,那么写入数据时(一个page,不含oob),那么NAND除了将这个page的数据写进去,还会对这个page的数据计算ecc校验码,并将其写入oob区域。
之后,要读取这个page的数据时,nand控制器会将两部分数据都读出来,通过ecc校验码检查page数据有没有出错,如果只有有限个(<=N)bit flip(位翻转),那么它可以将这个错误纠正。
不同的NAND控制器使用不同的ECC算法,因此对于相同数据,它们产生的ECC校验码也都不会相同。
如果你在A芯片上开启ECC后写进去了数据,在B芯片上也开启ECC并读取数据,那么就会出现ECC校验失败(翻转的bit太多),提示不可恢复的ECC错误。

针对你帖子里的描述:
AR9344是属于硬件自带ECC算法的。如果你替换上去的NAND原本使用的ECC算法跟AR9344自带的不同(与AR9344使用相同ECC算法的只有QCA9558,如果是ARM平台,那么99.99%不会相同),那么在breed/原厂uboot/固件mtd里面读取数据都会出现ECC错误。
跟你的机器时大小端序没有关系。

2. AR9344/QCA9558 的NAND控制器的特殊性。
这个NAND控制器有个奇葩的地方,就是会将每4个字节颠倒字节序后写进NAND,读取时也会改变字节序。这个毛病导致通过这个NAND控制器读取NAND的ONFI参数页时,都需要依次对每4个字节进行一次字节序转换。
我没见过有哪几家常用的NAND控制器会干这件事。
估计还是因为这个NAND控制器的IP core是Atheros买的,不是自己的,对接的时候没处理这个细节。

另外AR9344的NAND控制器极不稳定,时不时就不工作了。直到QCA9558这个问题才被修复。
针对AR9344的这个问题,驱动里面会不停对NAND控制器进行复位,对NAND芯片进行复位,以期它能重新正常工作。
因此你在操作NAND时出现读写速度突然变慢的情况,就是控制器出BUG了。
此外你接上TTL,观察机器从NAND启动时的log,就会发现BootROM一旦检测到NAND控制器出现BUG,就会对机器进行复位,重头再来。
这个现象很常见。我接手的两台WNDR3400v1都是相同的毛病,有时候能折腾1分钟才启动到kernel。

3. breed不是编程器软件。
breed的flash命令不支持RAW数据读写,因此你拿breed去读肯定是各种ECC错误。

4. 你如果真要这样做编程器,最好的方法就是读写都关闭ECC后再操作。
你帖子里的做法其实是将OOB留空,也就是关闭ECC后再写数据,OOB里面没有有效的ECC校验码。你这样的NAND拿到一个开了ECC的系统上去读,照样还是ECC错误。
解决方法是找到CPU的NAND控制器使用的ECC算法/或者厂商提供的ECC工具,对要写入的数据计算ECC校验码,并组合成一个包含page+oob的特殊格式的文件,通过写RAW数据+oob区的方式写入,这样才能实现你的目的,也就是写给另一个CPU用。
但是难点在于你很难获取到ECC算法。因为一个ECC算法如果能在相同大小的ECC校验码内纠正更多的位翻转,就说明这个ECC算法的纠错能力更强。强大的ECC算法都属于商业机密,厂商能给你一个编译好的ECC工具就不错了。

因此你这样折腾顶多就只能做成一个不支持ECC的原始编程器。

P.S.
我自己用MT7628的丰富的GPIO做过一个GPIO模拟NAND时序的NAND编程器,比AR9344稳定多了。

点评

感谢您能阅读本帖并回复,之前在别的帖子中的问题,您能很快回复,再次感谢!!! 仔细阅读了您的回复,学习了不少知识盲点,本人小白,碰到问题后才上网查资料,有些东西连蒙带猜。肯定有不少错误。 一、回帖中  详情 回复 发表于 2020-1-6 10:58
大神出现,字字都是宝贵经验啊  发表于 2020-1-6 08:51
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-1-6 10:58 | 显示全部楼层
本帖最后由 jiuweiljp 于 2020-1-6 11:05 编辑
hackpascal 发表于 2020-1-6 01:23
你遇到的各种问题,总结下来都是对NAND本身不熟,对NAND控制器不熟。有以下几点:

1. ECC 算法不符。

感谢您能阅读本帖并回复,之前在别的帖子中的问题,您能很快回复,再次感谢!!!
仔细阅读了您的回复,学习了不少知识盲点,本人小白,碰到问题后才上网查资料,有些东西连蒙带猜。肯定有不少错误。

一、回帖中的第二点:
---------
2. AR9344/QCA9558 的NAND控制器的特殊性。
这个NAND控制器有个奇葩的地方,就是会将每4个字节颠倒字节序后写进NAND,读取时也会改变字节序。这个毛病导致通过这个NAND控制器读取NAND的ONFI参数页时,都需要依次对每4个字节进行一次字节序转换。
---------
是不是可以理解AR9344 nand控制器为读的时候4字节翻过来,写的时候再倒回去,对实际的操作没有影响。

二、回帖的第4点:
---------
  4. 你如果真要这样做编程器,最好的方法就是读写都关闭ECC后再操作。
你帖子里的做法其实是将OOB留空,也就是关闭ECC后再写数据,OOB里面没有有效的ECC校验码。你这样的NAND拿到一个开了ECC的系统上去读,照样还是ECC错误。
---------
    2.1 按照nanddump 及nandwrite的帮助,我的做法应该是dump时忽略ecc并读取oob数据,write时忽略ecc并写oob,新的nand flash 中oob数据并没有留空。(不知道我理解nanddump及nandwrite 的帮助有没错误)。
    2.2 不知道目标机器开没开ecc,那个有问题的目标机器(ARM CPU)在这样操作后能启动新写进的nand flash。
  1. <font size="1">root@LEDE:/mnt/sda2/test# nanddump
  2. Usage: nanddump [OPTIONS] MTD-device
  3. Dumps the contents of a nand mtd partition.

  4. -h             --help                 Display this help and exit
  5.                 --version             Output version information and exit
  6.                 --bb=METHOD    Choose bad block handling method (see below).
  7. -a             --forcebinary       Force printing of binary data to tty
  8. -c             --canonicalprint    Print canonical Hex+ASCII dump
  9. -f file        --file=file             Dump to file
  10. -l length    --length=length   Length
  11. -n             --noecc               Read without error correction
  12.                 --omitoob            Omit OOB data (default)
  13. -o             --oob                  Dump OOB data
  14. -p             --prettyprint         Print nice (hexdump)
  15. -q             --quiet                 Don't display progress and status messages
  16. -s addr       --startaddress=addr   Start address</font>
复制代码
  1. <font size="1">root@LEDE:/mnt/sda2/test# nandwrite
  2. Usage: nandwrite [OPTION] MTD_DEVICE [INPUTFILE|-]
  3. Writes to the specified MTD device.

  4.   -a,         --autoplace              Use auto OOB layout
  5.   -m,        --markbad               Mark blocks bad if write fails
  6.   -n,         --noecc                   Write without ecc
  7.   -N,         --noskipbad            Write without bad block skipping
  8.   -o,         --oob                      Input contains oob data
  9.   -O,         --onlyoob                Input contains oob data and only write the oob part
  10.   -s addr,   --start=addr           Set output start address (default is 0)
  11.   -p,          --pad                     Pad writes to page size
  12.   -b,          --blockalign=1|2|4      Set multiple of eraseblocks to align to
  13.               --input-skip=length     Skip |length| bytes of the input file
  14.               --input-size=length     Only read |length| bytes of the input file
  15.   -q,           --quiet                      Don't display progress messages
  16.   -h,           --help                       Display this help and exit
  17.               --version                   Output version information and exit</font>
复制代码


三、另外回帖中提到:
----------
因此你这样折腾顶多就只能做成一个不支持ECC的原始编程器。
---------
按照您回复中提到的ecc属于机密,各家还不同,市面上的编程器的上位机软件没有那么牛x吧,能将不同的对象cpu的ecc校验算法也能做进去,编程器也只能有什么写什么。

四、回帖中提到:
------
我自己用MT7628的丰富的GPIO做过一个GPIO模拟NAND时序的NAND编程器,比AR9344稳定多了
------
我估计需要十多个gpio吧,什么板有这么多空余的gpio,是开发板吧?
那个上位机软件是开源的吧就像您另外的帖子中说的用gpio使用openocd操作jtag,能不能介绍下。呵呵

点评

编程器都是硬拷贝,不对数据做更改  详情 回复 发表于 2020-1-11 10:54
是不是可以理解AR9344 nand控制器为读的时候4字节翻过来,写的时候再倒回去,对实际的操作没有影响。 --> 对AR9344的实际操作没有影响,对这之外的就不一定了。因为别的CPU可不见得会在读取的时候转换字节序。  详情 回复 发表于 2020-1-6 11:23
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 11:23 | 显示全部楼层
本帖最后由 hackpascal 于 2020-1-6 11:25 编辑
jiuweiljp 发表于 2020-1-6 10:58
感谢您能阅读本帖并回复,之前在别的帖子中的问题,您能很快回复,再次感谢!!!
仔细阅读了您的回复, ...

是不是可以理解AR9344 nand控制器为读的时候4字节翻过来,写的时候再倒回去,对实际的操作没有影响。
--> 对AR9344的实际操作没有影响,对这之外的就不一定了。因为别的CPU可不见得会在读取的时候转换字节序。

新的nand flash 中oob数据并没有留空
--> 擦除的时候就已经擦成空的了。即使写入上次的ECC数据,只要数据变了,ECC也就无效了

那个有问题的目标机器(ARM CPU)在这样操作后能启动新写进的nand flash。
--> 你这ARM的CPU在启动阶段就多半没有开ECC

市面上的编程器的上位机软件没有那么牛x吧,能将不同的对象cpu的ecc校验算法也能做进去
--> 它们可以从芯片厂商那里买啊,不见得是源码,可能就是一个程序。钱给够就行

那个上位机软件是开源的吧
--> 我用breed做的,专门做了raw读写

点评

H大 大麦 DW33D 的NAND是以CPU字节序保存的吗,BREED下写入操作实际写入的是CPU字节序。读出来是正常的  详情 回复 发表于 2020-1-11 10:11
H大 大麦 DW33D 的NAND是以CPU字节序保存的吗,BREED下写入操作实际写入的是CPU字节序。读出来是正常的  详情 回复 发表于 2020-1-11 10:11
请问大佬,BREED不继续开发了吗?  详情 回复 发表于 2020-1-9 15:57
感谢回复!! 文中提到 ----------- 新的nand flash 中oob数据并没有留空 --> 擦除的时候就已经擦成空的了。即使写入上次的ECC数据,只要数据变了,ECC也就无效了 ---------- 假如 源nand flash芯片,与新的  详情 回复 发表于 2020-1-6 18:54
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 11:25 | 显示全部楼层
MT7628的丰富的GPIO做过一个GPIO模拟NAND时序的NAND编程器,这个好强。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 16:03 | 显示全部楼层
占个前排zsbd
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-1-6 18:54 | 显示全部楼层
本帖最后由 jiuweiljp 于 2020-1-6 19:00 编辑
hackpascal 发表于 2020-1-6 11:23
是不是可以理解AR9344 nand控制器为读的时候4字节翻过来,写的时候再倒回去,对实际的操作没有影响。
-- ...

感谢回复!!我也没有指望能弄一个带ecc校验的nand 写设备,只要能一比一复制就非常满足了。

另外回文提到
-----------
新的nand flash 中oob数据并没有留空
--> 擦除的时候就已经擦成空的了。即使写入上次的ECC数据,只要数据变了,ECC也就无效了
----------
假如 源nand flash芯片,与新的nand flash 在一定范围内(0x40000含oob区域)都没有bit flip,我的这种复制方式(把oob数据一并复制),oob数据在目标机器上也是无效的吗?

点评

这种没问题  详情 回复 发表于 2020-1-6 19:28
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 19:28 | 显示全部楼层
jiuweiljp 发表于 2020-1-6 18:54
感谢回复!!我也没有指望能弄一个带ecc校验的nand 写设备,只要能一比一复制就非常满足了。

另外回文 ...

这种没问题
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-1-6 21:35 | 显示全部楼层
这贴算是几个月来最感兴趣的一贴
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2020-8-9 16:29

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表