Наш канал в telegram

Сборка тулчейна для написания прошивок под ESP8266 в Ubuntu Linux

Ниже описана процедура сборки и настройки под Ubuntu тулчейна для написания и сборки прошивок под ESP8266. Тулчейн состоит из неофициального кросскомпилятора crosstool-NG и официального SDK. В принципе, в том или ином виде подобные инструкции есть и на других ресурсах (ссылки на которые есть ниже в статье), однако ни по одной из них мне не удалось собрать полностью рабочий тулчейн, поэтому из разных кусочков я составил свою собственную инструкцию, чтобы в следующий раз не мучиться, собирая всё это по крупицам ещё раз.

  • Установка кросскомпилятора crosstool-NG
    1. Скачиваем и устанавливаем нужные для сборки тулчейна компоненты:
      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, но в таком виде компилятор может не собраться, лучше пусть система сама разбирается что ей нужно.

    2. Создаём в директории /opt директорию Espressif и становимся её владельцами:
      mkdir /opt/Espressif
      chown username /opt/Espressif/
    3. Переходим в созданную директорию:
      cd /opt/Espressif
    4. Копируем туда исходные коды кросскомпилятора:
      git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git
    5. Переходим в директорию кросскомпилятора:
      cd crosstool-NG
    6. Конфигурируем, собираем и устанавливаем кросскомпилятор, а также настраиваем его под процессор 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.

    7. Настраиваем переменные окружения:
    8. PATH=$PWD/builds/xtensa-lx106-elf/bin:$PATH
  • Установка SDK
    1. Возвращаемся в директорию Espressif:
      cd /opt/Espressif
    2. Создаём в ней директорию ESP8266_SDK и переходим в неё:
      mkdir ESP8266_SDK
      cd ESP8266_SDK
    3. Скачиваем в эту директорию 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
    4. Распаковываем 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
    5. Удаляем глючную статическую либу libpp.a
      rm esp_iot_sdk_v0.9.3/lib/libpp.a
    6. Распаковываем архив с патчем и удаляем сам архив. Патч также распакуется в папку 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
    7. Перемещаем всё содержимое папки 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/
    8. Добавляем в 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
  • Установка утилит для создания и загрузки образов в ESP8266 — ESP Image Tool и ESP Upload Tool
    1. Возвращаемся в директорию Espressif:
      cd /opt/Espressif
    2. Качаем и устанавливаем пакет для создания образов 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
    3. Качаем основанную на питоновских скриптах утилиту загрузки образов…
      git clone https://github.com/themadinventor/esptool esptool-py
    4. …и создаём ссылки (симлинки) на неё в папках 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/
  • Вот и всё. Примеры прошивок лежат в 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 исходники сконфигурены под винду и для его нормальной сборки под линухом нужно кое-что поправить.

  • Исправление проекта библиотеки малого веб-сервера на ESP8266 для сборки под Linux (за адаптацию проекта под Linux отдельное спасибо Virtual-у)
    1. Для начала склонируем себе сам проект в папку examples:
      cd /opt/Espressif/ESP8266_SDK/examples
      git clone https://github.com/pvvx/esp8266web esp8266web
    2. Создадим в корневой папке проекта небольшой скрипт 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

      В мэйкфайлах проекта команды установки виндовых путей прописаны через ?=, так что если мы пропишем пути скриптом заранее, то команды установки виндовых путей просто не выполнятся.

    3. Поменяем права на созданный скрипт, чтобы сделать его исполняемым файлом:
      chmod +x script.sh
    4. В 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
    5. Осталось только поменять пути в некоторых питоновских скриптах:
      • /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"

Добавить комментарий