首先准备好官方的烧录包.不需要什么特殊烧录器,只需要有个类似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,不要被端子上线的颜色所迷惑.

- 红色 -> SDA
- 黑色 -> SCL
- 黄色 -> GND
- 绿色 -> 3V(只有当R70焊接0R电阻后才有用,不想焊接可以跟我一样插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!

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