Skip to content

Commit c2c07ea

Browse files
committed
qt: changed erase command to use async read/write
1 parent c81da81 commit c2c07ea

File tree

6 files changed

+109
-50
lines changed

6 files changed

+109
-50
lines changed

qt/main_window.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,18 @@ void MainWindow::slotProgReadDeviceId()
184184
std::placeholders::_1));
185185
}
186186

187+
void MainWindow::eraseChipCb()
188+
{
189+
qInfo() << "Chip has been erased successfully";
190+
}
191+
187192
void MainWindow::slotProgErase()
188193
{
189194
QByteArray ba = ui->chipSelectComboBox->currentText().toLatin1();
190195
ChipInfo *chipInfo = getChipInfoByName(ba.data());
191196

192-
if (!prog->eraseChip(START_ADDRESS, chipInfo->size))
193-
qInfo() << "Chip has been erased successfully";
197+
prog->eraseChip(std::bind(&MainWindow::eraseChipCb, this), START_ADDRESS,
198+
chipInfo->size);
194199
}
195200

196201
void MainWindow::slotProgRead()

qt/main_window.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class MainWindow : public QMainWindow
2929
quint32 address);
3030
void readChipIdCb(ChipId id);
3131
void selectChipCb();
32+
void eraseChipCb();
3233

3334
public slots:
3435
void slotFileOpen();

qt/programmer.cpp

Lines changed: 88 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#define READ_WRITE_TIMEOUT_MS 10
1313
#define READ_RESP_TIMEOUT_MS 30000
1414
#define SERIAL_PORT_SPEED 4000000
15+
#define READ_TIMEOUT_MS 100
16+
#define ERASE_TIMEOUT_MS 10000
1517

1618
Programmer::Programmer(QObject *parent) : QObject(parent)
1719
{
@@ -151,37 +153,51 @@ int Programmer::handleWrongResp(uint8_t code)
151153
return -1;
152154
}
153155

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+
154172
void Programmer::readRespChipIdCb(int status)
155173
{
156174
uint size;
175+
RespHeader *header;
157176
RespId *respId;
158177

159178
if (status == SerialPortReader::READ_ERROR)
160179
return;
161180

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))
166182
return;
167-
}
168183

169-
respId = (RespId *)readData.data();
170-
switch (respId->header.code)
184+
switch (header->code)
171185
{
172186
case RESP_DATA:
173-
if (size < sizeof(RespId))
187+
size = readData.size();
188+
if (size < (int)sizeof(RespId))
174189
{
175190
qCritical() << "Size of chip ID response is wrong:" << size;
176191
return;
177192
}
193+
respId = (RespId *)readData.data();
178194
readChipIdCb(respId->nandId);
179195
break;
180196
case RESP_STATUS:
181-
handleStatus(&respId->header);
197+
handleStatus(header);
182198
break;
183199
default:
184-
handleWrongResp(respId->header.code);
200+
handleWrongResp(header->code);
185201
break;
186202
}
187203
}
@@ -198,7 +214,7 @@ void Programmer::readChipId(std::function<void(ChipId)> callback)
198214

199215
readData.clear();
200216
serialPortReader->read(std::bind(&Programmer::readRespChipIdCb, this,
201-
std::placeholders::_1), &readData);
217+
std::placeholders::_1), &readData, READ_TIMEOUT_MS);
202218

203219
readChipIdCb = callback;
204220
writeData.clear();
@@ -207,40 +223,77 @@ void Programmer::readChipId(std::function<void(ChipId)> callback)
207223
this, std::placeholders::_1), &writeData);
208224
}
209225

210-
int Programmer::eraseChip(uint32_t addr, uint32_t len)
226+
int Programmer::handleBadBlock(QByteArray *data)
211227
{
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();
216230

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;
218235
return -1;
236+
}
219237

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' ));
224241

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;
233251

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)
235259
{
236260
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;
238274
default:
239-
return handleWrongResp(resp.code);
275+
handleWrongResp(header->code);
276+
break;
240277
}
278+
readData.clear();
241279
}
280+
}
242281

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);
244297
}
245298

246299
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)
490543

491544
void Programmer::readRespSelectChipCb(int status)
492545
{
493-
uint size;
494546
RespHeader *header;
495547

496548
if (status == SerialPortReader::READ_ERROR)
497549
return;
498550

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))
503552
return;
504-
}
505553

506-
header = (RespHeader *)readData.data();
507554
switch (header->code)
508555
{
509556
case RESP_STATUS:
@@ -526,7 +573,7 @@ void Programmer::selectChip(std::function<void(void)> callback,
526573

527574
readData.clear();
528575
serialPortReader->read(std::bind(&Programmer::readRespSelectChipCb, this,
529-
std::placeholders::_1), &readData);
576+
std::placeholders::_1), &readData, READ_TIMEOUT_MS);
530577

531578
selectChipCb = callback;
532579
writeData.clear();

qt/programmer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,19 @@ class Programmer : public QObject
118118
bool isConn;
119119
std::function<void(ChipId)> readChipIdCb;
120120
std::function<void(void)> selectChipCb;
121+
std::function<void(void)> eraseChipCb;
121122

122123
int sendCmd(Cmd *cmd, size_t size);
123124
void sendCmdCb(int status);
124125
int readRespHead(RespHeader *respHead);
126+
int readRespHeader(const QByteArray *data, RespHeader *&header);
125127
int readRespBadBlockAddress(RespBadBlock *badBlock);
126128
void readRespChipIdCb(int status);
127129
void readRespSelectChipCb(int status);
130+
void readRespEraseChipCb(int status);
128131
int handleStatus(RespHeader *respHead);
129132
int handleWrongResp(uint8_t code);
133+
int handleBadBlock(QByteArray *data);
130134
public:
131135
QByteArray readData;
132136
QByteArray writeData;
@@ -139,7 +143,8 @@ class Programmer : public QObject
139143
void disconnect();
140144
bool isConnected();
141145
void readChipId(std::function<void(ChipId)> callback);
142-
int eraseChip(uint32_t addr, uint32_t len);
146+
void eraseChip(std::function<void(void)> callback, uint32_t addr,
147+
uint32_t len);
143148
int readChip(uint8_t *buf, uint32_t addr, uint32_t len);
144149
int writeChip(uint8_t *buf, uint32_t addr, uint32_t len);
145150
void selectChip(std::function<void(void)> callback, uint32_t chipNum);

qt/serial_port_reader.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
#include <QDebug>
88
#include <QString>
99

10-
#define READ_TIMEOUT_MS 100
11-
1210
SerialPortReader::SerialPortReader(QSerialPort *serialPort, QObject *parent):
1311
QObject(parent), serialPort(serialPort)
1412
{
@@ -32,12 +30,13 @@ void SerialPortReader::signalDisconnect()
3230
}
3331

3432
void SerialPortReader::read(std::function<void(int)> callback,
35-
QByteArray *data)
33+
QByteArray *data, int timeout)
3634
{
3735
signalConnect();
3836
readData = data;
3937
this->callback = callback;
40-
timer.start(READ_TIMEOUT_MS);
38+
this->timeout = timeout;
39+
timer.start(timeout);
4140
}
4241

4342
void SerialPortReader::readEnd(int status)
@@ -50,7 +49,7 @@ void SerialPortReader::readEnd(int status)
5049
void SerialPortReader::handleReadyRead()
5150
{
5251
readData->append(serialPort->readAll());
53-
timer.start(READ_TIMEOUT_MS);
52+
timer.start(timeout);
5453
}
5554

5655
void SerialPortReader::handleTimeout()

qt/serial_port_reader.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class SerialPortReader: public QObject
2020
QByteArray *readData;
2121
QTimer timer;
2222
std::function<void(int)> callback;
23+
int timeout;
2324

2425
void signalConnect();
2526
void signalDisconnect();
@@ -35,7 +36,8 @@ class SerialPortReader: public QObject
3536
explicit SerialPortReader(QSerialPort *serialPort,
3637
QObject *parent = 0);
3738

38-
void read(std::function<void(int)> callback, QByteArray *data);
39+
void read(std::function<void(int)> callback, QByteArray *data,
40+
int timeout);
3941

4042
public slots:
4143
void handleReadyRead();

0 commit comments

Comments
 (0)