Skip to content

Commit 94bf363

Browse files
committed
SPI HAL uses configuration from host app
1 parent 45c9ca7 commit 94bf363

File tree

8 files changed

+157
-28
lines changed

8 files changed

+157
-28
lines changed

firmware/programmer/spi_flash.c

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313

1414
#define FLASH_DUMMY_BYTE 0xA5
1515

16-
#define CMD_READ_ID 0x9F
17-
#define CMD_FLASH_PAGE_WRITE 0x82
18-
#define CMD_FLASH_PAGE_READ 0x0B
19-
#define CMD_FLASH_BLOCK_ERASE 0x50
20-
#define CMD_READ_STATUS 0xD7
21-
22-
#define PAGE_ADDRESS_OFFSET 9
23-
2416
#define STATUS_READY (1<<7)
2517

2618
#define FLASH_READY 0
@@ -36,6 +28,18 @@
3628
/* 4th addressing cycle */
3729
#define ADDR_4th_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF000000) >> 24)
3830

31+
typedef struct __attribute__((__packed__))
32+
{
33+
uint8_t page_offset;
34+
uint8_t read_cmd;
35+
uint8_t read_id_cmd;
36+
uint8_t write_cmd;
37+
uint8_t erase_cmd;
38+
uint8_t status_cmd;
39+
} spi_conf_t;
40+
41+
static spi_conf_t spi_conf;
42+
3943
static void spi_flash_gpio_init()
4044
{
4145
GPIO_InitTypeDef gpio_init;
@@ -105,6 +109,10 @@ static int spi_flash_init(void *conf, uint32_t conf_size)
105109
{
106110
SPI_InitTypeDef spi_init;
107111

112+
if (conf_size < sizeof(spi_conf_t))
113+
return -1;
114+
spi_conf = *(spi_conf_t *)conf;
115+
108116
spi_flash_gpio_init();
109117

110118
spi_flash_deselect_chip();
@@ -161,7 +169,7 @@ static uint32_t spi_flash_read_status()
161169

162170
spi_flash_select_chip();
163171

164-
spi_flash_send_byte(CMD_READ_STATUS);
172+
spi_flash_send_byte(spi_conf.status_cmd);
165173

166174
if (spi_flash_read_byte() & STATUS_READY)
167175
status = FLASH_READY;
@@ -196,7 +204,7 @@ static void spi_flash_read_id(chip_id_t *chip_id)
196204
{
197205
spi_flash_select_chip();
198206

199-
spi_flash_send_byte(CMD_READ_ID);
207+
spi_flash_send_byte(spi_conf.read_id_cmd);
200208

201209
chip_id->maker_id = spi_flash_read_byte();
202210
chip_id->device_id = spi_flash_read_byte();
@@ -213,9 +221,9 @@ static void spi_flash_write_page_async(uint8_t *buf, uint32_t page,
213221

214222
spi_flash_select_chip();
215223

216-
spi_flash_send_byte(CMD_FLASH_PAGE_WRITE);
224+
spi_flash_send_byte(spi_conf.write_cmd);
217225

218-
page = page << PAGE_ADDRESS_OFFSET;
226+
page = page << spi_conf.page_offset;
219227

220228
spi_flash_send_byte(ADDR_3rd_CYCLE(page));
221229
spi_flash_send_byte(ADDR_2nd_CYCLE(page));
@@ -230,11 +238,11 @@ static void spi_flash_write_page_async(uint8_t *buf, uint32_t page,
230238
static uint32_t spi_flash_read_data(uint8_t *buf, uint32_t page,
231239
uint32_t page_offset, uint32_t data_size)
232240
{
233-
uint32_t i, addr = (page << PAGE_ADDRESS_OFFSET) + page_offset;
241+
uint32_t i, addr = (page << spi_conf.page_offset) + page_offset;
234242

235243
spi_flash_select_chip();
236244

237-
spi_flash_send_byte(CMD_FLASH_PAGE_READ);
245+
spi_flash_send_byte(spi_conf.read_cmd);
238246

239247
spi_flash_send_byte(ADDR_3rd_CYCLE(addr));
240248
spi_flash_send_byte(ADDR_2nd_CYCLE(addr));
@@ -265,10 +273,11 @@ static uint32_t spi_flash_read_spare_data(uint8_t *buf, uint32_t page,
265273

266274
static uint32_t spi_flash_erase_block(uint32_t page)
267275
{
268-
uint32_t addr = page << PAGE_ADDRESS_OFFSET;
276+
uint32_t addr = page << spi_conf.page_offset;
277+
269278
spi_flash_select_chip();
270279

271-
spi_flash_send_byte(CMD_FLASH_BLOCK_ERASE);
280+
spi_flash_send_byte(spi_conf.erase_cmd);
272281

273282
spi_flash_send_byte(ADDR_3rd_CYCLE(addr));
274283
spi_flash_send_byte(ADDR_2nd_CYCLE(addr));

qt/nando_spi_chip_db.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
# name, page size, block size, total size, ID1, ID2, ID3, ID4, ID5
2-
AT45DB021D, 264, 2112, 270336, 31, 35, -, -, -
1+
# name, page size, block size, total size, page off., read com., read ID com., write com., erase com., status com., ID1, ID2, ID3, ID4, ID5
2+
AT45DB021D, 264, 2112, 270336, 9, 11, 159, 130, 80, 215, 31, 35, -, -, -

qt/spi_chip_db.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ ChipInfo *SpiChipDb::stringToChipInfo(const QString &s)
6666
}
6767
ci->setTotalSize(paramValue);
6868

69-
for (int i = CHIP_PARAM_ID1; i < CHIP_PARAM_NUM; i++)
69+
for (int i = CHIP_PARAM_PAGE_OFF; i < CHIP_PARAM_NUM; i++)
7070
{
7171
if (getOptParamFromString(paramsList[i], paramValue))
7272
{
@@ -75,7 +75,7 @@ ChipInfo *SpiChipDb::stringToChipInfo(const QString &s)
7575
delete ci;
7676
return nullptr;
7777
}
78-
ci->setParam(i - CHIP_PARAM_ID1, paramValue);
78+
ci->setParam(i - CHIP_PARAM_PAGE_OFF, paramValue);
7979
}
8080

8181
return ci;
@@ -96,10 +96,13 @@ int SpiChipDb::chipInfoToString(ChipInfo *chipInfo, QString &s)
9696
paramsList.append(csvValue);
9797
getStringFromParam(ci->getSpareSize(), csvValue);
9898
paramsList.append(csvValue);
99-
for (int i = CHIP_PARAM_ID1; i < CHIP_PARAM_NUM; i++)
99+
for (int i = CHIP_PARAM_PAGE_OFF; i < CHIP_PARAM_NUM; i++)
100100
{
101-
if (getStringFromOptParam(ci->getParam(i - CHIP_PARAM_ID1), csvValue))
101+
if (getStringFromOptParam(ci->getParam(i - CHIP_PARAM_PAGE_OFF),
102+
csvValue))
103+
{
102104
return -1;
105+
}
103106
paramsList.append(csvValue);
104107
}
105108

qt/spi_chip_db.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,18 @@ class SpiChipDb : public ChipDb
3232
CHIP_PARAM_PAGE_SIZE,
3333
CHIP_PARAM_BLOCK_SIZE,
3434
CHIP_PARAM_TOTAL_SIZE,
35+
CHIP_PARAM_PAGE_OFF,
36+
CHIP_PARAM_READ_CMD,
37+
CHIP_PARAM_READ_ID_CMD,
38+
CHIP_PARAM_WRITE_CMD,
39+
CHIP_PARAM_ERASE_CMD,
40+
CHIP_PARAM_STATUS_CMD,
3541
CHIP_PARAM_ID1,
3642
CHIP_PARAM_ID2,
3743
CHIP_PARAM_ID3,
3844
CHIP_PARAM_ID4,
3945
CHIP_PARAM_ID5,
40-
CHIP_PARAM_NUM,
46+
CHIP_PARAM_NUM
4147
};
4248

4349
explicit SpiChipDb();

qt/spi_chip_db_dialog.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ SpiChipDbDialog::SpiChipDbDialog(SpiChipDb *chipDb, QWidget *parent) :
2626
ui->chipDbTableView->setColumnWidth(SpiChipDb::CHIP_PARAM_TOTAL_SIZE,
2727
HEADER_MED_WIDTH);
2828

29+
for (int i = SpiChipDb::CHIP_PARAM_PAGE_OFF;
30+
i <= SpiChipDb::CHIP_PARAM_STATUS_CMD; i++)
31+
{
32+
ui->chipDbTableView->setColumnWidth(i, HEADER_MED_WIDTH);
33+
}
34+
2935
connect(ui->addChipDbButton, SIGNAL(clicked()), this,
3036
SLOT(slotAddChipDbButtonClicked()));
3137
connect(ui->delChipDbButton, SIGNAL(clicked()), this,

qt/spi_chip_db_table_model.cpp

Lines changed: 91 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,36 @@ QVariant SpiChipDbTableModel::data(const QModelIndex &index, int role) const
5050
chipDb->getHexStringFromParam(chipDb->getTotalSize(index.row()),
5151
paramStr);
5252
return paramStr;
53+
case SpiChipDb::CHIP_PARAM_PAGE_OFF:
54+
return chipDb->getChipParam(index.row(),
55+
SpiChipInfo::CHIP_PARAM_PAGE_OFF);
56+
case SpiChipDb::CHIP_PARAM_READ_CMD:
57+
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
58+
SpiChipInfo::CHIP_PARAM_READ_CMD), paramStr);
59+
return paramStr;
60+
case SpiChipDb::CHIP_PARAM_READ_ID_CMD:
61+
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
62+
SpiChipInfo::CHIP_PARAM_READ_ID_CMD), paramStr);
63+
return paramStr;
64+
case SpiChipDb::CHIP_PARAM_WRITE_CMD:
65+
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
66+
SpiChipInfo::CHIP_PARAM_WRITE_CMD), paramStr);
67+
return paramStr;
68+
case SpiChipDb::CHIP_PARAM_ERASE_CMD:
69+
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
70+
SpiChipInfo::CHIP_PARAM_ERASE_CMD), paramStr);
71+
return paramStr;
72+
case SpiChipDb::CHIP_PARAM_STATUS_CMD:
73+
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
74+
SpiChipInfo::CHIP_PARAM_STATUS_CMD), paramStr);
75+
return paramStr;
5376
case SpiChipDb::CHIP_PARAM_ID1:
5477
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
55-
SpiChipInfo::CHIP_PARAM_ID1),
56-
paramStr);
78+
SpiChipInfo::CHIP_PARAM_ID1), paramStr);
5779
return paramStr;
5880
case SpiChipDb::CHIP_PARAM_ID2:
5981
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
60-
SpiChipInfo::CHIP_PARAM_ID2),
61-
paramStr);
82+
SpiChipInfo::CHIP_PARAM_ID2), paramStr);
6283
return paramStr;
6384
case SpiChipDb::CHIP_PARAM_ID3:
6485
chipDb->getHexStringFromOptParam(chipDb->getChipParam(index.row(),
@@ -88,6 +109,12 @@ QVariant SpiChipDbTableModel::headerData(int section,
88109
case SpiChipDb::CHIP_PARAM_PAGE_SIZE: return tr("Page size");
89110
case SpiChipDb::CHIP_PARAM_BLOCK_SIZE: return tr("Block size");
90111
case SpiChipDb::CHIP_PARAM_TOTAL_SIZE: return tr("Total size");
112+
case SpiChipDb::CHIP_PARAM_PAGE_OFF: return tr("Page off.");
113+
case SpiChipDb::CHIP_PARAM_READ_CMD: return tr("Read com.");
114+
case SpiChipDb::CHIP_PARAM_READ_ID_CMD: return tr("Read ID com.");
115+
case SpiChipDb::CHIP_PARAM_WRITE_CMD: return tr("Write com.");
116+
case SpiChipDb::CHIP_PARAM_ERASE_CMD: return tr("Erase com.");
117+
case SpiChipDb::CHIP_PARAM_STATUS_CMD: return tr("Status com.");
91118
case SpiChipDb::CHIP_PARAM_ID1: return tr("ID 1");
92119
case SpiChipDb::CHIP_PARAM_ID2: return tr("ID 2");
93120
case SpiChipDb::CHIP_PARAM_ID3: return tr("ID 3");
@@ -108,6 +135,18 @@ QVariant SpiChipDbTableModel::headerData(int section,
108135
return tr("Block size in bytes");
109136
case SpiChipDb::CHIP_PARAM_TOTAL_SIZE:
110137
return tr("Total size in bytes");
138+
case SpiChipDb::CHIP_PARAM_PAGE_OFF:
139+
return tr("Page offset in address");
140+
case SpiChipDb::CHIP_PARAM_READ_CMD:
141+
return tr("Page read command");
142+
case SpiChipDb::CHIP_PARAM_READ_ID_CMD:
143+
return tr("Read ID command");
144+
case SpiChipDb::CHIP_PARAM_WRITE_CMD:
145+
return tr("Page write command");
146+
case SpiChipDb::CHIP_PARAM_ERASE_CMD:
147+
return tr("Block erase command");
148+
case SpiChipDb::CHIP_PARAM_STATUS_CMD:
149+
return tr("Read status command");
111150
case SpiChipDb::CHIP_PARAM_ID1:
112151
return tr("Chip ID 1st byte");
113152
case SpiChipDb::CHIP_PARAM_ID2:
@@ -157,6 +196,54 @@ bool SpiChipDbTableModel::setData(const QModelIndex &index,
157196
return false;
158197
chipDb->setTotalSize(index.row(), paramVal);
159198
return true;
199+
case SpiChipDb::CHIP_PARAM_PAGE_OFF:
200+
if (chipDb->getParamFromString(value.toString(), paramVal))
201+
return false;
202+
if (chipDb->isParamValid(paramVal, 0, 0xFF))
203+
return false;
204+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_PAGE_OFF,
205+
paramVal);
206+
return true;
207+
case SpiChipDb::CHIP_PARAM_READ_CMD:
208+
if (chipDb->getParamFromHexString(value.toString(), paramVal))
209+
return false;
210+
if (!chipDb->isParamValid(paramVal, 0x00, 0xFF))
211+
return false;
212+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_READ_CMD,
213+
paramVal);
214+
return true;
215+
case SpiChipDb::CHIP_PARAM_READ_ID_CMD:
216+
if (chipDb->getParamFromHexString(value.toString(), paramVal))
217+
return false;
218+
if (!chipDb->isParamValid(paramVal, 0x00, 0xFF))
219+
return false;
220+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_READ_ID_CMD,
221+
paramVal);
222+
return true;
223+
case SpiChipDb::CHIP_PARAM_WRITE_CMD:
224+
if (chipDb->getParamFromHexString(value.toString(), paramVal))
225+
return false;
226+
if (!chipDb->isParamValid(paramVal, 0x00, 0xFF))
227+
return false;
228+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_WRITE_CMD,
229+
paramVal);
230+
return true;
231+
case SpiChipDb::CHIP_PARAM_ERASE_CMD:
232+
if (chipDb->getParamFromHexString(value.toString(), paramVal))
233+
return false;
234+
if (!chipDb->isParamValid(paramVal, 0x00, 0xFF))
235+
return false;
236+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_ERASE_CMD,
237+
paramVal);
238+
return true;
239+
case SpiChipDb::CHIP_PARAM_STATUS_CMD:
240+
if (chipDb->getParamFromHexString(value.toString(), paramVal))
241+
return false;
242+
if (!chipDb->isParamValid(paramVal, 0x00, 0xFF))
243+
return false;
244+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_STATUS_CMD,
245+
paramVal);
246+
return true;
160247
case SpiChipDb::CHIP_PARAM_ID1:
161248
if (chipDb->getParamFromHexString(value.toString(), paramVal))
162249
return false;

qt/spi_chip_info.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77

88
typedef struct __attribute__((__packed__))
99
{
10-
uint32_t dummy;
10+
uint8_t page_offset;
11+
uint8_t read_cmd;
12+
uint8_t read_id_cmd;
13+
uint8_t write_cmd;
14+
uint8_t erase_cmd;
15+
uint8_t status_cmd;
1116
} Conf;
1217

1318
SpiChipInfo::SpiChipInfo()
@@ -23,6 +28,13 @@ const QByteArray &SpiChipInfo::getHalConf()
2328
{
2429
Conf conf;
2530

31+
conf.page_offset = static_cast<uint8_t>(params[CHIP_PARAM_PAGE_OFF]);
32+
conf.read_cmd = static_cast<uint8_t>(params[CHIP_PARAM_READ_CMD]);
33+
conf.read_id_cmd = static_cast<uint8_t>(params[CHIP_PARAM_READ_ID_CMD]);
34+
conf.write_cmd = static_cast<uint8_t>(params[CHIP_PARAM_WRITE_CMD]);
35+
conf.erase_cmd = static_cast<uint8_t>(params[CHIP_PARAM_ERASE_CMD]);
36+
conf.status_cmd = static_cast<uint8_t>(params[CHIP_PARAM_STATUS_CMD]);
37+
2638
halConf.clear();
2739
halConf.append(reinterpret_cast<const char *>(&conf), sizeof(conf));
2840

qt/spi_chip_info.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ class SpiChipInfo : public ChipInfo
1313
public:
1414
enum
1515
{
16+
CHIP_PARAM_PAGE_OFF,
17+
CHIP_PARAM_READ_CMD,
18+
CHIP_PARAM_READ_ID_CMD,
19+
CHIP_PARAM_WRITE_CMD,
20+
CHIP_PARAM_ERASE_CMD,
21+
CHIP_PARAM_STATUS_CMD,
1622
CHIP_PARAM_ID1,
1723
CHIP_PARAM_ID2,
1824
CHIP_PARAM_ID3,

0 commit comments

Comments
 (0)