东山一号 烧录/恢复

/ 0评 / 0

首先准备好官方的烧录包.不需要什么特殊烧录器,只需要有个类似RPI的板子就行.

解压原始包后大概是这样的.

snander和flash.sh是我自己下载和写的,后面会提到.

对关键文件进行一下描述.

.
├── boot/
│   ├── GCIS.bin           # CIS/参数区(有的包叫 cis.bin)→ 只在首次/换 NAND 时写
│   ├── IPL.bin            # 初级加载器(主/备)
│   ├── IPL_CUST.bin       # SoC 定制加载器(主/备)
│   ├── PARTINFO.pni       # 厂商工具用的分区信息(snander 不依赖)
│   ├── SPINANDINFO.sni    # 厂商工具用的 NAND 信息(snander 不依赖)
│   └── u-boot_spinand.xz.img.bin   # U-Boot 正身
├── kernel                 # U-Boot 读取的内核镜像(uImage/Legacy)
├── rootfs.ubifs           # 根文件系统(UBIFS 镜像)
├── logo                   # 可选:开机 Logo(有脚本挂载时才需要)
├── appconfigs.ubifs       # 可选:应用配置卷
├── customer.ubifs         # 可选:客户资源卷
├── miservice.ubifs        # 可选:业务程序卷

工具下载,然后解压,得到烧录工具.

https://github.com/OpenIPC/snander-mstar/releases/download/latest/snander-linux.zip

然后根据我图上的接线,供电要插非串口调试的USB,不要被端子上线的颜色所迷惑.

这个线叫SH线,因为没有任何测试点,所以也只能买一根了.

第二步,拆掉所有外设,还要记得包裹住EDGE引脚,因为BOOTMODE也从这些引脚采集.

第三步,拨码开关到两个都OFF的状态,然后打开树莓派可以检测到I2C设备的,当然你也一样可以用CH341/CH347都行.用i2c-detect -y N可以检测到0x49/0x59两个I2C设备.

因为板子用的是SPI NAND,所以存在坏块的可能的.所以要跳写坏块,并且保险起见BOOT烧录双驱启动,因为BOOTROM检测不到坏块,他遇到就读错就以为没BOOT了.所以他检测双地址.

上面全部做好开始做检测.

sudo ./snander -p mstar -a 0x2C0000 -l 0xC0000 -e

能输出这样代表OK

SNANDer - Spi Nor/nAND programmER 1.8.0 by McMCC

Found programmer device: WinChipHead (WCH) - CH341A
Using I2C default speed mode

spi_nand_probe: mfr_id = 0x9c, dev_id = 0x1, dev_id_2 = 0x9c
Get Status Register 1: 0x38
Get Status Register 2: 0x10
Using Flash ECC.
Detected SPI NAND Flash: XINCUN XCSP1AAWH-NT, Flash Size: 128MB, OOB Size: 128B
ERASE:
Erase addr = 0x00000000002C0000, len = 0x00000000000C0000
Erase 100% [786432] of [786432] bytes      
Elapsed time: 0 seconds
Status: OK

如果没检测到NAND型号检查下之前步骤有什么问题

烧录脚本

# 仍然建议先擦走廊
sudo ./snander -p mstar -a 0x2C0000 -l 0xC0000 -e
sudo ./snander -p mstar -a 0x380000 -l 0xC0000 -e

# 把 U-Boot 写成 0x40000(256 KiB)窗口,开 -k,写主/备
sudo ./snander -p mstar -a 0x2C0000 -l 0x40000 -k -w u-boot_spinand.xz.img.bin -v
sudo ./snander -p mstar -a 0x380000 -l 0x40000 -k -w u-boot_spinand.xz.img.bin -v

# IPL(文件 0x6000;对齐到 0x6000 本身就是整页)
sudo ./snander -p mstar -a 0x140000 -l 0x20000 -e
sudo ./snander -p mstar -a 0x140000 -l 0x6000  -k -w IPL.bin -v
sudo ./snander -p mstar -a 0x1A0000 -l 0x20000 -e
sudo ./snander -p mstar -a 0x1A0000 -l 0x6000  -k -w IPL.bin -v

# IPL_CUST(文件 0x5800;对齐到 0x6000 更保险)
sudo ./snander -p mstar -a 0x200000 -l 0x20000 -e
sudo ./snander -p mstar -a 0x200000 -l 0x6000  -k -w IPL_CUST.bin -v
sudo ./snander -p mstar -a 0x260000 -l 0x20000 -e
sudo ./snander -p mstar -a 0x260000 -l 0x6000  -k -w IPL_CUST.bin -v

sudo ./snander -p mstar -a 0x2C0000 -l 0x40 -r /tmp/ub0.head
sudo ./snander -p mstar -a 0x380000 -l 0x40 -r /tmp/ub1.head

cmp -n 64 u-boot_spinand.xz.img.bin /tmp/ub0.head && echo UBOOT0_HEAD_OK
cmp -n 64 u-boot_spinand.xz.img.bin /tmp/ub1.head && echo UBOOT1_HEAD_OK

因为是I2C的缘故,实际很缓慢,有人说用CH341之类很快,我没测试过.

注意,就算是CH341等也是选-p mstar,因为-p ch341指的是直接用SPI写NAND,这货不读代码都不知道啊.

我们除了BOOT没办法,其他我们会用SD卡复制写入的方式完成,目前先等待BOOT完成.在写入期间,我们不建议进行任何操作,因为他没有纠错,写错了他也会烧录进去,最后就是各种奇怪错误.

成功后断电回正常BOOT.

然后把系统rootfs.ubifs和kernel复制到TF卡的FAT32分区,我们要逐步重建UBI分区,我之前移植调试时候会错误覆盖bootloader害我重新烧录了boot很多次.

按住板载用户按键,再按住键盘回车不放,然后复位,进U-Boot控制台.

在控制台按顺序重建UBI分区和烧录.

# 0) 准备:加载 UBI 分区(从 0x4A0000 起),不动 boot 裸区
nand erase.part UBI
ubi part UBI

# 1) 写 kernel(按文件大小开卷,避免浪费 LEB)
setenv loadaddr 0x21000000
mmc rescan
fatload mmc 0:1 ${loadaddr} kernel
ubi create kernel ${filesize}
ubi write  ${loadaddr} kernel ${filesize}

# 2) 写 rootfs (大小设置大一些,不然开机后就没空间了,但是多大呢这个要计算,我随便先设置940LEB)
fatload mmc 0:1 ${loadaddr} rootfs.ubifs
ubi create rootfs 0x071D4000
ubi write  ${loadaddr} rootfs ${filesize}

# 3) 临时启动(这步先别 saveenv,因为现在save会覆盖boot区,也是害我调试了很久.)
setenv bootargs 'console=ttyS0,115200 mtdparts=nand0:0x4A0000@0(boot),-(UBI) ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs rw rootwait'
setenv bootcmd  'ubi part UBI; ubi read ${loadaddr} kernel; bootm ${loadaddr}'
run bootcmd

擦除后可以看到UBI分区信息.

烧录内核和rootfs

能看到这条警告就对了,说明内核已经在引导了.

成功启动

下载源码自己编译,repo工具自行安装,他给的太老了不建议.

git clone https://e.coding.net/codebug8/repo.git
mkdir DongshanPiOne-TAKOYAKI  && cd  DongshanPiOne-TAKOYAKI
repo init -u  https://gitee.com/weidongshan/manifests.git -b linux-sdk -m  SSD202D/dongshanpi-one_takoyaki_dlc00v030.xml --no-repo-verify
repo sync

导出几个临时变量

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/taterli/dongshan/gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf/bin

尝试编译boot

taterli@taterli-desktop:~/dongshan/boot$ make infinity2m_spinand_defconfig
taterli@taterli-desktop:~/dongshan/boot$ make -j16
scripts/kconfig/conf --silentoldconfig Kconfig
  CHK     include/config.h
  GEN     include/autoconf.mk
  GEN     include/autoconf.mk.dep
  GCC version: 8.2.1
  MVXV
  CHK     include/generated/timestamp_autogenerated.h
chip_id I2M
  UPD     include/generated/timestamp_autogenerated.h
fatal: not a git repository (or any of the parent directories): .git
  File "/home/taterli/dongshan/boot/ms_gen_mvxv_h.py", line 20
    print 'ERROR: must specify output header file!!'
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
make: *** [Makefile:1154: include/config/uboot.release] Error 1

好吧,这些代码毕竟是python2时代的,我们尝试修一下,文件比较多,我就让AI帮忙了.

可见得到了编译结果

烧录BOOT还是要按前面的方法,苦不苦,直接在BOOT烧录BOOT失败次数太多了,总体时间更慢.不过你可以不用整个烧写脚本只更新u-boot本身.

烧录,编译日期变了,OK!

然后编译内核等也有不同的坑,不过都常见,网上搜下都有.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注