Mercurial > public > ostc4
annotate Discovery/Src/externCPU2bootloader.c @ 471:73da921869d9 fix-bat-2
bugfix: implement battery charge percentage in dive header
This commit is (much) less trivial than the related 919e5cb51c92.
First, rename the CCRmode attribute (corresponding to byte Ox59) of
the SLogbookHeaderOSTC3. This byte (according to the hwOS interface
document) does not contain any CCR related value, but it contains
"battery information". Already since 2017, this byte is used from
libdivecomputer to interface the charge percentage. So, its
renamed from CCRmode to batteryCharge, to reflect its true purpose.
Now, simply add a batteryCharge attribute to the SLogbookHeader
(and see below why that is possible, without breaking things).
The remaining changes are trivial to implement battery charge
percentage in dive header.
Caveat: do not get confused by the exact role of the individual
logbook header types. SLogbookHeaderOSTC3 is the formal type of
the logbook format that the OSTC4 produces. This format is
supposed to identical to the format, as is used in hwOS for the
series of small OSTCs. Only some values of attributes are different.
For example, the OSTC4 supports VPM, so byte 0x79 (deco model used
for this dive) also has a value for VPM. But the SLogbookHeader
type, despite its name and structure, is *not* a true logbook
header, as it includes attributes that are not available in the
SLogbookHeaderOSTC3 formal header type.
Signed-off-by: Jan Mulder <jan@jlmulder.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Wed, 22 Apr 2020 13:08:57 +0200 |
parents | 5ca177d2df5d |
children | 01f40cb1057e |
rev | line source |
---|---|
38 | 1 /** |
2 ****************************************************************************** | |
3 * @file externCPU2bootloader.c Template | |
4 * @author heinrichs weikamp gmbh | |
5 * @version V0.0.1 | |
6 * @date 23-Oct-2014 | |
7 * @version V0.0.1 | |
8 * @since 23-Oct-2014 | |
9 * @brief Main Template to communicate with the second CPU in bootloader mode | |
10 * bootloader ROM build by ST and defined in AN4286 | |
11 * | |
12 @verbatim | |
13 ============================================================================== | |
14 ##### How to use ##### | |
15 ============================================================================== | |
16 @endverbatim | |
17 ****************************************************************************** | |
18 * @attention | |
19 * | |
20 * <h2><center>© COPYRIGHT(c) 2016 heinrichs weikamp</center></h2> | |
21 * | |
22 ****************************************************************************** | |
23 */ | |
24 | |
25 /* Includes ------------------------------------------------------------------*/ | |
26 #include "stm32f4xx_hal.h" | |
27 #include "stdio.h" | |
28 #include "ostc.h" | |
29 #include "settings.h" | |
30 #include "externCPU2bootloader.h" | |
31 #include "externLogbookFlash.h" | |
32 #include "tComm.h" | |
33 | |
34 | |
35 /* Exported variables --------------------------------------------------------*/ | |
36 | |
37 /* Private types -------------------------------------------------------------*/ | |
38 | |
39 /* Private variables ---------------------------------------------------------*/ | |
40 | |
41 /* Private function prototypes -----------------------------------------------*/ | |
42 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
43 static uint8_t boot_sync_frame(void); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
44 static uint8_t boot_ack(void); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
45 static uint8_t boot_get_id(uint8_t *RxBuffer); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
46 static uint8_t boot_get_version(uint8_t *RxBuffer); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
47 static uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
48 static uint8_t boot_erase_memory(void); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
49 static void Bootloader_send_command(uint8_t command); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
50 static void Bootloader_spi_single(uint8_t TxByte); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
51 static void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer); |
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
52 static void Bootloader_Error_Handler(void); |
38 | 53 |
54 /* Exported functions --------------------------------------------------------*/ | |
55 | |
56 uint8_t extCPU2bootloader_start(uint8_t *version, uint16_t *chipID) | |
57 { | |
58 uint8_t aRxBuffer[256] = { 0 }; | |
59 | |
60 HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); | |
61 | |
62 boot_sync_frame(); | |
63 boot_get_version(aRxBuffer); | |
64 *version = aRxBuffer[1]; | |
65 HAL_Delay(10); | |
66 boot_get_id(aRxBuffer); | |
67 *chipID = ((uint16_t)aRxBuffer[2]) << 8; | |
68 *chipID += (uint16_t)aRxBuffer[3]; | |
69 HAL_Delay(10); | |
70 if((*chipID == 0x431) && (*version > 10) && (*version < 32)) | |
71 return 1; | |
72 else | |
73 return 0; | |
74 } | |
75 | |
76 | |
53 | 77 uint8_t extCPU2bootloader_internal(uint8_t* buffer, uint32_t length, char* display_text) |
38 | 78 { |
79 uint8_t version = 0; | |
80 uint16_t chipID = 0; | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
81 |
38 | 82 if(!extCPU2bootloader_start(&version,&chipID)) |
83 return 0; | |
84 if(!boot_erase_memory()) | |
85 return 0; | |
86 HAL_Delay(100); | |
87 uint16_t i=0; | |
53 | 88 uint32_t lengthsave = length; |
38 | 89 uint8_t percent = 0; |
90 | |
91 while(length) | |
92 { | |
93 percent = (100 * (i * 256)) /lengthsave; | |
94 tComm_verlauf(percent); | |
95 | |
96 if(length > 256) | |
97 { | |
98 if( !boot_write_memory(0x08000000 + (i * 256), 255, &buffer[i * 256]) ) | |
99 return 0;; | |
100 length -= 256; | |
101 | |
102 } | |
103 else | |
104 { | |
105 if(!boot_write_memory(0x08000000 + (i * 256), length - 1, &buffer[i * 256])) | |
106 return 0; | |
107 length = 0; | |
108 } | |
109 i++; | |
110 } | |
111 return 2; | |
112 } | |
113 | |
114 | |
53 | 115 uint8_t extCPU2bootloader(uint8_t* buffer, uint32_t length, char* display_text) |
38 | 116 { |
117 uint8_t result = 0; | |
118 | |
119 MX_SmallCPU_Reset_To_Boot(); | |
120 result = extCPU2bootloader_internal(buffer,length,display_text); | |
121 MX_SmallCPU_Reset_To_Standard(); | |
122 return result; | |
123 } | |
124 | |
125 /* Private functions --------------------------------------------------------*/ | |
126 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
127 static uint8_t boot_sync_frame(void) |
38 | 128 { |
129 Bootloader_spi_single(0x5a); | |
130 return boot_ack(); | |
131 } | |
132 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
133 static uint8_t boot_get_version(uint8_t *RxBuffer) |
38 | 134 { |
135 Bootloader_spi_single(0x5a); | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
136 Bootloader_send_command(0x01); |
38 | 137 if(!boot_ack()) |
138 return 0; | |
139 Bootloader_spi(3, NULL, RxBuffer); | |
140 return boot_ack(); | |
141 } | |
142 | |
143 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
144 static uint8_t boot_get_id(uint8_t *RxBuffer) |
38 | 145 { |
146 Bootloader_spi_single(0x5a); | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
147 Bootloader_send_command(0x02); |
38 | 148 if(!boot_ack()) |
149 return 0; | |
150 Bootloader_spi(5, NULL, RxBuffer); | |
151 return boot_ack(); | |
152 } | |
153 | |
154 | |
155 uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data) | |
156 { | |
157 uint8_t addressNew[4]; | |
158 uint8_t checksum = 0; | |
159 uint16_t length; | |
160 | |
161 Bootloader_spi_single(0x5a); | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
162 Bootloader_send_command(0x31); |
38 | 163 if(!boot_ack()) |
164 return 1; | |
165 HAL_Delay(5); | |
166 addressNew[0] = (uint8_t)((address >> 24) & 0xFF); | |
167 addressNew[1] = (uint8_t)((address >> 16) & 0xFF); | |
168 addressNew[2] = (uint8_t)((address >> 8) & 0xFF); | |
169 addressNew[3] = (uint8_t)((address >> 0) & 0xFF); | |
170 Bootloader_spi(4, addressNew, NULL); | |
171 checksum = 0; | |
172 checksum ^= addressNew[0]; | |
173 checksum ^= addressNew[1]; | |
174 checksum ^= addressNew[2]; | |
175 checksum ^= addressNew[3]; | |
176 Bootloader_spi_single(checksum); | |
177 if(!boot_ack()) | |
178 return 0; | |
179 HAL_Delay(1); | |
180 Bootloader_spi_single(length_minus_1); | |
181 length = ((uint16_t)length_minus_1) + 1; | |
182 Bootloader_spi(length, data, NULL); | |
183 HAL_Delay(26); | |
184 checksum = 0; | |
185 checksum ^= length_minus_1; | |
186 for(int i=0;i<length;i++) | |
187 checksum ^= data[i]; | |
188 Bootloader_spi_single(checksum); | |
189 | |
190 if(!boot_ack()) | |
191 return 0; | |
192 HAL_Delay(1); | |
193 return 1; | |
194 } | |
195 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
196 static uint8_t boot_erase_memory(void) |
38 | 197 { |
198 uint8_t special_erase_with_checksum[3] = {0xFF, 0xFF, 0x00}; | |
199 | |
200 Bootloader_spi_single(0x5a); | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
201 Bootloader_send_command(0x44); |
38 | 202 if(!boot_ack()) |
203 return 0; | |
204 Bootloader_spi(3, special_erase_with_checksum, NULL); | |
205 HAL_Delay(11000); /* 5.5 to 11 seconds */ | |
206 if(!boot_ack()) | |
207 return 0; | |
208 return 1; | |
209 } | |
210 | |
211 /* write unprotect does reset the system !! */ | |
212 uint8_t boot_write_unprotect(void) | |
213 { | |
214 Bootloader_spi_single(0x5a); | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
215 Bootloader_send_command(0x73); |
38 | 216 if(!boot_ack()) |
217 return 0; | |
218 return boot_ack(); | |
219 } | |
220 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
221 static uint8_t boot_ack(void) |
38 | 222 { |
223 uint8_t answer = 0; | |
224 | |
225 Bootloader_spi_single(0x00); | |
226 for(int i=0; i< 1000; i++) | |
227 { | |
228 Bootloader_spi(1, NULL, &answer); | |
229 if((answer == 0x79) || (answer == 0x1F)) | |
230 { | |
231 Bootloader_spi_single(0x79); | |
232 break; | |
233 } | |
234 HAL_Delay(10); | |
235 } | |
236 if(answer == 0x79) | |
237 return 1; | |
238 else | |
239 return 0; | |
240 } | |
241 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
242 static void Bootloader_send_command(uint8_t command) |
38 | 243 { |
244 uint8_t send[2]; | |
245 uint8_t receive[2]; | |
246 | |
247 send[0] = command; | |
248 send[1] = 0xFF ^ command; | |
249 Bootloader_spi(2, send, receive); | |
250 } | |
251 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
252 static void Bootloader_spi_single(uint8_t TxByte) |
38 | 253 { |
254 Bootloader_spi(1,&TxByte, 0); | |
255 } | |
256 | |
257 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
258 static void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer) |
38 | 259 { |
260 uint8_t dummy[256] = { 0 }; | |
261 uint8_t *tx_data; | |
262 uint8_t *rx_data; | |
263 | |
264 tx_data = aTxBuffer; | |
265 rx_data = aRxBuffer; | |
266 | |
267 if(aTxBuffer == NULL) | |
268 tx_data = dummy; | |
269 if(aRxBuffer == NULL) | |
270 rx_data = dummy; | |
271 | |
272 //HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_RESET); // only for testing with Oscilloscope | |
273 | |
274 | |
275 HAL_SPI_TransmitReceive(&cpu2DmaSpi, (uint8_t *)tx_data, (uint8_t *)rx_data, (uint16_t)lengthData,1000); | |
276 /* | |
277 if(HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)tx_data, (uint8_t *)rx_data, (uint16_t)lengthData) != HAL_OK) | |
278 if(HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)tx_data, (uint8_t *)rx_data, (uint16_t)lengthData) != HAL_OK) | |
279 Bootloader_Error_Handler(); | |
280 | |
281 while (HAL_SPI_GetState(&cpu2DmaSpi) != HAL_SPI_STATE_READY)// only for testing with Oscilloscope | |
282 { | |
283 } | |
284 HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_SET); // only for testing with Oscilloscope | |
285 */ | |
286 } | |
287 | |
288 | |
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
53
diff
changeset
|
289 static void Bootloader_Error_Handler(void) |
38 | 290 { |
291 while(1); | |
292 } |