Skip to content

Commit db633a7

Browse files
committed
Chip detection for SPI
1 parent 6195ae8 commit db633a7

11 files changed

+247
-190
lines changed

qt/chip_db.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,69 @@
88

99
#include <QStringList>
1010

11+
enum
12+
{
13+
CHIP_PARAM_NAME,
14+
CHIP_PARAM_PAGE_SIZE,
15+
CHIP_PARAM_BLOCK_SIZE,
16+
CHIP_PARAM_TOTAL_SIZE,
17+
CHIP_PARAM_SPARE_SIZE,
18+
CHIP_PARAM_T_CS,
19+
CHIP_PARAM_T_CLS,
20+
CHIP_PARAM_T_ALS,
21+
CHIP_PARAM_T_CLR,
22+
CHIP_PARAM_T_AR,
23+
CHIP_PARAM_T_WP,
24+
CHIP_PARAM_T_RP,
25+
CHIP_PARAM_T_DS,
26+
CHIP_PARAM_T_CH,
27+
CHIP_PARAM_T_CLH,
28+
CHIP_PARAM_T_ALH,
29+
CHIP_PARAM_T_WC,
30+
CHIP_PARAM_T_RC,
31+
CHIP_PARAM_T_REA,
32+
CHIP_PARAM_ROW_CYCLES,
33+
CHIP_PARAM_COL_CYCLES,
34+
CHIP_PARAM_READ1_CMD,
35+
CHIP_PARAM_READ2_CMD,
36+
CHIP_PARAM_READ_SPARE_CMD,
37+
CHIP_PARAM_READ_ID_CMD,
38+
CHIP_PARAM_RESET_CMD,
39+
CHIP_PARAM_WRITE1_CMD,
40+
CHIP_PARAM_WRITE2_CMD,
41+
CHIP_PARAM_ERASE1_CMD,
42+
CHIP_PARAM_ERASE2_CMD,
43+
CHIP_PARAM_STATUS_CMD,
44+
CHIP_PARAM_BB_MARK_OFF,
45+
CHIP_PARAM_ID1,
46+
CHIP_PARAM_ID2,
47+
CHIP_PARAM_ID3,
48+
CHIP_PARAM_ID4,
49+
CHIP_PARAM_ID5,
50+
CHIP_PARAM_NUM,
51+
};
52+
53+
typedef struct
54+
{
55+
uint32_t id;
56+
QString name;
57+
uint32_t params[CHIP_PARAM_NUM];
58+
} ChipInfo;
59+
60+
enum CHIP_HAL
61+
{
62+
CHIP_HAL_PARALLEL = 0,
63+
CHIP_HAL_SPI = 1
64+
};
65+
1166
class ChipDb
1267
{
1368
public:
1469
virtual QStringList getNames() = 0;
70+
virtual ChipInfo *chipInfoGetById(int id) = 0;
71+
virtual QString getNameByChipId(uint32_t id1, uint32_t id2,
72+
uint32_t id3, uint32_t id4, uint32_t id5) = 0;
73+
virtual uint8_t getHal() = 0;
1574
};
1675

1776
#endif // CHIP_DB_H

qt/cmd.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,6 @@ typedef struct __attribute__((__packed__))
7272
Cmd cmd;
7373
} WriteEndCmd;
7474

75-
enum CHIP_HAL
76-
{
77-
CHIP_HAL_PARALLEL = 0,
78-
CHIP_HAL_SPI = 1
79-
};
80-
8175
typedef struct __attribute__((__packed__))
8276
{
8377
Cmd cmd;

qt/main_window.cpp

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ void MainWindow::slotSelectChip(int selectedChipNum)
480480
{
481481
QString name;
482482
ChipInfo *chipInfo;
483-
SpiChipInfo *spiChipInfo;
483+
uint8_t hal;
484484

485485
if (selectedChipNum <= CHIP_INDEX_DEFAULT)
486486
{
@@ -495,8 +495,11 @@ void MainWindow::slotSelectChip(int selectedChipNum)
495495
return;
496496
}
497497

498-
if (!(chipInfo = parallelChipDb.chipInfoGetByName(name)) &&
499-
!(spiChipInfo = spiChipDb.chipInfoGetByName(name)))
498+
if ((chipInfo = parallelChipDb.chipInfoGetByName(name)))
499+
hal = parallelChipDb.getHal();
500+
else if ((chipInfo = spiChipDb.chipInfoGetByName(name)))
501+
hal = spiChipDb.getHal();
502+
else
500503
{
501504
qCritical() << "Failed to find chip in DB";
502505
return;
@@ -508,15 +511,13 @@ void MainWindow::slotSelectChip(int selectedChipNum)
508511
SLOT(slotProgSelectCompleted(int)));
509512

510513
if (chipInfo)
511-
prog->confChip(chipInfo);
512-
else
513-
prog->confChip(spiChipInfo);
514+
prog->confChip(chipInfo, hal);
514515
}
515516

516517
void MainWindow::slotProgDetectChipReadChipIdCompleted(int status)
517518
{
518519
QString idStr;
519-
int id;
520+
QString chipName;
520521

521522
disconnect(prog, SIGNAL(readChipIdCompleted(int)), this,
522523
SLOT(slotProgDetectChipReadChipIdCompleted(int)));
@@ -529,20 +530,32 @@ void MainWindow::slotProgDetectChipReadChipIdCompleted(int status)
529530
.arg(chipId.deviceId, 2, 16, QLatin1Char('0'))
530531
.arg(chipId.thirdId, 2, 16, QLatin1Char('0'))
531532
.arg(chipId.fourthId, 2, 16, QLatin1Char('0'))
532-
.arg(chipId.fifthId, 2, 16), QLatin1Char('0');
533+
.arg(chipId.fifthId, 2, 16, QLatin1Char('0'));
533534

534535
ui->deviceValueLabel->setText(idStr);
535536

536537
qInfo() << QString("ID ").append(idStr).toLatin1().data();
537538

538-
if ((id = parallelChipDb.getIdByChipId(chipId.makerId, chipId.deviceId,
539-
chipId.thirdId, chipId.fourthId, chipId.fifthId)) < 0)
539+
chipName = currentChipDb->getNameByChipId(chipId.makerId, chipId.deviceId,
540+
chipId.thirdId, chipId.fourthId, chipId.fifthId);
541+
542+
if (chipName.isEmpty())
540543
{
541-
qInfo() << "Chip not found in database";
544+
if (currentChipDb->getHal() == spiChipDb.getHal())
545+
qInfo() << "Chip not found in database";
546+
else
547+
{
548+
// Search in next DB
549+
detectChip(&spiChipDb);
550+
}
542551
return;
543552
}
544553

545-
ui->chipSelectComboBox->setCurrentIndex(CHIP_ID2INDEX(id));
554+
for (int i = 0; i < ui->chipSelectComboBox->count(); i++)
555+
{
556+
if (!ui->chipSelectComboBox->itemText(i).compare(chipName))
557+
ui->chipSelectComboBox->setCurrentIndex(i);
558+
}
546559
}
547560

548561
void MainWindow::slotProgDetectChipConfCompleted(int status)
@@ -558,23 +571,30 @@ void MainWindow::slotProgDetectChipConfCompleted(int status)
558571
prog->readChipId(&chipId);
559572
}
560573

561-
void MainWindow::slotDetectChip()
574+
void MainWindow::detectChip(ChipDb *chipDb)
562575
{
563576
ChipInfo *chipInfo;
564577

565-
qInfo() << "Detecting chip ...";
578+
currentChipDb = chipDb;
566579

567580
// Assuming read of ID is the same for all chips thereby use settings of the
568581
// first one.
569-
if (!(chipInfo = parallelChipDb.chipInfoGetById(0)))
582+
if (!(chipInfo = currentChipDb->chipInfoGetById(0)))
570583
{
571584
qCritical() << "Failed to get information from chip database";
572585
return;
573586
}
574587

575588
connect(prog, SIGNAL(confChipCompleted(int)), this,
576589
SLOT(slotProgDetectChipConfCompleted(int)));
577-
prog->confChip(chipInfo);
590+
prog->confChip(chipInfo, currentChipDb->getHal());
591+
}
592+
593+
void MainWindow::slotDetectChip()
594+
{
595+
qInfo() << "Detecting chip ...";
596+
597+
detectChip(&parallelChipDb);
578598
}
579599

580600
void MainWindow::slotSettingsProgrammer()

qt/main_window.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class MainWindow : public QMainWindow
3333
ChipId chipId;
3434
ParallelChipDb parallelChipDb;
3535
SpiChipDb spiChipDb;
36+
ChipDb *currentChipDb;
3637

3738
void initBufTable();
3839
void resetBufTable();
@@ -41,6 +42,7 @@ class MainWindow : public QMainWindow
4142
void updateChipList();
4243
void setProgress(unsigned int progress);
4344
void updateProgSettings();
45+
void detectChip(ChipDb *chipDb);
4446

4547
private slots:
4648
void slotProgConnectCompleted(int status);

qt/nando_spi_chip_db.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# name, page size, block size, total size, spare size, tCS, tCLS, tALS, tCLR, tAR, tWP, tRP, tDS, tCH, tCLH, tALH, tWC, tRC, tREA, row cycles, col. cycles, read 1 cycle com., read 2 cycle com., read spare com., read ID com., reset com., write 1 cycle com., write 2 cycle com., erase 1 cycle com., erase 2 cycle com., status com., bad block mark off., ID1, ID2, ID3, ID4, ID5
2-
AT45DB021D, 264, 2112, 270336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 34, -, -, -
2+
AT45DB021D, 264, 2112, 270336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 35, -, -, -

qt/parallel_chip_db.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,49 @@ int ParallelChipDb::getIdByChipId(uint32_t id1, uint32_t id2, uint32_t id3,
344344
return -1;
345345
}
346346

347+
QString ParallelChipDb::getNameByChipId(uint32_t id1, uint32_t id2,
348+
uint32_t id3, uint32_t id4, uint32_t id5)
349+
{
350+
for(int i = 0; i < chipInfoVector.size(); i++)
351+
{
352+
// Mandatory IDs
353+
if (id1 != chipInfoVector[i].params[CHIP_PARAM_ID1] ||
354+
id2 != chipInfoVector[i].params[CHIP_PARAM_ID2])
355+
{
356+
continue;
357+
}
358+
359+
// Optinal IDs
360+
if (chipInfoVector[i].params[CHIP_PARAM_ID3] ==
361+
CHIP_PARAM_NOT_DEFINED_VALUE)
362+
{
363+
return chipInfoVector[i].name;
364+
}
365+
if (id3 != chipInfoVector[i].params[CHIP_PARAM_ID3])
366+
continue;
367+
368+
if (chipInfoVector[i].params[CHIP_PARAM_ID4] ==
369+
CHIP_PARAM_NOT_DEFINED_VALUE)
370+
{
371+
return chipInfoVector[i].name;
372+
}
373+
if (id4 != chipInfoVector[i].params[CHIP_PARAM_ID4])
374+
continue;
375+
376+
if (chipInfoVector[i].params[CHIP_PARAM_ID5] ==
377+
CHIP_PARAM_NOT_DEFINED_VALUE)
378+
{
379+
return chipInfoVector[i].name;
380+
}
381+
if (id5 != chipInfoVector[i].params[CHIP_PARAM_ID5])
382+
continue;
383+
384+
return chipInfoVector[i].name;
385+
}
386+
387+
return QString();
388+
}
389+
347390
uint32_t ParallelChipDb::pageSizeGetById(int id)
348391
{
349392
ChipInfo *info = chipInfoGetById(id);
@@ -457,3 +500,8 @@ int ParallelChipDb::setChipParam(int chipIndex, int paramIndex,
457500

458501
return 0;
459502
}
503+
504+
uint8_t ParallelChipDb::getHal()
505+
{
506+
return CHIP_HAL_PARALLEL;
507+
}

qt/parallel_chip_db.h

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,6 @@
1414
#include <QVector>
1515
#include <QFile>
1616

17-
enum
18-
{
19-
CHIP_PARAM_NAME,
20-
CHIP_PARAM_PAGE_SIZE,
21-
CHIP_PARAM_BLOCK_SIZE,
22-
CHIP_PARAM_TOTAL_SIZE,
23-
CHIP_PARAM_SPARE_SIZE,
24-
CHIP_PARAM_T_CS,
25-
CHIP_PARAM_T_CLS,
26-
CHIP_PARAM_T_ALS,
27-
CHIP_PARAM_T_CLR,
28-
CHIP_PARAM_T_AR,
29-
CHIP_PARAM_T_WP,
30-
CHIP_PARAM_T_RP,
31-
CHIP_PARAM_T_DS,
32-
CHIP_PARAM_T_CH,
33-
CHIP_PARAM_T_CLH,
34-
CHIP_PARAM_T_ALH,
35-
CHIP_PARAM_T_WC,
36-
CHIP_PARAM_T_RC,
37-
CHIP_PARAM_T_REA,
38-
CHIP_PARAM_ROW_CYCLES,
39-
CHIP_PARAM_COL_CYCLES,
40-
CHIP_PARAM_READ1_CMD,
41-
CHIP_PARAM_READ2_CMD,
42-
CHIP_PARAM_READ_SPARE_CMD,
43-
CHIP_PARAM_READ_ID_CMD,
44-
CHIP_PARAM_RESET_CMD,
45-
CHIP_PARAM_WRITE1_CMD,
46-
CHIP_PARAM_WRITE2_CMD,
47-
CHIP_PARAM_ERASE1_CMD,
48-
CHIP_PARAM_ERASE2_CMD,
49-
CHIP_PARAM_STATUS_CMD,
50-
CHIP_PARAM_BB_MARK_OFF,
51-
CHIP_PARAM_ID1,
52-
CHIP_PARAM_ID2,
53-
CHIP_PARAM_ID3,
54-
CHIP_PARAM_ID4,
55-
CHIP_PARAM_ID5,
56-
CHIP_PARAM_NUM,
57-
};
58-
59-
typedef struct
60-
{
61-
uint32_t id;
62-
QString name;
63-
uint32_t params[CHIP_PARAM_NUM];
64-
} ChipInfo;
65-
6617
class ParallelChipDb : public ChipDb
6718
{
6819
QVector<ChipInfo> chipInfoVector;
@@ -82,6 +33,8 @@ class ParallelChipDb : public ChipDb
8233
ChipInfo *chipInfoGetByName(QString name);
8334
int getIdByChipId(uint32_t id1, uint32_t id2, uint32_t id3, uint32_t id4,
8435
uint32_t id5);
36+
QString getNameByChipId(uint32_t id1, uint32_t id2,
37+
uint32_t id3, uint32_t id4, uint32_t id5);
8538
uint32_t pageSizeGetById(int id);
8639
uint32_t extendedPageSizeGetById(int id);
8740
uint32_t totalSizeGetById(int id);
@@ -105,6 +58,7 @@ class ParallelChipDb : public ChipDb
10558
int setChipName(int chipIndex, const QString &name);
10659
uint32_t getChipParam(int chipIndex, int paramIndex);
10760
int setChipParam(int chipIndex, int paramIndex, uint32_t paramValue);
61+
uint8_t getHal();
10862
};
10963

11064
#endif // PARALLEL_CHIP_DB_H

qt/programmer.cpp

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -296,15 +296,15 @@ void Programmer::confChipCb(int ret)
296296
emit confChipCompleted(ret);
297297
}
298298

299-
void Programmer::confChip(ChipInfo *chipInfo)
299+
void Programmer::confChip(ChipInfo *chipInfo, uint8_t hal)
300300
{
301301
ConfCmd confCmd;
302302
StmParams params;
303303

304304
chipInfoToStmParams(chipInfo, &params);
305305

306306
confCmd.cmd.code = CMD_NAND_CONF;
307-
confCmd.hal = CHIP_HAL_PARALLEL;
307+
confCmd.hal = hal;
308308
confCmd.pageSize = chipInfo->params[CHIP_PARAM_PAGE_SIZE];
309309
confCmd.blockSize = chipInfo->params[CHIP_PARAM_BLOCK_SIZE];
310310
confCmd.totalSize = chipInfo->params[CHIP_PARAM_TOTAL_SIZE];
@@ -353,27 +353,6 @@ void Programmer::confChip(ChipInfo *chipInfo)
353353
reader.start();
354354
}
355355

356-
void Programmer::confChip(SpiChipInfo *chipInfo)
357-
{
358-
ConfCmd confCmd = {};
359-
360-
confCmd.cmd.code = CMD_NAND_CONF;
361-
confCmd.hal = CHIP_HAL_SPI;
362-
confCmd.pageSize = chipInfo->params[SPI_CHIP_PARAM_PAGE_SIZE];
363-
confCmd.blockSize = chipInfo->params[SPI_CHIP_PARAM_BLOCK_SIZE];
364-
confCmd.totalSize = chipInfo->params[SPI_CHIP_PARAM_TOTAL_SIZE];
365-
366-
QObject::connect(&reader, SIGNAL(result(int)), this,
367-
SLOT(confChipCb(int)));
368-
369-
writeData.clear();
370-
writeData.append(reinterpret_cast<const char *>(&confCmd), sizeof(confCmd));
371-
reader.init(usbDevName, SERIAL_PORT_SPEED, nullptr, 0,
372-
reinterpret_cast<const uint8_t *>(writeData.constData()),
373-
static_cast<uint32_t>(writeData.size()), false, false);
374-
reader.start();
375-
}
376-
377356
void Programmer::logCb(QtMsgType msgType, QString msg)
378357
{
379358
switch (msgType)

0 commit comments

Comments
 (0)