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