成功编译并烧写了MicroPython后,Internal FS (SPIFFS)中只有一个boot.py文件(MicroPython启动后会自动运行它),其他什么都没有。 如果可以在烧写时,顺便把一些需要的文件先烧写到internalfs就好了。
事实上,./BUILD.sh makefs
和./BUILD.sh flashfs
是可以创建internalfs的镜像文件并烧写到M5Stack上的。 但是,似乎源码包里BUILD.sh创建的镜像文件尺寸并不对(小很多),烧写后也不能正常在MicroPython中挂载。
没关系,手动一步一步来……
首先,需要找到源码包中创建spiffs镜像的工具——mkspiffs。 如果你运行过./BUILD.sh makefs
,它应该已经编译好了。否则的话,可以执行make来编译。
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# ls -l /root/M5Stack_MicroPython/MicroPython_BUILD/components/mkspiffs
total 12640
-rw-r--r-- 1 root root 1108 Jun 11 23:07 LICENSE.txt
-rw-r--r-- 1 root root 2748 Jun 11 23:07 Makefile
-rw-r--r-- 1 root root 2114 Jun 11 23:07 README.md
drwxr-xr-x 2 root root 4096 Jun 11 23:07 include
-rw-r--r-- 1 root root 20297 Jun 11 23:07 main.cpp
-rw-r--r-- 1 root root 200944 Jun 16 21:06 main.o
-rwxr-xr-x 1 root root 109448 Jun 16 21:06 mkspiffs
drwxr-xr-x 5 root root 4096 Jun 11 23:07 spiffs
-rw-r--r-- 1 root root 12582912 Jun 17 19:40 spiffs.bin
drwxr-xr-x 2 root root 4096 Jun 11 23:07 tclap
回顾一下我们的partitions划分。
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# more partitions.csv
# -------------------------------------------------------
# - Partition layout generated by BUILD.sh script -
# -------------------------------------------------------
# Name, Type, SubType, Offset, Size, Flags
# -------------------------------------------------------
nvs, data, nvs, 0x9000, 24K,
phy_init, data, phy, 0xf000, 4K,
MicroPython, app, factory, 0x10000, 2304K,
internalfs, data, spiffs, 0x250000, 12288K,
可以看到internalfs用了12288K,换成16进制,是0xC00000个字节。
然后
./components/mkspiffs/mkspiffs -c ./components/internalfs_image/image -b 4096 -p 256 -s 0xC00000 ./build/spiffs_image.img
会把./components/internalfs_image/image
里的内容打包到./build/spiffs_image.img
里。
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# ls -l ./build/spiffs_image.img
-rw-r--r-- 1 root root 12582912 Jun 17 20:42 ./build/spiffs_image.img
文件大小同internalfs分区大小相同。 12288K x 1024 = 12582912
然后用esptool.py将镜像文件写入M5Stack。
python /root/M5Stack_MicroPython/Tools/esp-idf/components/esptool_py/esptool/esptool.py \
--chip esp32 --port /dev/ttyUSB0 --baud 921600 \
--before default_reset --after no_reset write_flash -z \
--flash_mode dio --flash_freq 80m --flash_size detect \
0x250000 /root/M5Stack_MicroPython/MicroPython_BUILD/build/spiffs_image.img
用921600波特率写入需要几十秒的时间。
其实完全可以同时将MicroPython系统等和internalfs镜像一起写入M5Stack。
首先确认其他文件的位置。
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# ls -l build/bootloader/bootloader.bin
-rw-r--r-- 1 root root 24896 Jun 17 20:06 build/bootloader/bootloader.bin
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# ls -l build/phy_init_data.bin
-rw-r--r-- 1 root root 144 Jun 17 20:09 build/phy_init_data.bin
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# ls -l build/MicroPython.bin
-rw-r--r-- 1 root root 2322400 Jun 17 20:09 build/MicroPython.bin
root@debian:~/M5Stack_MicroPython/MicroPython_BUILD# ls -l ./build/partitions.bin
-rw-r--r-- 1 root root 3072 Jun 17 20:06 ./build/partitions.bin
然后用esptool一步写入
python /root/M5Stack_MicroPython/Tools/esp-idf/components/esptool_py/esptool/esptool.py \
--chip esp32 --port /dev/ttyUSB0 --baud 921600 \
--before default_reset --after no_reset write_flash -z \
--flash_mode dio --flash_freq 80m --flash_size detect \
0x1000 build/bootloader/bootloader.bin \
0xf000 build/phy_init_data.bin \
0x10000 build/MicroPython.bin \
0x8000 ./build/partitions.bin \
0x250000 /root/M5Stack_MicroPython/MicroPython_BUILD/build/spiffs_image.img
运行./BUILD.sh monitor
可以看到internalfs已经不是只有boot.py了
……
……
……
Internal FS (SPIFFS): Mounted on partition 'internalfs' [size: 12582912; Flash address: 0x250000]
----------------
Filesystem size: 11558656 B
Used: 140544 B
Free: 11418112 B
----------------
Starting WiFi ...
W (4222) phy_init: failed to load RF calibration data (0x1102), falling back to full calibration
MicroPython ESP32_LoBo_v3.2.24 - 2018-09-06 on ESP32 board with ESP32
Type "help()" for more information.
>>> import uos
>>> uos.listdir()
['fonts', 'examples', 'lib', 'spiffs.info', 'main.py', 'www', 'boot.py']
关于esptool的其他部分功能:
擦除Flash
python /root/M5Stack_MicroPython/Tools/esp-idf/components/esptool_py/esptool/esptool.py erase_flash
读取MAC地址
python /root/M5Stack_MicroPython/Tools/esp-idf/components/esptool_py/esptool/esptool.py read_mac
读取Flash id(包括Flash大小)
python /root/M5Stack_MicroPython/Tools/esp-idf/components/esptool_py/esptool/esptool.py flash_id
同mkspiffs不同的是,esptool.py可以在其他OS运行。在macOS下安装esptool:(我用了miniconda)
conda create -n esptool python=2.7
conda activate esptool
pip install esptool -i https://mirrors.aliyun.com/pypi/simple/
esptool.py -h
相对应mkspiffs,还有一个 spiffsgen.py
,可以自行下载。
wget https://raw.githubusercontent.com/espressif/esp-idf/58df1d93bc17c74499d58e05390af9c309192a5c/components/spiffs/spiffsgen.py
不过好像用起来并不像mkspiffs那样强大。可以参考:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-reference/storage/spiffs.html
问题:Currently, SPIFFS does not support directories???
那MicroPython里的文件夹是哪里来的?