@@ -296,84 +296,82 @@ void Programmer::eraseChip(std::function<void(void)> callback, uint32_t addr,
296
296
this , std::placeholders::_1), &writeData);
297
297
}
298
298
299
- int Programmer::readChip ( uint8_t *buf, uint32_t addr, uint32_t len )
299
+ void Programmer::readRespReadChipCb ( int status )
300
300
{
301
- int ret;
302
- uint8_t rx_buf[CDC_BUF_SIZE];
303
- RespHeader *dataResp;
304
- RespBadBlock badBlock;
301
+ uint size;
302
+ RespHeader *header;
305
303
uint32_t offset = 0 ;
306
- Cmd cmd = { .code = CMD_NAND_READ };
307
- ReadCmd readCmd = { .cmd = cmd, .addr = addr, .len = len };
308
304
309
- if (sendCmd (&readCmd. cmd , sizeof (readCmd)) )
310
- return - 1 ;
305
+ if (status == SerialPortReader::READ_ERROR )
306
+ goto Error ;
311
307
312
- while (len )
308
+ while ((size = readData. size ()) )
313
309
{
314
- serialPort.waitForReadyRead (READ_WRITE_TIMEOUT_MS);
315
- ret = serialPort.read ((char *)rx_buf, sizeof (RespHeader));
316
- if (ret < 0 )
317
- {
318
- qCritical () << " Failed to read data " << serialPort.error ()
319
- << serialPort.errorString ();
320
- return -1 ;
321
- }
310
+ if (readRespHeader (&readData, header))
311
+ goto Error;
322
312
323
- if (ret < (int )sizeof (RespHeader))
324
- {
325
- qCritical () << " Failed to read response header: data was partially"
326
- " received, length: " << ret;
327
- return -1 ;
328
- }
329
-
330
- dataResp = (RespHeader *)rx_buf;
331
- if (dataResp->code == RESP_STATUS)
313
+ switch (header->code )
332
314
{
333
- if (dataResp->info == STATUS_BAD_BLOCK)
315
+ case RESP_STATUS:
316
+ if (header->info == STATUS_OK && header->info == STATUS_BAD_BLOCK)
334
317
{
335
- if (readRespBadBlockAddress (&badBlock))
336
- return -1 ;
337
- qInfo () << " Bad block at" << QString (" 0x%1" ).
338
- arg (badBlock.addr , 8 , 16 , QLatin1Char (' 0' ));
318
+ if (handleBadBlock (&readData))
319
+ goto Error;
320
+ readData.remove (0 , sizeof (RespBadBlock));
339
321
}
340
322
else
341
- return handleStatus (dataResp);
342
- }
343
-
344
- if (dataResp->code == RESP_DATA)
345
- {
346
- if (dataResp->info > sizeof (rx_buf) - sizeof (RespHeader))
347
- {
348
- qCritical () << " Programmer returns wrong data length" ;
349
- return -1 ;
350
- }
351
-
352
- serialPort.waitForReadyRead (READ_WRITE_TIMEOUT_MS);
353
- ret = serialPort.read ((char *)dataResp->data , dataResp->info );
354
- if (ret < 0 )
355
323
{
356
- qCritical () << " Failed to read data " << serialPort.error ()
357
- << serialPort.errorString ();
358
- return -1 ;
324
+ qCritical () << " Programmer error: failed to read chip" ;
325
+ goto Error;
359
326
}
360
-
361
- if (dataResp->info != ret)
327
+ break ;
328
+ case RESP_DATA:
329
+ if (header->info > CDC_BUF_SIZE - sizeof (RespHeader) || header->info > size)
362
330
{
363
- qCritical () << " Programmer error: expected to receive " <<
364
- dataResp->info << " but received" << ret << " Bytes" ;
365
- for (int i = 0 ; i < ret; i++)
366
- qInfo () << dataResp->data [i];
367
- return -1 ;
331
+ qCritical () << " Wrong data length in response header:" << header->info ;
332
+ goto Error;
368
333
}
369
-
370
- memcpy (buf + offset, dataResp->data , ret);
371
- offset += ret;
372
- len -= ret;
334
+ memcpy (readChipBuf + offset, header->data , header->info );
335
+ offset += header->info ;
336
+ readData.remove (0 , sizeof (RespHeader) + header->info );
337
+ break ;
338
+ default :
339
+ handleWrongResp (header->code );
340
+ goto Error;
373
341
}
374
342
}
375
343
376
- return 0 ;
344
+ if (readChipLen == offset)
345
+ readChipCb (0 );
346
+ else
347
+ {
348
+ qCritical () << " Data was partialy received, size:" << offset;
349
+ goto Error;
350
+ }
351
+
352
+ return ;
353
+
354
+ Error:
355
+ readChipCb (-1 );
356
+ }
357
+
358
+ void Programmer::readChip (std::function<void (int )> callback, uint8_t *buf,
359
+ uint32_t addr, uint32_t len)
360
+ {
361
+ Cmd cmd = { .code = CMD_NAND_READ };
362
+ ReadCmd readCmd = { .cmd = cmd, .addr = addr, .len = len };
363
+
364
+ readData.clear ();
365
+ serialPortReader->read (std::bind (&Programmer::readRespReadChipCb, this ,
366
+ std::placeholders::_1), &readData, READ_TIMEOUT_MS);
367
+
368
+ readChipCb = callback;
369
+ readChipBuf = buf;
370
+ readChipLen = len;
371
+ writeData.clear ();
372
+ writeData.append ((const char *)&readCmd, sizeof (readCmd));
373
+ serialPortWriter->write (std::bind (&Programmer::sendCmdCb,
374
+ this , std::placeholders::_1), &writeData);
377
375
}
378
376
379
377
int Programmer::writeChip (uint8_t *buf, uint32_t addr, uint32_t len)
0 commit comments