Skip to content

Commit 3bb49f7

Browse files
committed
bus: Allow configuration change for a node
It was impossible to change basic configuration for SPI/I2C device once it was used. If only one devices is connected to SPI lines and device requires for example different frequency during work (like for SD card) it was impossible to change it. Now node can have change settings and drivers will check actual parameters and not only whether same device is being used. Signed-off-by: Jerzy Kasenberg <[email protected]>
1 parent 02fe7c7 commit 3bb49f7

File tree

12 files changed

+63
-31
lines changed

12 files changed

+63
-31
lines changed

hw/bus/drivers/i2c_common/include/bus/drivers/i2c_common.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ struct bus_i2c_dev_cfg {
5353
struct bus_i2c_dev {
5454
struct bus_dev bdev;
5555
struct bus_i2c_dev_cfg cfg;
56+
/** I2C address */
57+
uint16_t addr;
58+
/** I2C frequency in kHz */
59+
uint16_t freq;
5660

5761
#if MYNEWT_VAL(BUS_DEBUG_OS_DEV)
5862
uint32_t devmagic;

hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,9 @@ i2c_da1469x_configure_controller(struct bus_i2c_dev *dev, uint8_t address, uint1
421421

422422
BUS_DEBUG_VERIFY_DEV(dev);
423423

424+
if (dev->addr == address && dev->freq == freq) {
425+
goto end;
426+
}
424427
i2c_regs = da1469x_i2c[dev->cfg.i2c_num].regs;
425428

426429
if (i2c_regs->I2C_ENABLE_REG & I2C_I2C_ENABLE_REG_I2C_EN_Msk) {

hw/bus/drivers/i2c_hal/src/i2c_hal.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,13 @@ bus_i2c_configure(struct bus_dev *bdev, struct bus_node *bnode)
8282
{
8383
struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
8484
struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
85-
struct bus_i2c_node *current_node = (struct bus_i2c_node *)bdev->configured_for;
8685
struct hal_i2c_settings i2c_cfg;
8786
int rc;
8887

8988
BUS_DEBUG_VERIFY_DEV(dev);
9089
BUS_DEBUG_VERIFY_NODE(node);
9190

92-
if (current_node && (current_node->freq == node->freq)) {
91+
if (dev->freq == node->freq) {
9392
return 0;
9493
}
9594

@@ -104,6 +103,8 @@ bus_i2c_configure(struct bus_dev *bdev, struct bus_node *bnode)
104103
if (rc) {
105104
goto done;
106105
}
106+
dev->freq = node->freq;
107+
dev->addr = node->addr;
107108

108109
rc = hal_i2c_enable(dev->cfg.i2c_num);
109110

hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,10 @@ bus_i2c_nrf52_twim_configure_controller(struct bus_i2c_dev *dev, uint8_t address
406406

407407
BUS_DEBUG_VERIFY_DEV(dev);
408408

409+
if (dev->freq == freq && dev->addr == address) {
410+
goto end;
411+
}
412+
409413
nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
410414

411415
switch (freq) {
@@ -427,8 +431,10 @@ bus_i2c_nrf52_twim_configure_controller(struct bus_i2c_dev *dev, uint8_t address
427431

428432
if (rc == 0) {
429433
nrf_twim->ADDRESS = address;
434+
dev->addr = address;
435+
dev->freq = freq;
430436
}
431-
437+
end:
432438
return rc;
433439
}
434440

hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ bus_i2c_nrf5340_configure_controller(struct bus_i2c_dev *dev, uint8_t address, u
207207
NRF_TWIM_Type *nrf_twim;
208208
int rc = 0;
209209

210+
if (dev->freq == freq && dev->addr == address) {
211+
goto end;
212+
}
213+
210214
nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
211215

212216
switch (freq) {
@@ -228,8 +232,10 @@ bus_i2c_nrf5340_configure_controller(struct bus_i2c_dev *dev, uint8_t address, u
228232

229233
if (rc == 0) {
230234
nrf_twim->ADDRESS = address;
235+
dev->addr = address;
236+
dev->freq = freq;
231237
}
232-
238+
end:
233239
return rc;
234240
}
235241

hw/bus/drivers/i2c_nrf91_twim/src/i2c_nrf91_twim.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -395,21 +395,19 @@ bus_i2c_nrf91_twim_configure(struct bus_dev *bdev, struct bus_node *bnode)
395395
{
396396
struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
397397
struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
398-
struct bus_i2c_node *current_node = (struct bus_i2c_node *)bdev->configured_for;
399398
NRF_TWIM_Type *nrf_twim;
400399
int rc;
401400

402401
BUS_DEBUG_VERIFY_DEV(dev);
403402
BUS_DEBUG_VERIFY_NODE(node);
404403

404+
if (dev->addr == node->addr && dev->freq == node->freq) {
405+
return 0;
406+
}
405407
nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
406408

407409
nrf_twim->ADDRESS = node->addr;
408410

409-
if (current_node && (current_node->freq == node->freq)) {
410-
return 0;
411-
}
412-
413411
rc = 0;
414412

415413
switch (node->freq) {
@@ -429,6 +427,11 @@ bus_i2c_nrf91_twim_configure(struct bus_dev *bdev, struct bus_node *bnode)
429427
rc = SYS_EIO;
430428
}
431429

430+
if (rc == 0) {
431+
dev->freq = node->freq;
432+
dev->addr = node->addr;
433+
}
434+
432435
return rc;
433436
}
434437

hw/bus/drivers/spi_apollo3/src/spi_apollo3.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,15 @@ bus_spi_configure(struct bus_dev *bdev, struct bus_node *bnode)
8686
{
8787
struct bus_spi_dev *spi_dev = (struct bus_spi_dev *)bdev;
8888
struct bus_spi_node *node = (struct bus_spi_node *)bnode;
89-
struct bus_spi_node *current_node = (struct bus_spi_node *)bdev->configured_for;
9089
struct hal_spi_settings spi_cfg;
9190
int rc;
9291

9392
BUS_DEBUG_VERIFY_DEV(spi_dev);
9493
BUS_DEBUG_VERIFY_NODE(node);
9594

9695
/* No need to reconfigure if already configured with the same settings */
97-
if (current_node && (current_node->mode == node->mode) &&
98-
(current_node->data_order == node->data_order) &&
99-
(current_node->freq == node->freq)) {
96+
if ((spi_dev->mode == node->mode) && (spi_dev->data_order == node->data_order) &&
97+
(spi_dev->freq == node->freq)) {
10098
return 0;
10199
}
102100

@@ -105,6 +103,10 @@ bus_spi_configure(struct bus_dev *bdev, struct bus_node *bnode)
105103
goto done;
106104
}
107105

106+
spi_dev->freq = node->freq;
107+
spi_dev->data_order = node->data_order;
108+
spi_dev->mode = node->mode;
109+
108110
spi_cfg.data_mode = node->mode;
109111
spi_cfg.data_order = node->data_order;
110112
spi_cfg.baudrate = node->freq * 1000;

hw/bus/drivers/spi_common/include/bus/drivers/spi_common.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ struct bus_spi_dev_cfg {
4141
struct bus_spi_dev {
4242
struct bus_dev bdev;
4343
struct bus_spi_dev_cfg cfg;
44+
/** Data mode, one of the BUS_SPI_MODE_x */
45+
int mode;
46+
/** Data order, one of the BUS_SPI_DATA_ORDER_LSB/MSB */
47+
int data_order;
48+
/** Current SPI frequency in kHz */
49+
uint32_t freq;
4450

4551
#if MYNEWT_VAL(BUS_DEBUG_OS_DEV)
4652
uint32_t devmagic;

hw/bus/drivers/spi_da1469x/src/spi_da1469x.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ spi_da1469x_disable(struct bus_dev *bdev)
393393
* Domain COM can be powered off, register content can be lost prepare
394394
* to set it from scratch.
395395
*/
396-
bdev->configured_for = NULL;
396+
dev->freq = 0;
397397

398398
da1469x_pd_release(MCU_PD_DOMAIN_COM);
399399

@@ -437,7 +437,6 @@ spi_da1469x_configure(struct bus_dev *bdev, struct bus_node *bnode)
437437
{
438438
struct bus_spi_dev *dev = (struct bus_spi_dev *)bdev;
439439
struct bus_spi_node *node = (struct bus_spi_node *)bnode;
440-
struct bus_spi_node *current_node = (struct bus_spi_node *)bdev->configured_for;
441440
struct spi_da1469x_driver_data *dd;
442441
SPI_Type *regs;
443442
uint32_t ctrl_reg;
@@ -453,11 +452,16 @@ spi_da1469x_configure(struct bus_dev *bdev, struct bus_node *bnode)
453452
regs->SPI_CTRL_REG = ctrl_reg ^ (SPI_SPI_CTRL_REG_SPI_ON_Msk);
454453
}
455454

456-
if (current_node && (current_node->freq == node->freq) && current_node->mode == node->mode) {
457-
/* Same device, no changes required. */
455+
if ((spi_dev->mode == node->mode) && (spi_dev->data_order == node->data_order) &&
456+
(spi_dev->freq == node->freq)) {
457+
/* Same configuration, no changes required. */
458458
goto end;
459459
}
460460

461+
spi_dev->freq = node->freq;
462+
spi_dev->data_order = node->data_order;
463+
spi_dev->mode = node->mode;
464+
461465
ctrl_reg &= ~(SPI_SPI_CTRL_REG_SPI_TX_FIFO_NOTFULL_MASK_Msk |
462466
SPI_SPI_CTRL_REG_SPI_DMA_TXREQ_MODE_Msk |
463467
SPI_SPI_CTRL_REG_SPI_9BIT_VAL_Msk |

hw/bus/drivers/spi_hal/src/spi_hal.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,15 @@ bus_spi_configure(struct bus_dev *bdev, struct bus_node *bnode)
9595
{
9696
struct bus_spi_dev *spi_dev = (struct bus_spi_dev *)bdev;
9797
struct bus_spi_node *node = (struct bus_spi_node *)bnode;
98-
struct bus_spi_node *current_node = (struct bus_spi_node *)bdev->configured_for;
9998
struct hal_spi_settings spi_cfg;
10099
int rc;
101100

102101
BUS_DEBUG_VERIFY_DEV(spi_dev);
103102
BUS_DEBUG_VERIFY_NODE(node);
104103

105104
/* No need to reconfigure if already configured with the same settings */
106-
if (current_node && (current_node->mode == node->mode) &&
107-
(current_node->data_order == node->data_order) &&
108-
(current_node->freq == node->freq)) {
105+
if ((spi_dev->mode == node->mode) && (spi_dev->data_order == node->data_order) &&
106+
(spi_dev->freq == node->freq)) {
109107
return 0;
110108
}
111109

@@ -114,6 +112,10 @@ bus_spi_configure(struct bus_dev *bdev, struct bus_node *bnode)
114112
goto done;
115113
}
116114

115+
spi_dev->freq = node->freq;
116+
spi_dev->data_order = node->data_order;
117+
spi_dev->mode = node->mode;
118+
117119
spi_cfg.data_mode = node->mode;
118120
spi_cfg.data_order = node->data_order;
119121
spi_cfg.baudrate = node->freq;

hw/bus/drivers/spi_stm32/src/spi_stm32.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,6 @@ spi_stm32_configure(struct bus_dev *bdev, struct bus_node *bnode)
607607
{
608608
struct bus_spi_dev *dev = (struct bus_spi_dev *)bdev;
609609
struct bus_spi_node *node = (struct bus_spi_node *)bnode;
610-
struct bus_spi_node *current_node = (struct bus_spi_node *)bdev->configured_for;
611610
struct spi_stm32_driver_data *dd;
612611
const struct stm32_spi_hw *hw;
613612
uint32_t pclk;
@@ -620,10 +619,8 @@ spi_stm32_configure(struct bus_dev *bdev, struct bus_node *bnode)
620619

621620
dd = driver_data(dev);
622621

623-
if (current_node &&
624-
current_node->freq == node->freq &&
625-
current_node->data_order == node->data_order &&
626-
current_node->mode == node->mode) {
622+
if (dev->freq == node->freq && dev->data_order == node->data_order &&
623+
dev->mode == node->mode) {
627624
goto end;
628625
}
629626

@@ -639,6 +636,9 @@ spi_stm32_configure(struct bus_dev *bdev, struct bus_node *bnode)
639636
if (prescaler > 7) {
640637
rc = SYS_EINVAL;
641638
} else {
639+
dev->freq = node->freq;
640+
dev->data_order = node->data_order;
641+
dev->mode = node->mode;
642642
#if MYNEWT_VAL(MCU_STM32H7) || MYNEWT_VAL(MCU_STM32U5)
643643
dd->hspi.Init.BaudRatePrescaler = prescaler << SPI_CFG1_MBR_Pos;
644644
#else

hw/bus/src/bus.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -530,11 +530,6 @@ bus_node_lock(struct os_dev *node, os_time_t timeout)
530530
}
531531
#endif
532532

533-
/* No need to configure if already configured for the same node */
534-
if (bdev->configured_for == bnode) {
535-
return 0;
536-
}
537-
538533
/*
539534
* Configuration is done on 1st lock so in case we need to configure device
540535
* on nested lock it means that most likely bus device was locked for one

0 commit comments

Comments
 (0)