1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#
# LWS-style images are composed like this
#
# [ OTA or Factory standard xpressif image ]
# [ 32-b LE len ] [ ROMFS ]
# [ 32-b LE len ] [ Image information JSON ]
#
SHELL=/bin/bash
# check genromfs is available
GENROMFS := $(shell command -v genromfs 2> /dev/null)
# check xxd is available
XXD := $(shell command -v xxd 2> /dev/null)
ESPPORT ?= $(CONFIG_ESPTOOLPY_PORT)
LWS_BUILD_PATH=$(PROJECT_PATH)/build
jbi=$(LWS_BUILD_PATH)/json-buildinfo
FAC=$(CONFIG_LWS_IS_FACTORY_APPLICATION)
ifeq ($(FAC),)
FAC=0
endif
export FAC
$(LWS_BUILD_PATH)/pack.img: $(APP_BIN)
if [ -z "$(GENROMFS)" ]; then \
echo "ERROR: genromfs is unavailable, please install or compile genromfs" ; \
exit 1 ; \
fi; \
if [ -z "$(XXD)" ]; then \
echo "ERROR: xxd is unavailable, please install or compile xxd (usually provided by vim package)" ; \
exit 1 ; \
fi; \
GNUSTAT=stat ;\
if [ `which gstat 2>/dev/null` ] ; then GNUSTAT=gstat ; fi ;\
genromfs -f $(LWS_BUILD_PATH)/romfs.img -d $(PROJECT_PATH)/romfs-files ; \
RLEN=$$($$GNUSTAT -c %s $(LWS_BUILD_PATH)/romfs.img) ;\
LEN=$$($$GNUSTAT -c %s $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin) ;\
printf " Original length: 0x%06x (%8d)\n" $$LEN $$LEN ; \
printf %02x $$(( $$RLEN % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
printf %02x $$(( ( $$RLEN / 256 ) % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
printf %02x $$(( ( $$RLEN / 65536 ) % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
printf %02x $$(( ( $$RLEN / 16777216 ) % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
cat $(LWS_BUILD_PATH)/romfs.img >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ; \
LEN=$$($$GNUSTAT -c %s $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin) ;\
UNIXTIME=$$(date +%s | tr -d '\n') ; \
echo -n -e "{\r\n \"schema\": \"lws1\",\r\n \"model\": \"$(CONFIG_LWS_MODEL_NAME)\",\r\n \"builder\": \"" > $(jbi) ;\
hostname | tr -d '\n' >> $(jbi) ;\
echo -n -e "\",\r\n \"app\": \"" >> $(jbi) ;\
echo -n $(PROJECT_NAME) >> $(jbi) ;\
echo -n -e "\",\r\n \"user\": \"" >> $(jbi) ;\
whoami | tr -d '\n' >>$(jbi) ;\
echo -n -e "\",\r\n \"git\": \"" >> $(jbi) ;\
git describe --dirty --always | tr -d '\n' >> $(jbi) ;\
echo -n -e "\",\r\n \"date\": \"" >> $(jbi) ;\
date | tr -d '\n' >> $(jbi) ;\
echo -n -e "\",\r\n \"unixtime\": \"" >> $(jbi) ;\
echo -n $$UNIXTIME >> $(jbi) ;\
echo -n -e "\",\r\n \"file\": \""$(PROJECT_NAME)-$$UNIXTIME.bin >> $(jbi) ;\
echo -n -e "\",\r\n \"factory\": \"$(FAC)" >> $(jbi) ;\
echo -n -e "\"\r\n}" >> $(jbi) ;\
JLEN=$$($$GNUSTAT -c %s $(jbi)) ;\
printf %02x $$(( $$JLEN % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
printf %02x $$(( ( $$JLEN / 256 ) % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
printf %02x $$(( ( $$JLEN / 65536 ) % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
printf %02x $$(( ( $$JLEN / 16777216 ) % 256 )) | xxd -r -p >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
cat $(jbi) >> $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin ;\
cp $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin $(LWS_BUILD_PATH)/pack.img ;\
LEN=$$($$GNUSTAT -c %s $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin) ;\
cp $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin $(LWS_BUILD_PATH)/$(PROJECT_NAME)-$$UNIXTIME.bin ;\
printf " After ROMFS + Build info: 0x%06x (%8d)\n" $$LEN $$LEN
.PHONY: manifest
manifest:
ifeq ($F,)
echo "Usage make F=<factory app dir> A=<app dir> manifest"
exit 1
endif
ifeq ($A,)
echo "Usage make F=<factory app dir> A=<app dir> manifest"
exit 1
endif
echo -n -e "{\r\n\"app\": " > build/manifest.json
cat $(A)/build/json-buildinfo >> build/manifest.json
echo -n -e ", \"factory\": " >> build/manifest.json
cat $(F)/build/json-buildinfo >> build/manifest.json
echo -n -e "\r\n}\r\n" >> build/manifest.json
all: $(LWS_BUILD_PATH)/pack.img
flash: $(LWS_BUILD_PATH)/pack.img
lws_flash_ota: $(LWS_BUILD_PATH)/pack.img
$(IDF_PATH)/components/esptool_py/esptool/esptool.py \
--chip esp32 \
--port $(ESPPORT) \
--baud $(CONFIG_ESPTOOLPY_BAUD) \
write_flash 0x120000 $(LWS_BUILD_PATH)/$(PROJECT_NAME).bin
lws_erase_ota:
$(IDF_PATH)/components/esptool_py/esptool/esptool.py \
--chip esp32 \
--port $(ESPPORT) \
--baud $(CONFIG_ESPTOOLPY_BAUD) \
erase_region 0x120000 0x2e0000
export A
export F
.PHONY: upload
upload: manifest
ifeq ($F,)
echo "Usage make F=<factory app dir> A=<app dir> manifest"
exit 1
endif
ifeq ($A,)
echo "Usage make F=<factory app dir> A=<app dir> manifest"
exit 1
endif
UPL=$(CONFIG_LWS_OTA_SERVER_UPLOAD_USER)@$(CONFIG_LWS_OTA_SERVER_FQDN):$(CONFIG_LWS_OTA_SERVER_UPLOAD_PATH)/$(CONFIG_LWS_OTA_SERVER_BASE_URL)/$(CONFIG_LWS_MODEL_NAME)/ ;\
AFILE=$(A)/build/$$(cat $$A/build/json-buildinfo | grep -- \"file\"\: |cut -d' ' -f3 |cut -d'"' -f2) ;\
echo " Uploading $$AFILE to " $$UPL ;\
scp $$AFILE $$UPL ;\
FFILE=$(F)/build/$$(cat $$F/build/json-buildinfo | grep -- \"file\"\: |cut -d' ' -f3 |cut -d'"' -f2) ;\
echo " Uploading $$FFILE" ;\
scp $$FFILE $$UPL ;\
echo " Uploading manifest" ;\
scp build/manifest.json $$UPL
|