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