【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
说到了用usb otg来实现spi nand flash的烧入,这中间主要用到了PhoenixSuit软件。那么怎么用usb otg来实现spi nor flash的烧入呢?这里就不得不提到sunxi-tools这个工具。这个工具目前有windows本版本和linux版本。中间还会涉及到libusb这个库,为了使用的方便,我们决定用linux版本的sunxi-tools来实现spi nor flash的烧入。
1、将 usb otg口导入到virtualbox当中
上一篇文章的时候,我们说过v3s怎么进入usb otg了。主要就是这么几个步骤,拔掉sd卡、同时按下s6和s5、先松开s5、几秒后再松开s6即可。前面说过,在windows环境下用PhoenixSuit安装对应的驱动就可以了。如果是linux,那么就需要先让虚拟机里面的ubuntu看到这个usb设备,本质上,这和u盘、usb camera是一样的。
有了上面这个操作之后,每次usb设备插入的时候,只要虚拟机开着,都会被虚拟机优先接管过来。
2、安装sunxi-tools工具
将usb设备导入到虚拟机ubuntu之后,下一步就是安装sunxi-tools工具。下载的地址如下所示,注意一定是v3s-spi这个分支,
https://github.com/Icenowy/sunxi-tools/tree/v3s-spi
网上关于sunxi-tools的下载地址很多,使用的同学最好多多测试,选用比较适合自己的版本。下载好代码之后,接着就是解压和编译。编译的过程中,最好先安装下libusb库,
sudo apt-get install libusb-1.0-0-dev
编译本身就很简单了,进入目录直接make就好了。如果过程当中没有什么问题的话,那么就可以生成我们需要的sunxi-fel这个工具了。
make
3、替换nandflash为norflash
之前的开发板使用的是nandflash,型号是mx35lf1ge4ab。这次为了测试,我们需要换一个norflash,不失一般性,选用了mx25l25645这款芯片。两款芯片都属于mxic公司的。一般来说nandflash大一点,会有512m、1g、2g这样的几个规格。而norflash则小得多,一般也就是128m、256m比较常见。
这里,我们选用mx25l25645,其大小是256m bit,换成byte是32m。主要也是考虑了将来的用户使用情况。此外,之前的nandflash是qfn封装,可以选用热风枪来吹下来,而换上去的mx25l25645则引脚较长,直接用烙铁替换即可,注意一下方向就行。
4、使用sunxi-tools
换好了norflash之后,就可以开始准备测试了。这个时候flash本身还是一个白片,里面没有任何的系统。此外,我们还拔掉了sd卡,所以直接上电之后,v3s就会自己进入usb状态,在ubuntu中开始输入sunxi-fel命令确认,usb设备已经被找到,
shell> sudo ../sunxi-tools-3s-spi/sunxi-fel version
AWUSBFEX soc=00001681(V3s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
如果看到这样的打印,就可以确认usb已经接入了。如果还是不确认,我们可以换一个命令试一下,
shell> sudo ../sunxi-tools-3s-spi/sunxi-fel -l
USB device 001:054 Allwinner V3s 12c00001:54304620:79304914:2c2c0f50
看到设备接进来之后,下面一步需要做的就是确认spiflash设备同样被识别到了,继续输入命令,
shell> sudo ../sunxi-tools-3s-spi/sunxi-fel spiflash-info
Manufacturer: Macronix (C2h), model: 20h, size: 33554432 bytes.
从C2h和Macronix的打印来说,说明我们焊接上去的norflash已经被识别到了。下面需要做的就是通过sunxi-fel让uboot跑起来。因为之前的uboot是基于sd卡编译和运行起来的,那么可以通过sunxi-fel先将之前的uboot下载到v3s内部的ram空间里面,再从ram运行起来。当然这一次uboot的运行在系统复位之后就丢失了,这个需要注意下,
shell> sudo ../sunxi-tools-3s-spi/sunxi-fel uboot u-boot-sunxi-with-spl.bin
如果这个时候,开发板上还有一个串口的话,就可以看到这样的信息打印,
U-Boot SPL 2017.01-rc2 (Jun 20 2023 - 21:50:26)
DRAM: 64 MiB
Trying to boot from FEL
U-Boot 2017.01-rc2 (Jun 20 2023 - 21:50:26 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
Card did not respond to voltage select!
*** Warning - MMC init failed, using default environment
Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
U-Boot 2017.01-rc2 (Jun 20 2023 - 21:50:26 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
Card did not respond to voltage select!
*** Warning - MMC init failed, using default environment
Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
Net: No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot: 0
Card did not respond to voltage select!
Card did not respond to voltage select!
** Bad device mmc 0 **
Card did not respond to voltage select!
Card did not respond to voltage select!
** Bad device mmc 0 **
=>
=>
上面这个内容中有一句打印,即Trying to boot from FEL。这说明uboot本身确实是从fel启动的,既不是从nandflash、也不是从norflash,当然更不可能是从sd卡启动了。
5、编译spi norflash的uboot
前面我们虽然也运行起来了uboot,但是那个是通过sunxi-fel命令完成的。本身uboot并没有保存到norflash里面。因此,我们需要找到一个支持spi norflash启动的uboot,并且把通过sunxi-fel把它烧入到norflash里面,这样开机后v3s就可以自己从spi norflash启动起来了。
首先下载uboot-spi代码,注意是v3s-spi-experimental这个分支,
https://github.com/Lichee-Pi/u-boot/tree/v3s-spi-experimental
下载解压好后,首先是基础配置,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig
完成配置之后,我们还需要进入menuconfig添加两个配置。第一个就是让uboot支持大容量的norflash,即超过16M的flash;第二个,就是让uboot支持mxic的norflash,因为默认uboot只支持winbond品牌。
make ARCH=arm menuconfig
选择Device Drivers->SPI Flash Support,
配置好之后,开始输入命令编译即可,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
稍微等待一会,就可以看到文件u-boot-sunxi-with-spl.bin,这就是我们最终需要烧入到norflash的文件,和之前是一样的。
6、烧入、运行新的uboot
新的uboot出来之后,下面就是准备烧入了。首先还是让v3s进入usb otg状态,用sunxi-fel version确认设备已经接上,
shell> sudo ../sunxi-tools-3s-spi/sunxi-fel ver
AWUSBFEX soc=00001681(V3s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
确认没有问题之后,就可以用spiflash-write子命令来进行烧入了,
shell> sudo ../sunxi-tools-3s-spi/sunxi-fel -p spiflash-write 0x0 u-boot-sunxi-with-spl.bin
100% [================================================] 414 kB, 28.1 kB/s
烧入到100%之后,一般这个时候我们并不着急确认uboot是不是真的烧入进去,而是用spiflash-read把烧入进去的数据读一小部分回来,看看和烧进去的数据比较一下,是否一致。
sudo ../sunxi-tools-3s-spi/sunxi-fel -p spiflash-read 0x0 0x1000 4k.bin
100% [================================================] 4 kB, 14.9 kB/s
都回来之后,可以拷贝到windows系统,用notepad++的hex插件查看下,确认没有问题。
接下来就可以拔掉usb otg线,按一下复位键,不出意外,这个时候已经可以看到打印,确认从spi norflash启动系统了,
U-Boot SPL 2017.01-rc2 (Jun 22 2023 - 16:02:17)
DRAM: 64 MiB
Trying to boot from sunxi SPI
U-Boot 2017.01-rc2 (Jun 22 2023 - 16:02:17 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
SF: Detected mx25l25635f with page size 256 Bytes, erase size 64 KiB, total 32 MiB
*** Warning - bad CRC, using default environment
Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
U-Boot 2017.01-rc2 (Jun 22 2023 - 16:02:17 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
SF: Detected mx25l25635f with page size 256 Bytes, erase size 64 KiB, total 32 MiB
*** Warning - bad CRC, using default environment
Setting up a 480x272 lcd console (overscan 0x0)
dotclock: 10000kHz = 10000kHz: (1 * 3MHz * 20) / 6
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
Net: No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot: 0
注意下,这个打印和nand启动、fel启动和sd卡启动都不一样的,因为它中间多了一行Trying to boot from sunxi SPI,这个是之前没有看到过的。当然如果还不放心,就可以利用uboot的sf命令,把norflash的前面1M空间重新擦除,看看是不是还能正常启动,看看是不是v3s会再次进入到usb otg的状态。
=> sf probe 0;
SF: Detected mx25l25635f with page size 256 Bytes, erase size 64 KiB, total 32 MiB
=> sf erase 0x0 0x100000;
SF: 1048576 bytes @ 0x0 Erased: OK
=> reset
resetting ...
不出意外的话,因为norflash里面的uboot已经被删除,所以这个时候事实上v3s会再次进入到usb otg状态的,大家可以自己实操一下。