Skip to content

Commit d50d629

Browse files
committed
Configure SPI BUSY bit number and active state from host app
1 parent 94bf363 commit d50d629

File tree

7 files changed

+51
-12
lines changed

7 files changed

+51
-12
lines changed

firmware/programmer/spi_flash.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
#define FLASH_DUMMY_BYTE 0xA5
1515

16-
#define STATUS_READY (1<<7)
17-
1816
#define FLASH_READY 0
1917
#define FLASH_BUSY 1
2018
#define FLASH_TIMEOUT 2
@@ -36,6 +34,8 @@ typedef struct __attribute__((__packed__))
3634
uint8_t write_cmd;
3735
uint8_t erase_cmd;
3836
uint8_t status_cmd;
37+
uint8_t busy_bit;
38+
uint8_t busy_state;
3939
} spi_conf_t;
4040

4141
static spi_conf_t spi_conf;
@@ -165,20 +165,23 @@ static inline uint8_t spi_flash_read_byte()
165165

166166
static uint32_t spi_flash_read_status()
167167
{
168-
uint32_t status;
168+
uint8_t status;
169+
uint32_t flash_status = FLASH_READY;
169170

170171
spi_flash_select_chip();
171172

172173
spi_flash_send_byte(spi_conf.status_cmd);
173174

174-
if (spi_flash_read_byte() & STATUS_READY)
175-
status = FLASH_READY;
176-
else
177-
status = FLASH_BUSY;
175+
status = spi_flash_read_byte();
176+
177+
if (spi_conf.busy_state == 1 && (status & (1 << spi_conf.busy_bit)))
178+
flash_status = FLASH_BUSY;
179+
else if (spi_conf.busy_state == 0 && !(status & (1 << spi_conf.busy_bit)))
180+
flash_status = FLASH_BUSY;
178181

179182
spi_flash_deselect_chip();
180183

181-
return status;
184+
return flash_status;
182185
}
183186

184187
static uint32_t spi_flash_get_status()

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, 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, -, -, -
1+
# name, page size, block size, total size, page off., read com., read ID com., write com., erase com., status com., Busy bit, Busy bit state, ID1, ID2, ID3, ID4, ID5
2+
AT45DB021D, 264, 2112, 270336, 9, 11, 159, 130, 80, 215, 7, 0, 31, 35, -, -, -

qt/spi_chip_db.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class SpiChipDb : public ChipDb
3838
CHIP_PARAM_WRITE_CMD,
3939
CHIP_PARAM_ERASE_CMD,
4040
CHIP_PARAM_STATUS_CMD,
41+
CHIP_PARAM_BUSY_BIT,
42+
CHIP_PARAM_BUSY_STATE,
4143
CHIP_PARAM_ID1,
4244
CHIP_PARAM_ID2,
4345
CHIP_PARAM_ID3,

qt/spi_chip_db_dialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ SpiChipDbDialog::SpiChipDbDialog(SpiChipDb *chipDb, QWidget *parent) :
2727
HEADER_MED_WIDTH);
2828

2929
for (int i = SpiChipDb::CHIP_PARAM_PAGE_OFF;
30-
i <= SpiChipDb::CHIP_PARAM_STATUS_CMD; i++)
30+
i <= SpiChipDb::CHIP_PARAM_BUSY_STATE; i++)
3131
{
3232
ui->chipDbTableView->setColumnWidth(i, HEADER_MED_WIDTH);
3333
}

qt/spi_chip_db_table_model.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ QVariant SpiChipDbTableModel::data(const QModelIndex &index, int role) const
7373
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
7474
SpiChipInfo::CHIP_PARAM_STATUS_CMD), paramStr);
7575
return paramStr;
76+
case SpiChipDb::CHIP_PARAM_BUSY_BIT:
77+
return chipDb->getChipParam(index.row(),
78+
SpiChipInfo::CHIP_PARAM_BUSY_BIT);
79+
case SpiChipDb::CHIP_PARAM_BUSY_STATE:
80+
return chipDb->getChipParam(index.row(),
81+
SpiChipInfo::CHIP_PARAM_BUSY_STATE);
7682
case SpiChipDb::CHIP_PARAM_ID1:
7783
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
7884
SpiChipInfo::CHIP_PARAM_ID1), paramStr);
@@ -115,6 +121,8 @@ QVariant SpiChipDbTableModel::headerData(int section,
115121
case SpiChipDb::CHIP_PARAM_WRITE_CMD: return tr("Write com.");
116122
case SpiChipDb::CHIP_PARAM_ERASE_CMD: return tr("Erase com.");
117123
case SpiChipDb::CHIP_PARAM_STATUS_CMD: return tr("Status com.");
124+
case SpiChipDb::CHIP_PARAM_BUSY_BIT: return tr("Busy bit");
125+
case SpiChipDb::CHIP_PARAM_BUSY_STATE: return tr("Busy bit state");
118126
case SpiChipDb::CHIP_PARAM_ID1: return tr("ID 1");
119127
case SpiChipDb::CHIP_PARAM_ID2: return tr("ID 2");
120128
case SpiChipDb::CHIP_PARAM_ID3: return tr("ID 3");
@@ -147,6 +155,10 @@ QVariant SpiChipDbTableModel::headerData(int section,
147155
return tr("Block erase command");
148156
case SpiChipDb::CHIP_PARAM_STATUS_CMD:
149157
return tr("Read status command");
158+
case SpiChipDb::CHIP_PARAM_BUSY_BIT:
159+
return tr("Busy bit number (0-7) in status register");
160+
case SpiChipDb::CHIP_PARAM_BUSY_STATE:
161+
return tr("Busy bit active state (0/1)");
150162
case SpiChipDb::CHIP_PARAM_ID1:
151163
return tr("Chip ID 1st byte");
152164
case SpiChipDb::CHIP_PARAM_ID2:
@@ -167,7 +179,7 @@ Qt::ItemFlags SpiChipDbTableModel::flags (const QModelIndex &index) const
167179
{
168180
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
169181
}
170-
182+
#include <QDebug>
171183
bool SpiChipDbTableModel::setData(const QModelIndex &index,
172184
const QVariant &value, int role)
173185
{
@@ -244,6 +256,22 @@ bool SpiChipDbTableModel::setData(const QModelIndex &index,
244256
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_STATUS_CMD,
245257
paramVal);
246258
return true;
259+
case SpiChipDb::CHIP_PARAM_BUSY_BIT:
260+
if (chipDb->getParamFromString(value.toString(), paramVal))
261+
return false;
262+
if (!chipDb->isParamValid(paramVal, 0, 7))
263+
return false;
264+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_BUSY_BIT,
265+
paramVal);
266+
return true;
267+
case SpiChipDb::CHIP_PARAM_BUSY_STATE:
268+
if (chipDb->getParamFromString(value.toString(), paramVal))
269+
return false;
270+
if (!chipDb->isParamValid(paramVal, 0, 1))
271+
return false;
272+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_BUSY_STATE,
273+
paramVal);
274+
return true;
247275
case SpiChipDb::CHIP_PARAM_ID1:
248276
if (chipDb->getParamFromHexString(value.toString(), paramVal))
249277
return false;

qt/spi_chip_info.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ typedef struct __attribute__((__packed__))
1313
uint8_t write_cmd;
1414
uint8_t erase_cmd;
1515
uint8_t status_cmd;
16+
uint8_t busy_bit;
17+
uint8_t busy_state;
1618
} Conf;
1719

1820
SpiChipInfo::SpiChipInfo()
@@ -34,6 +36,8 @@ const QByteArray &SpiChipInfo::getHalConf()
3436
conf.write_cmd = static_cast<uint8_t>(params[CHIP_PARAM_WRITE_CMD]);
3537
conf.erase_cmd = static_cast<uint8_t>(params[CHIP_PARAM_ERASE_CMD]);
3638
conf.status_cmd = static_cast<uint8_t>(params[CHIP_PARAM_STATUS_CMD]);
39+
conf.busy_bit = static_cast<uint8_t>(params[CHIP_PARAM_BUSY_BIT]);
40+
conf.busy_state = static_cast<uint8_t>(params[CHIP_PARAM_BUSY_STATE]);
3741

3842
halConf.clear();
3943
halConf.append(reinterpret_cast<const char *>(&conf), sizeof(conf));

qt/spi_chip_info.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class SpiChipInfo : public ChipInfo
1919
CHIP_PARAM_WRITE_CMD,
2020
CHIP_PARAM_ERASE_CMD,
2121
CHIP_PARAM_STATUS_CMD,
22+
CHIP_PARAM_BUSY_BIT,
23+
CHIP_PARAM_BUSY_STATE,
2224
CHIP_PARAM_ID1,
2325
CHIP_PARAM_ID2,
2426
CHIP_PARAM_ID3,

0 commit comments

Comments
 (0)