Skip to content

Commit 7335b66

Browse files
committed
OTA filename according to ZCL
1 parent 151f0c3 commit 7335b66

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
- name: Build
3333
id: make
3434
run: |
35-
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target=z03mmc.ota
35+
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target=z03mmc.zigbee
3636
echo "status=success" >> $GITHUB_OUTPUT
3737
3838
- name: Build additional firmware with Heiman model
@@ -51,5 +51,5 @@ jobs:
5151
# A file, directory or wildcard pattern that describes what to upload
5252
path: |
5353
${{ env.ARTIFACT_DIR }}/*.bin
54-
${{ env.ARTIFACT_DIR }}/*.ota
54+
${{ env.ARTIFACT_DIR }}/*.zigbee
5555

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ it compatible with Zigbee networks.
5151
3. Configure and build:
5252
```sh
5353
cmake -DSDK_PREFIX=$(pwd)/../tl_zigbee_sdk -DTOOLCHAIN_PREFIX=$(pwd)/../tc32 -B build .
54-
cmake --build build --target z03mmc.bin
54+
cmake --build build --target z03mmc.zigbee
5555
```
5656

5757
Firmware binary is located at `build/src/z03mmc.bin`
58+
The binary with OTA header is at the same folder, ending with `z03mmc.zigbee`
5859

5960
## Flashing firmware with USB to UART
6061

cmake/TelinkSDK.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ FUNCTION(ADD_OTA_TARGET TARGET TOOLS_PATH)
4545
ELSE()
4646
SET(FILENAME "${TARGET}")
4747
ENDIF()
48-
ADD_CUSTOM_TARGET("${TARGET}.ota"
48+
ADD_CUSTOM_TARGET("${TARGET}.zigbee"
4949
DEPENDS ${TARGET}.bin
50-
COMMAND python3 ${TOOLS_PATH}/make_ota.py ${FILENAME}.bin -o ${FILENAME}.ota
50+
COMMAND python3 ${TOOLS_PATH}/make_ota.py ${FILENAME}.bin
5151
)
5252
ENDFUNCTION()
5353

tools/make_ota.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import argparse
44
import binascii
5+
import os
56
import struct
67

78
OTA_MAGIC = b'\x5d\x02'
@@ -10,7 +11,7 @@
1011
def main(args):
1112
assert args.input_file != args.output
1213

13-
with open(args.input_file, 'rb') as bin_file:
14+
with (open(args.input_file, 'rb') as bin_file):
1415
bin_file.seek(0, 0)
1516
firmware = bytearray(bin_file.read(-1))
1617
if firmware[6:8] != OTA_MAGIC:
@@ -30,30 +31,49 @@ def main(args):
3031
header_size = 56
3132
firmware_len = len(firmware)
3233
total_image_size = firmware_len + header_size + 6
34+
manufacturer_code = int.from_bytes(firmware[18:20], byteorder='little')
35+
image_type = int.from_bytes(firmware[20:22], byteorder='little')
36+
file_version = args.set_version or int.from_bytes(firmware[2:6], byteorder='little')
3337
ota_hdr = ota_hdr_s.pack(
3438
0xbeef11e,
3539
0x100, # header version is 0x0100
3640
header_size,
3741
0, # ota_ext_hdr_value if ota_ext_hdr else 0,
38-
int.from_bytes(firmware[18:20], byteorder='little'), # args.manufacturer,
39-
int.from_bytes(firmware[20:22], byteorder='little'), # args.image_type,
40-
args.set_version or int.from_bytes(firmware[2:6], byteorder='little'), # 0x10023001 # options.File_Version
42+
manufacturer_code, # args.manufacturer,
43+
image_type, # args.image_type,
44+
file_version, # options.File_Version
4145
args.ota_version, # options.stack_version,
4246
b'\x00' * 32, # OTA_Header_String.encode(),
4347
total_image_size,
4448
)
49+
# add chunk header: 0 - firmware type
4550
ota_hdr += struct.pack('<HI', 0, firmware_len)
46-
with open(args.output, 'wb') as output:
51+
52+
out_filename = args.output
53+
if not out_filename:
54+
head, tail = os.path.split(args.input_file)
55+
if args.output_title:
56+
name = args.output_title
57+
else:
58+
name, _ = os.path.splitext(tail)
59+
out_filename = os.path.join(head, '{:04x}-{:04x}-{:08x}-{}.zigbee'.format(
60+
manufacturer_code,
61+
image_type,
62+
file_version,
63+
name,
64+
))
65+
with open(out_filename, 'wb') as output:
4766
bin_file.seek(0, 0)
4867
output.write(ota_hdr)
4968
output.write(firmware)
50-
print("%s was created with ZCL OTA Header." % args.output)
69+
print("%s was created with ZCL OTA Header." % out_filename)
5170

5271

5372
if __name__ == '__main__':
5473
parser = argparse.ArgumentParser()
5574
parser.add_argument("input_file", help="path to input file")
56-
parser.add_argument("-o", '--output', help="path to output file", required=True)
75+
parser.add_argument("-ot", '--output-title', help="replace original file name with the string")
76+
parser.add_argument("-o", '--output', help="path to output file")
5777
# sync with g_zcl_basicAttrs.stackVersion
5878
parser.add_argument("-s", '--ota-version', type=int, help="OTA stack version", default=2)
5979
parser.add_argument("-v", '--set-version', type=lambda x: int(x, 0), help="Override version from BIN")

0 commit comments

Comments
 (0)