Mercurial > public > hwos_code
comparison doc/comm-docu.txt @ 631:185ba2f91f59
3.09 beta 1 release
author | heinrichsweikamp |
---|---|
date | Fri, 28 Feb 2020 15:45:07 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
630:4cd81bdbf15c | 631:185ba2f91f59 |
---|---|
1 OSTC hwos Tech Firmware COMM Mode Documentation | |
2 =============================================== | |
3 | |
4 Remarks: - timeouts restart on each received byte | |
5 - 3 byte start address and 3 byte length are expected in network byte format (big endian) | |
6 | |
7 | |
8 comm_mode_selection_loop: ## entry point when COMM Mode is started ## | |
9 | |
10 try to receive 1 byte, timeout after 4 minutes | |
11 received 0xBB -> goto comm_download_mode | |
12 received 0xAA -> goto comm_service_mode_check | |
13 timeout -> send 0xFF | |
14 quit comm mode | |
15 | |
16 | |
17 comm_service_mode_check: ## received start byte for service mode, await service key ## | |
18 | |
19 send 0x4B | |
20 | | |
21 | Attention: do not send the next 3 bytes in one batch, wait for | |
22 | the echo of each byte before sending the next one | |
23 | | |
24 try to receive 1 byte (upper byte of comm service key), timeout after 400 ms | |
25 echo received byte | |
26 try to receive 1 byte (high byte of comm service key), timeout after 400 ms | |
27 echo received byte | |
28 try to receive 1 byte (low byte of comm service key), timeout after 400 ms | |
29 echo received byte | |
30 service key correct -> enable comm_service_mode, goto comm_command_loop | |
31 service key not correct -> goto comm_mode_selection_loop | |
32 timeout -> goto comm_mode_selection_loop | |
33 | |
34 | |
35 comm_download_mode: ## received start byte for download mode ## | |
36 | |
37 send 0xBB | |
38 goto comm_command_loop | |
39 | |
40 | |
41 comm_command_loop: ## wait for a command ## | |
42 | |
43 if comm_service_mode is enabled -> send 0x4C | |
44 else -> send 0x4D | |
45 | |
46 try to receive 1 byte, timeout after 2 minutes | |
47 | |
48 timeout -> send 0xFF and quit comm mode | |
49 received 0x6E -> goto comm_show_text n show a text on the screen | |
50 received 0x69 -> goto comm_identify i send ID: serial, firmware, and custom text | |
51 received 0x6A -> goto comm_hardware_descriptor j send ID: hardware descriptor byte | |
52 received 0x60 -> goto comm_feature_and_hardware ' send ID: more detailed information | |
53 received 0x6D -> goto comm_send_headers_short m send all headers in compact format | |
54 received 0x61 -> goto comm_send_headers_full a send all headers is full format | |
55 received 0x66 -> goto comm_send_dive f send header and profile for one dive | |
56 received 0x62 -> goto comm_set_time b set the real time clock | |
57 received 0x63 -> goto comm_set_custom_text c write a new custom text | |
58 received 0x72 -> goto comm_read_option r read an option value | |
59 received 0x77 -> goto comm_write_option w write an option value (into RAM) | |
60 received 0x78 -> goto comm_option_reset_all x reset all option values to their factory default | |
61 received 0xFF -> send 0xFF and quit comm mode | |
62 | |
63 the following commands are only evaluated if comm_service_mode is enabled: | |
64 | |
65 received 0x23 -> goto comm_reset_battery_gauge # reset the battery gauge registers | |
66 received 0x22 -> goto comm_erase_complete_logbook " reset all logbook pointers and the logbook | |
67 received 0x20 -> goto comm_read_range ' ' read a memory range from the external FLASH | |
68 received 0x40 -> goto comm_erase_4kb @ erase one 4 kB block - Warning: no confirmation or built-in safety here... | |
69 received 0x42 -> goto comm_erase_range4kb B erase a range of 4 kB blocks - Warning: no confirmation or built-in safety here... | |
70 received 0x30 -> goto comm_write_range_stream 0 write a stream of bytes starting at ext_flash_address:3 until timeout | |
71 received 0x31 -> goto comm_write_range_block 1 write a block of 256 bytes starting at ext_flash_address:3 (only available with FW >= 3.08) | |
72 received 0x50 -> goto comm_firmware_update P initiate firmware update | |
73 received 0xC1 -> goto comm_cold_start start low-level bootloader | |
74 | |
75 | |
76 | |
77 comm_set_time: ## set the real time clock ## | |
78 | |
79 send 0x62 | |
80 try to receive 6 bytes in sequence: hour, minute, second, month, day, year, timeout 400 ms | |
81 timeout -> goto comm_command_loop | |
82 else -> set RTC, goto comm_command_loop | |
83 | |
84 | |
85 comm_show_text: ## write a 15 char text to the OSTC display ## | |
86 | |
87 send 0x6E | |
88 try to receive 16 characters, timeout 400 ms | |
89 print whatever has been received to the display | |
90 goto comm_command_loop | |
91 | |
92 | |
93 comm_identify: ## reply serial, firmware and custom text ## | |
94 | |
95 send 0x69 | |
96 send 1 byte serial number, low byte | |
97 send 1 byte serial number, high byte | |
98 send 1 byte firmware version, major | |
99 send 1 byte firmware version, minor | |
100 send 60 byte custom text | |
101 goto comm_command_loop | |
102 | |
103 | |
104 comm_hardware_descriptor: ## reply short hardware descriptor ## | |
105 | |
106 send 0x6A | |
107 send 1 byte hardware descriptor | |
108 goto comm_command_loop | |
109 | |
110 | |
111 comm_feature_and_hardware: ## reply detailed hardware descriptor ## | |
112 | |
113 send 0x60 | |
114 send 0x00 | |
115 send 1 byte hardware descriptor | |
116 send 0x00 | |
117 send 0x00 | |
118 send 0x00 | |
119 goto comm_command_loop | |
120 | |
121 | |
122 comm_send_headers_short: ## send short version of dive headers ## | |
123 | |
124 send 0x6D | |
125 send 256 x 16 bytes (extract from the headers) | |
126 goto comm_command_loop | |
127 | |
128 | |
129 comm_send_headers_full: ## send complete dive headers ## | |
130 | |
131 send 0x61 | |
132 send 256 x 256 bytes | |
133 goto comm_command_loop | |
134 | |
135 | |
136 comm_send_dive: ## send one full dive ## | |
137 | |
138 send 0x66 | |
139 try to receive 1 byte (dive index), timeout 400 ms | |
140 timeout -> goto comm_command_loop | |
141 no profile data available -> goto comm_command_loop | |
142 else -> send 256 byte dive header (begins with 0xFAFA) | |
143 send ??? byte dive profile (ends with 0xFDFD) | |
144 goto comm_command_loop | |
145 | |
146 | |
147 comm_option_reset_all: ## reset all options to factory default ## | |
148 | |
149 send 0x78 | |
150 reset all option values to default | |
151 goto comm_command_loop | |
152 | |
153 | |
154 comm_set_custom_text: ## set custom text ## | |
155 | |
156 send 0x63 | |
157 try to receive 60 byte, timeout 400 ms | |
158 clear complete old custom text | |
159 store the 0...60 bytes that have been received as new custom text | |
160 goto comm_command_loop | |
161 | |
162 | |
163 comm_reset_battery_gauge: ## reset battery gauge ## | |
164 | |
165 (no acknowledge send) | |
166 reset battery registers and battery gauge chip | |
167 goto comm_command_loop | |
168 | |
169 | |
170 | |
171 comm_erase_complete_logbook: ## erase complete Logbook ## | |
172 | |
173 (no acknowledge send) | |
174 erase complete logbook | |
175 goto comm_command_loop | |
176 | |
177 | |
178 comm_cold_start: ## start bootloader (cold start) ## | |
179 | |
180 (no acknowledge send) | |
181 backup crucial data from RAM to EEPROM | |
182 jump into the bootloader/cold start | |
183 | |
184 | |
185 comm_firmware_update: ## initiate firmware update ## | |
186 | |
187 send 0x50 | |
188 try to receive 5 byte checksum, timeout 400 ms | |
189 timeout -> send 0xFF, goto comm_command_loop | |
190 checksum faulty -> send 0xFF, goto comm_command_loop | |
191 else -> send 0x4C | |
192 backup crucial data from RAM to EEPROM | |
193 jump into bootloader/FW update | |
194 | |
195 | |
196 comm_erase_range4kb: ## erase a memory range ## | |
197 | |
198 send 0x42 | |
199 try to receive 3 byte start address, timeout 400 ms | |
200 try to receive 1 byte block count, timeout 400 ms | |
201 any timeout -> goto comm_command_loop | |
202 else -> erase FLASH from start address, range block_count x 4 kByte | |
203 goto comm_command_loop | |
204 | |
205 | |
206 comm_erase_4kb: ## erase one 4 kB block ## | |
207 | |
208 (no acknowledge send) | |
209 try to receive 3 byte start address, timeout 400 ms | |
210 timeout -> goto comm_command_loop | |
211 else -> erase FLASH from start address, range 4 kByte | |
212 goto comm_command_loop | |
213 | |
214 | |
215 comm_write_range_stream: ## write a stream of bytes to the FLASH ## | |
216 | |
217 send 0x30 | |
218 try to receive 3 byte start address, timeout 400 ms | |
219 timeout -> goto comm_command_loop | |
220 else -> loop {try to receive 1 byte, write byte to FLASH } until timeout | |
221 | | |
222 | Attention: Do not send the bytes too fast as the OSTC needs | |
223 | some time for each byte to write it to the FLASH. | |
224 | | |
225 | Bytes will be received and written to FLASH until a timeout occurs, | |
226 | i.e. to end the writing stop sending and await the timeout to trigger. | |
227 | | |
228 timeout -> goto comm_command_loop | |
229 | |
230 | |
231 comm_write_range_block: ## write a block of 256 bytes to the FLASH ## | |
232 (only available with FW >= 3.08) | |
233 send 0x31 | |
234 try to receive 3 byte start address, timeout 400 ms | |
235 timeout -> goto comm_command_loop | |
236 low byte of start address <> 0 -> goto comm_command_loop | |
237 else -> try to receive 256 byte, timeout 400 ms | |
238 timeout -> goto comm_command_loop | |
239 else -> write the 256 byte to FLASH | |
240 goto comm_command_loop | |
241 | |
242 | |
243 comm_read_range: ## read a range from FLASH ## | |
244 | |
245 send 0x20 | |
246 try to receive 3 byte start address, timeout 400 ms | |
247 try to receive 3 byte length, timeout 400 ms | |
248 any timeout -> goto comm_command_loop | |
249 else -> loop {read 1 byte from FLASH, send 1 byte } until #length bytes done | |
250 goto comm_command_loop | |
251 | |
252 | |
253 comm_read_option: ## read an option value ## | |
254 | |
255 send 0x72 | |
256 try to receive 1 byte option index, timeout 400 ms | |
257 timeout -> goto comm_command_loop | |
258 index = 0x10 - 0x19 -> send 4 bytes in sequence O2%, He%, type, change depth | |
259 goto comm_command_loop | |
260 index = 0x1A - 0x1E -> send 2 bytes in sequence setpoint cbar, change depth | |
261 goto comm_command_loop | |
262 index = 0x1F - 0xXX -> send 1 byte option value (0xXX last index in use, depends on FW version) | |
263 goto comm_command_loop | |
264 else -> goto comm_command_loop | |
265 | |
266 | |
267 comm_write_option: ## write an option value ## | |
268 | |
269 send 0x77 | |
270 try to receive 1 byte option value, timeout 400 ms | |
271 timeout -> goto comm_command_loop | |
272 | | |
273 | Attention: do not send the option values too fast after the option index, | |
274 | as the OSTC does not know how many bytes will follow after the | |
275 | index before it has actually evaluated the index! | |
276 | This is a flaw in the protocol design... | |
277 | | |
278 index = 0x10 - 0x19 -> try to receive 4 byte in sequence O2%, He%, type, change depth | |
279 timeout -> goto comm_command_loop | |
280 else -> update option | |
281 goto comm_command_loop | |
282 index = 0x1A - 0x1E -> try to receive 2 bytes in sequence setpoint cbar, change depth | |
283 timeout -> goto comm_command_loop | |
284 else -> update option | |
285 goto comm_command_loop | |
286 index = 0x1F - 0xXX -> try to receive 1 byte option value (0xXX last index in use, depends on FW version) | |
287 timeout -> goto comm_command_loop | |
288 else -> update option | |
289 goto comm_command_loop | |
290 else -> goto comm_command_loop |