Ниже описана процедура сборки и настройки под Ubuntu тулчейна для написания и сборки прошивок под ESP8266. Тулчейн состоит из неофициального кросскомпилятора crosstool-NG и официального SDK. В принципе, в том или ином виде подобные инструкции есть и на других ресурсах (ссылки на которые есть ниже в статье), однако ни по одной из них мне не удалось собрать полностью рабочий тулчейн, поэтому из разных кусочков я составил свою собственную инструкцию, чтобы в следующий раз не мучиться, собирая всё это по крупицам ещё раз.
- Установка кросскомпилятора crosstool-NG
- Скачиваем и устанавливаем нужные для сборки тулчейна компоненты:
sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget gawk libc6-dev python-serial libexpat-dev
В некоторых источниках советуют вместо libc6-dev ставить либо libc6-dev-amd64, либо libc6-dev-i386, но в таком виде компилятор может не собраться, лучше пусть система сама разбирается что ей нужно.
- Создаём в директории /opt директорию Espressif и становимся её владельцами:
mkdir /opt/Espressif chown username /opt/Espressif/
- Переходим в созданную директорию:
cd /opt/Espressif
- Копируем туда исходные коды кросскомпилятора:
git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git
- Переходим в директорию кросскомпилятора:
cd crosstool-NG
- Конфигурируем, собираем и устанавливаем кросскомпилятор, а также настраиваем его под процессор xtensa lx106:
./bootstrap && ./configure --prefix=`pwd` && make && make install ./ct-ng xtensa-lx106-elf ./ct-ng build
Если возникает ошибка по поводу невозможности скачать и установить компонент http://www.multiprecision.org/mpc/download/mpc-1.0.2 (можно увидеть в файле build.log в папке crosstool-NG), то архив с этим компонентом можно скачать вот отсюда: http://www.multiprecision.org/mpc/download.html. Скачиваем его в папку crosstool-NG и далее выполняем:
mv mpc-1.0.2.tar.gz .build/tarballs
Далее нужно заново повторить пункт 6.
- Настраиваем переменные окружения:
PATH=$PWD/builds/xtensa-lx106-elf/bin:$PATH
- Скачиваем и устанавливаем нужные для сборки тулчейна компоненты:
- Установка SDK
- Возвращаемся в директорию Espressif:
cd /opt/Espressif
- Создаём в ней директорию ESP8266_SDK и переходим в неё:
mkdir ESP8266_SDK cd ESP8266_SDK
- Скачиваем в эту директорию SDK и патч к нему:
wget http://bbs.espressif.com/download/file.php?id=72 -O esp_iot_sdk_v0.9.3_14_11_21.zip wget http://bbs.espressif.com/download/file.php?id=73 -O esp_iot_sdk_v0.9.3_14_11_21_patch1.zip
- Распаковываем SDK (он распакуется в папку esp_iot_sdk_v0.9.3) и удаляем сам архив:
unzip esp_iot_sdk_v0.9.3_14_11_21.zip && rm esp_iot_sdk_v0.9.3_14_11_21.zip
- Удаляем глючную статическую либу libpp.a
rm esp_iot_sdk_v0.9.3/lib/libpp.a
- Распаковываем архив с патчем и удаляем сам архив. Патч также распакуется в папку esp_iot_sdk_v0.9.3, произойдёт слияние папок и в папку с sdk добавятся пропатченные файлы (пропатченная библиотека libpp.a):
unzip esp_iot_sdk_v0.9.3_14_11_21_patch1.zip && rm esp_iot_sdk_v0.9.3_14_11_21_patch1.zip
- Перемещаем всё содержимое папки esp_iot_sdk_v0.9.3 в папку ESP8266_SDK (то есть в папку, в которой мы сейчас и находимся), а саму папку esp_iot_sdk_v0.9.3 удаляем:
mv esp_iot_sdk_v0.9.3/* . && rm -r esp_iot_sdk_v0.9.3/
- Добавляем в SDK статические библиотеки libc и libhal, потом скачиваем и распаковываем архив с хидерами, после чего удаляем сам архив:
wget -O lib/libc.a https://github.com/esp8266/esp8266-wiki/wiki/raw/master/libs/libc.a wget -O lib/libhal.a https://github.com/esp8266/esp8266-wiki/wiki/raw/master/libs/libhal.a wget -O include.tgz https://github.com/esp8266/esp8266-wiki/wiki/raw/master/include.tgz tar -xvzf include.tgz && rm include.tgz
- Возвращаемся в директорию Espressif:
- Установка утилит для создания и загрузки образов в ESP8266 — ESP Image Tool и ESP Upload Tool
- Возвращаемся в директорию Espressif:
cd /opt/Espressif
- Качаем и устанавливаем пакет для создания образов esptool, после чего удаляем установочный файл
wget https://github.com/esp8266/esp8266-wiki/raw/master/deb/esptool_0.0.2-1_i386.deb sudo dpkg -i esptool_0.0.2-1_i386.deb && rm esptool_0.0.2-1_i386.deb
- Качаем основанную на питоновских скриптах утилиту загрузки образов…
git clone https://github.com/themadinventor/esptool esptool-py
- …и создаём ссылки (симлинки) на неё в папках crosstool-NG/builds/xtensa-lx106-elf/bin/ и /usr/sbin/
sudo ln -s $PWD/esptool-py/esptool.py crosstool-NG/builds/xtensa-lx106-elf/bin/ sudo ln -s $PWD/esptool-py/esptool.py /usr/sbin/
- Возвращаемся в директорию Espressif:
- Исправление проекта библиотеки малого веб-сервера на ESP8266 для сборки под Linux (за адаптацию проекта под Linux отдельное спасибо Virtual-у)
- Для начала склонируем себе сам проект в папку examples:
cd /opt/Espressif/ESP8266_SDK/examples git clone https://github.com/pvvx/esp8266web esp8266web
- Создадим в корневой папке проекта небольшой скрипт script.sh для запуска утилиты make с исправленными под linux путями и переменными окружения:
#! /bin/sh PATH=/opt/Espressif/crosstool-NG/buildsxtensa-lx106-elf/bin:$PATH INCLUDES="-I $PWD/include -I /opt/Espressif/ESP8266_SDK/include" \ XTENSA_TOOLS_ROOT=/opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin \ ESPTOOL="python $PWD/esptool.py" \ OVLTOOL="python $PWD/ovls.py" \ UPLOADTOOL="python $PWD/uploader.py" \ make
В мэйкфайлах проекта команды установки виндовых путей прописаны через ?=, так что если мы пропишем пути скриптом заранее, то команды установки виндовых путей просто не выполнятся.
- Поменяем права на созданный скрипт, чтобы сделать его исполняемым файлом:
chmod +x script.sh
- В ovls/makefile добавляем опцию -fno-strict-aliasing:
---CCFLAGS += -Os -Wall -Wno-pointer-sign -fno-tree-ccp -mno-target-align -mno-serialize-volatile -foptimize-register-move +++CCFLAGS += -Os -Wall -Wno-pointer-sign -fno-tree-ccp -mno-target-align -mno-serialize-volatile -foptimize-register-move -fno-strict-aliasing
- Осталось только поменять пути в некоторых питоновских скриптах:
- /esptool.py
---tool_nm = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe" +++tool_nm = os.getenv("XTENSA_TOOLS_ROOT") + "/xtensa-lx106-elf-nm" ---tool_objcopy = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-objcopy.exe" +++tool_objcopy = os.getenv("XTENSA_TOOLS_ROOT") + "/xtensa-lx106-elf-objcopy"
-
/ovls.py
---tool_nm = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe" +++tool_nm = os.getenv("XTENSA_TOOLS_ROOT") + "/xtensa-lx106-elf-nm"
-
/ovls/esptool.py
---tool_nm = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe" +++tool_nm = os.getenv("XTENSA_TOOLS_ROOT") + "/xtensa-lx106-elf-nm" ---tool_objcopy = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-objcopy.exe" +++tool_objcopy = os.getenv("XTENSA_TOOLS_ROOT") + "/xtensa-lx106-elf-objcopy"
-
/ovls/ovls.py
---tool_nm = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe" +++tool_nm = os.getenv("XTENSA_TOOLS_ROOT") + "/xtensa-lx106-elf-nm"
- /esptool.py
- Для начала склонируем себе сам проект в папку examples:
Вот и всё. Примеры прошивок лежат в ESP8266_SDK/examples. Для их компиляции теперь достаточно просто зайти в папку с нужной прошивкой и выполнить команду make (подробности по поводу компиляции прошивок из папки examples читаем здесь: https://habr.com/en/post/363349/#Espressif-ESP8266-DevKit, иногда перед повторной компиляцией необходимо выполнить make clean чтобы очистить каталог от результатов предыдущей компиляции).
Отдельно хотелось бы обсудить проект библиотеки малого веб-сервера от pvvx: https://github.com/pvvx/esp8266web. Этот проект пожалуй самый стабильный и интересный, он достаточно долго и подробно обсуждался сообществом разработчиков вот в этом треде: https://esp8266.ru/forum/threads/razrabotka-biblioteki-malogo-webservera-na-esp8266.56/, однако есть у него одна небольшая проблема. Проблема заключается в том, что выложенные на github исходники сконфигурены под винду и для его нормальной сборки под линухом нужно кое-что поправить.