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