配置编译工具链
$ git clone https://github.com/icamgo/xtensa-toolchain.git
$ cd xtensa-toolchain && ./gen.py
$ echo "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/bin:\$PATH" >> ~/.bashrc
$ . ~/.bashrc
编译 NodeMCU 固件
首先从官方下载源码
git clone https://github.com/nodemcu/nodemcu-firmware.git
完成以后,下载ESP8266的SDK
git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
然后拷贝必要文件到固件源码路径下
cp -r ESP8266_RTOS_SDK/extra_include/xtensa/ nodemcu-firmware/app/user/
NodeMcu的固件版本已经更新到1.5.4.1,如果是编译这个版本的估计,还需要执行下面一步:
cp -r ESP8266_RTOS_SDK/extra_include/xtensa/ nodemcu-firmware/app/esp-gdbstub/
执行make
$ cd nodemcu-firmware
$ make
最重要的一步,把sdk工具包及头文件复制到固件sdk文件夹,注意要把xtensa整个文件夹复制过去。
cp -r ESP8266_RTOS_SDK/extra_include/xtensa nodemcu-firmware/sdk/esp_iot_sdk_v******/include/
下载缺少库文件
cd nodemcu-firmware/sdk/esp_iot_sdk_v1.4.0/lib/
wget -c https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a
之所以要在make之后再添加这个文件,是因为只有make以后才会生成sdk目录,而sdk/esp_iot_sdk_v的版本号是不确定的。
完成上面的工作以后,就可以重新make了。编译完成以后会在“nodemcu-firmware/bin”中生成两个.bin文件
make 过程中还会出错,很可能是esptool工具没有安装
安装python
$ brew install python
$ pip install esptool
再次执行 make 即可成功编译通过.
烧录
但是默认烧录(make flash)后无法正常启动,需要命令行中额外传递 -fm dio -fs 32m -ff 40m 参数:
$ sudo esptool.py --port /dev/cu.SLAB_USBtoUART write_flash -fm dio -fs 32m -ff 40m 0x00000 ./bin/0x00000.bin 0x10000 ./bin/0x10000.bin
执行上述命令前记得依次:按下 FLASH,按下 RST,松开 RST,松开 FLASH,以便进入烧录模式。
在固件中定制模块
可以选择在固件中包含哪些模块,比如我们需要MQTT,需要HTTP,不需要NET,这些都可以在“user_model.h“中进行配置,“user_model.h“的路径为”nodemcu-firmware/app/include/“。
define LUA_USE_MODULES_HMC5883L
define LUA_USE_MODULES_HTTP
//#define LUA_USE_MODULES_HX711
//#define LUA_USE_MODULES_I2C
//#define LUA_USE_MODULES_L3G4200D
//#define LUA_USE_MODULES_MDNS
define LUA_USE_MODULES_MQTT
//#define LUA_USE_MODULES_NET
define LUA_USE_MODULES_NODE
//#define LUA_USE_MODULES_OW
需要的模块就取消注释,不需要的模块则可以注释掉,需要注意,NodeMcu的flash有限,不能把所有模块都编译出来,这会使NodeMcu爆仓,所以编译自己需要的模块吧,不需要的就直接注释掉。
另外,编译固件可以选择编译整形版本还是浮点型版本,这个可以在”nodemcu-firmware/app/include/user_config.h“中进行配置:
// 整形
// #define LUA_NUMBER_INTEGRAL
建议使用整型编译,这可以使固件体积减少11k。