mirror of https://github.com/lumapu/ahoy.git
Browse Source
* added script and [instructions](../manual/factory_firmware.md) how to generate factory firmware which includes predefined settingsmain
5 changed files with 117 additions and 0 deletions
@ -0,0 +1,59 @@ |
|||||
|
# Generate factory firmware |
||||
|
|
||||
|
If the firmware should already contain predefined settings this guide will help you to compile these into a single binary file. |
||||
|
|
||||
|
## Generate default settings |
||||
|
|
||||
|
First install on the requested platform the standard firmware and configure everything to your needs. Once you did all changes store them and export them to a `json` file. |
||||
|
|
||||
|
## Further prepare default settings |
||||
|
|
||||
|
First create a directory `data` inside the following project path: `src/`. |
||||
|
|
||||
|
As the export removes all your password you need to add them again to the `json` file. Open the `json` file with a text editor and search for all the `"pwd": ""`. Between the second bunch of quotation marks you have to place the password. |
||||
|
|
||||
|
*Note: It's recommended to keep all information in one line to save space on the ESP littlefs partition* |
||||
|
|
||||
|
Next rename your export file to `settings.json` and move it to the new created directory. It should be look similar to this: |
||||
|
|
||||
|
``` |
||||
|
ahoy |
||||
|
|-- src |
||||
|
|-- data |
||||
|
|-- settings.json |
||||
|
|-- config |
||||
|
|-- network |
||||
|
... |
||||
|
``` |
||||
|
|
||||
|
## modify platform.ini to build factory binary |
||||
|
|
||||
|
Open the file `src/platformio.ini` and uncomment the following line `#post:../scripts/add_littlefs_binary.py` (remove the `#`) |
||||
|
|
||||
|
## build firmware |
||||
|
|
||||
|
Choose your prefered environment and build firmware as usual. Once the process is finished you should find along with the standard `firmware.bin` an additional file called `firmware.factory.bin`. Both files are located here: `src/.pio/build/[ENVIRONMENT]/` |
||||
|
|
||||
|
## Upload to device |
||||
|
|
||||
|
Python: |
||||
|
`esptool.py -b 921600 write_flash --flash_mode dio --flash_size detect 0x10000 firmware.factory.bin` |
||||
|
|
||||
|
Windows: |
||||
|
`esptool.exe -b 921600 write_flash --flash_mode dio --flash_size detect 0x10000 firmware.factory.bin` |
||||
|
|
||||
|
For a 4MB flash size the upload should be finished within 22 seconds. |
||||
|
|
||||
|
## Testing |
||||
|
|
||||
|
Reboot your ESP an check if all your settings are present. |
||||
|
|
||||
|
## Keep updated with 'Mainline' |
||||
|
|
||||
|
From time to time a new version of AhoyDTU will be published. To get this changes into your alread prepared factory binary generation environment you have to do only a few steps: |
||||
|
|
||||
|
1. revert the changes of `platformio.ini` by executing from repository root: `git checkout src/platformio.ini` |
||||
|
2. pull new changes from remote: `git pull` |
||||
|
3. modify the `platformio.ini` again as you can read above (remove comment) |
||||
|
4. build and upload |
||||
|
5. enjoy |
@ -0,0 +1,55 @@ |
|||||
|
import os |
||||
|
import subprocess |
||||
|
import shutil |
||||
|
Import("env") |
||||
|
|
||||
|
|
||||
|
def build_littlefs(): |
||||
|
result = subprocess.run(["pio", "run", "--target", "buildfs", "--environment", env['PIOENV']]) |
||||
|
if result.returncode != 0: |
||||
|
print("Error building LittleFS:") |
||||
|
exit(1) |
||||
|
else: |
||||
|
print("LittleFS build successful") |
||||
|
|
||||
|
def merge_bins(): |
||||
|
flash_size = int(env.get("BOARD_FLASH_SIZE", "4MB").replace("MB", "")) |
||||
|
app0_offset = 0x10000 |
||||
|
if env['PIOENV'][:7] == "esp8266": |
||||
|
app0_offset = 0 |
||||
|
elif env['PIOENV'][:7] == "esp8285": |
||||
|
app0_offset = 0 |
||||
|
|
||||
|
littlefs_offset = 0x290000 |
||||
|
if flash_size == 8: |
||||
|
littlefs_offset = 0x670000 |
||||
|
elif flash_size == 16: |
||||
|
littlefs_offset = 0xc90000 |
||||
|
|
||||
|
# save current wd |
||||
|
start = os.getcwd() |
||||
|
os.chdir('.pio/build/' + env['PIOENV'] + '/') |
||||
|
|
||||
|
with open("firmware.bin", "rb") as firmware_file: |
||||
|
firmware_data = firmware_file.read() |
||||
|
|
||||
|
with open("littlefs.bin", "rb") as littlefs_file: |
||||
|
littlefs_data = littlefs_file.read() |
||||
|
|
||||
|
with open("firmware.factory.bin", "wb") as merged_file: |
||||
|
# fill gap with 0xff |
||||
|
merged_file.write(firmware_data) |
||||
|
if len(firmware_data) < (littlefs_offset - app0_offset): |
||||
|
merged_file.write(b'\xFF' * ((littlefs_offset - app0_offset) - len(firmware_data))) |
||||
|
|
||||
|
merged_file.write(littlefs_data) |
||||
|
|
||||
|
os.chdir(start) |
||||
|
|
||||
|
def main(target, source, env): |
||||
|
build_littlefs() |
||||
|
merge_bins() |
||||
|
|
||||
|
|
||||
|
# ensure that script is called once firmeware was compiled |
||||
|
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", main) |
Loading…
Reference in new issue