14
14
Q_DECLARE_METATYPE (QtMsgType)
15
15
16
16
void Writer::init(const QString &portName, qint32 baudRate, uint8_t *buf,
17
- uint32_t addr, uint32_t len, uint32_t pageSize)
17
+ uint32_t addr, uint32_t len, uint32_t pageSize, bool skipBB )
18
18
{
19
19
this ->portName = portName;
20
20
this ->baudRate = baudRate;
21
21
this ->buf = buf;
22
22
this ->addr = addr;
23
23
this ->len = len;
24
24
this ->pageSize = pageSize;
25
+ this ->skipBB = skipBB;
26
+ bytesWritten = 0 ;
27
+ bytesAcked = 0 ;
25
28
}
26
29
27
30
int Writer::write (uint8_t *data, uint32_t dataLen)
@@ -44,110 +47,153 @@ int Writer::write(uint8_t *data, uint32_t dataLen)
44
47
return 0 ;
45
48
}
46
49
47
- int Writer::handleWriteAck (RespHeader *header , uint32_t len, void *ackData )
50
+ int Writer::read ( uint8_t *data , uint32_t dataLen )
48
51
{
49
- if (len != sizeof (RespWriteAck))
52
+ int ret;
53
+
54
+ if (!serialPort->waitForReadyRead (READ_ACK_TIMEOUT))
50
55
{
51
- logErr (QString ( " Write ack response is too short %1 " ). arg (len) );
56
+ logErr (" Write ACK was not received " );
52
57
return -1 ;
53
58
}
54
59
55
- *((uint32_t *)ackData) = ((RespWriteAck *)header)->ackBytes ;
60
+ ret = serialPort->read ((char *)data, dataLen);
61
+ if (ret < 0 )
62
+ {
63
+ logErr (" Failed to read ACK" );
64
+ return -1 ;
65
+ }
56
66
57
- return 0 ;
67
+ return ret ;
58
68
}
59
69
60
- int Writer::handleBadBlock (RespHeader *header, uint32_t len)
70
+ int Writer::handleWriteAck (RespHeader *header, uint32_t len)
61
71
{
62
- RespBadBlock *badBlock = (RespBadBlock *)header;
72
+ int size = sizeof (RespWriteAck);
73
+
74
+ if (len < (uint32_t )size)
75
+ {
76
+ logErr (QString (" Write ack response is too short %1" ).arg (len));
77
+ return -1 ;
78
+ }
63
79
64
- if (len != sizeof (RespBadBlock))
80
+ bytesAcked = ((RespWriteAck *)header)->ackBytes ;
81
+
82
+ if (bytesAcked != bytesWritten)
65
83
{
66
- logErr (QString (" Bad block response is too short %1" ).arg (len));
84
+ logErr (QString (" Received wrong ack %1, expected %2 " ).arg (bytesAcked)
85
+ .arg (bytesWritten));
67
86
return -1 ;
68
87
}
69
88
89
+ return size;
90
+ }
91
+
92
+ int Writer::handleBadBlock (RespHeader *header, uint32_t len)
93
+ {
94
+ int size = sizeof (RespBadBlock);
95
+ RespBadBlock *badBlock = (RespBadBlock *)header;
96
+
97
+ if (len < (uint32_t )size)
98
+ return 0 ;
99
+
70
100
logInfo (QString (" Bad block at 0x%1" ).arg (badBlock->addr , 8 , 16 ,
71
101
QLatin1Char (' 0' )));
72
102
73
- return 0 ;
103
+ return size ;
74
104
}
75
105
76
106
int Writer::handleError (RespHeader *header, uint32_t len)
77
107
{
78
108
RespError *err = (RespError *)header;
79
- size_t size = sizeof (RespError);
109
+ int size = sizeof (RespError);
80
110
81
- if (len < size)
111
+ if (len < ( uint32_t ) size)
82
112
return 0 ;
83
113
84
114
logErr (QString (" Programmer sent error: %1" ).arg (err->errCode ));
85
115
86
116
return -1 ;
87
117
}
88
118
89
- int Writer::handleStatus (RespHeader *header , uint32_t len, void *ackData )
119
+ int Writer::handleStatus (uint8_t *pbuf , uint32_t len)
90
120
{
121
+ RespHeader *header = (RespHeader *)pbuf;
91
122
uint8_t status = header->info ;
92
123
93
124
switch (status)
94
125
{
95
126
case STATUS_OK:
96
- break ;
127
+ return sizeof (RespHeader) ;
97
128
case STATUS_ERROR:
98
129
return handleError (header, len);
99
130
case STATUS_BAD_BLOCK:
100
- handleBadBlock (header, len);
101
- return -1 ;
131
+ return handleBadBlock (header, len);
102
132
case STATUS_WRITE_ACK:
103
- if (handleWriteAck (header, len, ackData))
104
- return -1 ;
105
- break ;
106
- default :
107
- logErr (QString (" Wrong status received %1" ).arg (status));
108
- return -1 ;
133
+ return handleWriteAck (header, len);
109
134
}
110
135
111
- return 0 ;
136
+ logErr (QString (" Wrong status received %1" ).arg (status));
137
+ return -1 ;
112
138
}
113
139
114
- int Writer::handleAck (RespHeader *header , uint32_t len, void *ackData )
140
+ int Writer::handlePacket ( uint8_t *pbuf , uint32_t len)
115
141
{
142
+ RespHeader *header = (RespHeader *)pbuf;
143
+
144
+ if (len < sizeof (RespHeader))
145
+ return 0 ;
146
+
116
147
if (header->code != RESP_STATUS)
117
148
{
118
- logErr (QString (" Wrong response code %1" ).arg (header->code ));
149
+ logErr (QString (" Programmer returned wrong response code: %1" )
150
+ .arg (header->code ));
119
151
return -1 ;
120
152
}
121
153
122
- return handleStatus (header , len, ackData );
154
+ return handleStatus (pbuf , len);
123
155
}
124
156
125
- int Writer::readAck ( void *ackData )
157
+ int Writer::handlePackets ( uint8_t *pbuf, uint32_t len )
126
158
{
127
159
int ret;
128
- uint8_t pbuf[BUF_SIZE];
129
- unsigned int dataLen = sizeof (RespHeader);
160
+ uint32_t offset = 0 ;
130
161
131
- if (!serialPort-> waitForReadyRead (READ_ACK_TIMEOUT))
162
+ do
132
163
{
133
- logErr (" Write ACK was not received" );
134
- return -1 ;
135
- }
164
+ if ((ret = handlePacket (pbuf + offset, len - offset)) < 0 )
165
+ return -1 ;
136
166
137
- ret = serialPort->read ((char *)pbuf, BUF_SIZE);
138
- if (ret < 0 )
139
- {
140
- logErr (" Failed to read ACK" );
141
- return -1 ;
167
+ if (ret)
168
+ offset += ret;
169
+ else
170
+ {
171
+ memmove (pbuf, pbuf + offset, len - offset);
172
+ break ;
173
+ }
142
174
}
143
- else if ((uint32_t )ret < dataLen)
175
+ while (offset < len);
176
+
177
+ return len - offset;
178
+ }
179
+
180
+ int Writer::readData ()
181
+ {
182
+ uint8_t pbuf[BUF_SIZE];
183
+ int len, offset = 0 ;
184
+
185
+ do
144
186
{
145
- logErr (QString (" Response is too short, expected %1, received %2" )
146
- .arg (dataLen).arg (ret));
147
- return -1 ;
187
+ if ((len = read (pbuf + offset, BUF_SIZE - offset)) < 0 )
188
+ return -1 ;
189
+ len += offset;
190
+
191
+ if ((offset = handlePackets (pbuf, len)) < 0 )
192
+ return -1 ;
148
193
}
194
+ while (offset);
149
195
150
- return handleAck ((RespHeader *)pbuf, ret, ackData) ;
196
+ return 0 ;
151
197
}
152
198
153
199
int Writer::writeStart ()
@@ -157,11 +203,12 @@ int Writer::writeStart()
157
203
writeStartCmd.cmd .code = CMD_NAND_WRITE_S;
158
204
writeStartCmd.addr = addr;
159
205
writeStartCmd.len = len;
206
+ writeStartCmd.flags .skipBB = skipBB;
160
207
161
208
if (write ((uint8_t *)&writeStartCmd, sizeof (WriteStartCmd)))
162
209
return -1 ;
163
210
164
- if (readAck ( NULL ))
211
+ if (readData ( ))
165
212
return -1 ;
166
213
167
214
return 0 ;
@@ -171,8 +218,7 @@ int Writer::writeData()
171
218
{
172
219
uint8_t pbuf[BUF_SIZE];
173
220
WriteDataCmd *writeDataCmd = (WriteDataCmd *)pbuf;
174
- uint32_t dataLen, dataLenMax, headerLen, pageLim, ack,
175
- bytesWritten = 0 , bytesAcked = 0 ;
221
+ uint32_t dataLen, dataLenMax, headerLen, pageLim;
176
222
177
223
writeDataCmd->cmd .code = CMD_NAND_WRITE_D;
178
224
headerLen = sizeof (WriteDataCmd);
@@ -197,16 +243,8 @@ int Writer::writeData()
197
243
if (len && bytesWritten != pageLim)
198
244
continue ;
199
245
200
- if (readAck (&ack ))
246
+ if (readData ( ))
201
247
return -1 ;
202
-
203
- if (ack != bytesWritten)
204
- {
205
- logErr (QString (" Received wrong ack %1, expected%2 " ).arg (ack)
206
- .arg (bytesWritten));
207
- return -1 ;
208
- }
209
- bytesAcked = ack;
210
248
}
211
249
212
250
return 0 ;
@@ -221,7 +259,7 @@ int Writer::writeEnd()
221
259
if (write ((uint8_t *)&writeEndCmd, sizeof (WriteEndCmd)))
222
260
return -1 ;
223
261
224
- if (readAck ( NULL ))
262
+ if (readData ( ))
225
263
return -1 ;
226
264
227
265
return 0 ;
0 commit comments