12
12
#define READ_WRITE_TIMEOUT_MS 10
13
13
#define READ_RESP_TIMEOUT_MS 30000
14
14
#define SERIAL_PORT_SPEED 4000000
15
+ #define READ_TIMEOUT_MS 100
16
+ #define ERASE_TIMEOUT_MS 10000
15
17
16
18
Programmer::Programmer (QObject *parent) : QObject(parent)
17
19
{
@@ -151,37 +153,51 @@ int Programmer::handleWrongResp(uint8_t code)
151
153
return -1 ;
152
154
}
153
155
156
+ int Programmer::readRespHeader (const QByteArray *data, RespHeader *&header)
157
+ {
158
+ uint size = data->size ();
159
+
160
+ if (size < sizeof (RespHeader))
161
+ {
162
+ qCritical () << " Programmer error: response header size is wrong:"
163
+ << size;
164
+ return -1 ;
165
+ }
166
+
167
+ header = (RespHeader *)data->data ();
168
+
169
+ return 0 ;
170
+ }
171
+
154
172
void Programmer::readRespChipIdCb (int status)
155
173
{
156
174
uint size;
175
+ RespHeader *header;
157
176
RespId *respId;
158
177
159
178
if (status == SerialPortReader::READ_ERROR)
160
179
return ;
161
180
162
- size = readData.size ();
163
- if (size < sizeof (RespHeader))
164
- {
165
- qCritical () << " Header size of chip ID response is wrong:" << size;
181
+ if (readRespHeader (&readData, header))
166
182
return ;
167
- }
168
183
169
- respId = (RespId *)readData.data ();
170
- switch (respId->header .code )
184
+ switch (header->code )
171
185
{
172
186
case RESP_DATA:
173
- if (size < sizeof (RespId))
187
+ size = readData.size ();
188
+ if (size < (int )sizeof (RespId))
174
189
{
175
190
qCritical () << " Size of chip ID response is wrong:" << size;
176
191
return ;
177
192
}
193
+ respId = (RespId *)readData.data ();
178
194
readChipIdCb (respId->nandId );
179
195
break ;
180
196
case RESP_STATUS:
181
- handleStatus (&respId-> header );
197
+ handleStatus (header);
182
198
break ;
183
199
default :
184
- handleWrongResp (respId-> header . code );
200
+ handleWrongResp (header-> code );
185
201
break ;
186
202
}
187
203
}
@@ -198,7 +214,7 @@ void Programmer::readChipId(std::function<void(ChipId)> callback)
198
214
199
215
readData.clear ();
200
216
serialPortReader->read (std::bind (&Programmer::readRespChipIdCb, this ,
201
- std::placeholders::_1), &readData);
217
+ std::placeholders::_1), &readData, READ_TIMEOUT_MS );
202
218
203
219
readChipIdCb = callback;
204
220
writeData.clear ();
@@ -207,40 +223,77 @@ void Programmer::readChipId(std::function<void(ChipId)> callback)
207
223
this , std::placeholders::_1), &writeData);
208
224
}
209
225
210
- int Programmer::eraseChip ( uint32_t addr, uint32_t len )
226
+ int Programmer::handleBadBlock (QByteArray *data )
211
227
{
212
- RespHeader resp;
213
- RespBadBlock badBlock;
214
- Cmd cmd = { .code = CMD_NAND_ERASE };
215
- EraseCmd eraseCmd = { .cmd = cmd, .addr = addr, .len = len };
228
+ RespBadBlock *badBlock;
229
+ uint size = data->size ();
216
230
217
- if (sendCmd (&eraseCmd.cmd , sizeof (eraseCmd)))
231
+ if (size < sizeof (RespBadBlock))
232
+ {
233
+ qCritical () << " Header size of bad block response is wrong:"
234
+ << size;
218
235
return -1 ;
236
+ }
219
237
220
- while (true )
221
- {
222
- if (readRespHead (&resp))
223
- return -1 ;
238
+ badBlock = (RespBadBlock *)data->data ();
239
+ qInfo () << QString (" Bad block at 0x%1" ).arg (badBlock->addr , 8 ,
240
+ 16 , QLatin1Char ( ' 0' ));
224
241
225
- if (resp.code == RESP_STATUS && resp.info == STATUS_BAD_BLOCK)
226
- {
227
- if (readRespBadBlockAddress (&badBlock))
228
- return -1 ;
229
- qInfo () << " Bad block at" << QString (" 0x%1" ).arg (badBlock.addr , 8 ,
230
- 16 , QLatin1Char ( ' 0' ));
231
- continue ;
232
- }
242
+ return 0 ;
243
+ }
244
+
245
+ void Programmer::readRespEraseChipCb (int status)
246
+ {
247
+ RespHeader *header;
248
+
249
+ if (status == SerialPortReader::READ_ERROR)
250
+ return ;
233
251
234
- switch (resp.code )
252
+ if (readRespHeader (&readData, header))
253
+ return ;
254
+
255
+ while (readData.size ())
256
+ {
257
+ header = (RespHeader *)readData.data ();
258
+ switch (header->code )
235
259
{
236
260
case RESP_STATUS:
237
- return handleStatus (&resp);
261
+ if (header->info == STATUS_OK)
262
+ eraseChipCb ();
263
+ else if (header->info == STATUS_BAD_BLOCK)
264
+ {
265
+ if (!handleBadBlock (&readData))
266
+ {
267
+ readData.remove (0 , sizeof (RespBadBlock));
268
+ continue ;
269
+ }
270
+ }
271
+ else
272
+ qCritical () << " Programmer error: failed to erase chip" ;
273
+ break ;
238
274
default :
239
- return handleWrongResp (resp.code );
275
+ handleWrongResp (header->code );
276
+ break ;
240
277
}
278
+ readData.clear ();
241
279
}
280
+ }
242
281
243
- return 0 ;
282
+ void Programmer::eraseChip (std::function<void (void )> callback, uint32_t addr,
283
+ uint32_t len)
284
+ {
285
+ Cmd cmd = { .code = CMD_NAND_ERASE };
286
+ EraseCmd eraseCmd = { .cmd = cmd, .addr = addr, .len = len };
287
+
288
+ readData.clear ();
289
+ serialPortReader->read (std::bind (&Programmer::readRespEraseChipCb, this ,
290
+ std::placeholders::_1), &readData, ERASE_TIMEOUT_MS);
291
+
292
+ eraseChipCb = callback;
293
+ writeData.clear ();
294
+ writeData.append ((const char *)&eraseCmd, sizeof (eraseCmd));
295
+ serialPortWriter->write (std::bind (&Programmer::sendCmdCb,
296
+ this , std::placeholders::_1), &writeData);
244
297
}
245
298
246
299
int Programmer::readChip (uint8_t *buf, uint32_t addr, uint32_t len)
@@ -490,20 +543,14 @@ int Programmer::writeChip(uint8_t *buf, uint32_t addr, uint32_t len)
490
543
491
544
void Programmer::readRespSelectChipCb (int status)
492
545
{
493
- uint size;
494
546
RespHeader *header;
495
547
496
548
if (status == SerialPortReader::READ_ERROR)
497
549
return ;
498
550
499
- size = readData.size ();
500
- if (size < sizeof (RespHeader))
501
- {
502
- qCritical () << " Header size of chip ID response is wrong:" << size;
551
+ if (readRespHeader (&readData, header))
503
552
return ;
504
- }
505
553
506
- header = (RespHeader *)readData.data ();
507
554
switch (header->code )
508
555
{
509
556
case RESP_STATUS:
@@ -526,7 +573,7 @@ void Programmer::selectChip(std::function<void(void)> callback,
526
573
527
574
readData.clear ();
528
575
serialPortReader->read (std::bind (&Programmer::readRespSelectChipCb, this ,
529
- std::placeholders::_1), &readData);
576
+ std::placeholders::_1), &readData, READ_TIMEOUT_MS );
530
577
531
578
selectChipCb = callback;
532
579
writeData.clear ();
0 commit comments