Skip to content

Commit e17fe78

Browse files
krish2718cfriedt
authored andcommitted
modules: nrf_wifi: Add generic read/write APIs
These can be used read/write any address. Signed-off-by: Chaitanya Tata <[email protected]>
1 parent ea5412e commit e17fe78

File tree

6 files changed

+217
-0
lines changed

6 files changed

+217
-0
lines changed

include/zephyr/drivers/wifi/nrf_wifi/bus/qspi_if.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,26 @@ int qspi_RDSR1(const struct device *dev, uint8_t *rdsr1);
9898
int qspi_RDSR2(const struct device *dev, uint8_t *rdsr2);
9999
int qspi_WRSR2(const struct device *dev, const uint8_t wrsr2);
100100

101+
/**
102+
* @brief Read a register via QSPI
103+
*
104+
* @param dev QSPI device
105+
* @param reg_addr Register address (opcode)
106+
* @param reg_value Pointer to store the read value
107+
* @return int 0 on success, negative error code on failure
108+
*/
109+
int qspi_read_reg(const struct device *dev, uint8_t reg_addr, uint8_t *reg_value);
110+
111+
/**
112+
* @brief Write a register via QSPI
113+
*
114+
* @param dev QSPI device
115+
* @param reg_addr Register address (opcode)
116+
* @param reg_value Value to write
117+
* @return int 0 on success, negative error code on failure
118+
*/
119+
int qspi_write_reg(const struct device *dev, uint8_t reg_addr, uint8_t reg_value);
120+
101121
#ifdef CONFIG_NRF_WIFI_LOW_POWER
102122
int func_rpu_sleep(void);
103123
int func_rpu_wake(void);

include/zephyr/drivers/wifi/nrf_wifi/bus/rpu_hw_if.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@ int rpu_rdsr2(void);
5454
int rpu_rdsr1(void);
5555
int rpu_clks_on(void);
5656

57+
/**
58+
* @brief Read a register via RPU hardware interface
59+
*
60+
* @param reg_addr Register address (opcode)
61+
* @param reg_value Pointer to store the read value
62+
* @return int 0 on success, negative error code on failure
63+
*/
64+
int rpu_read_reg(uint8_t reg_addr, uint8_t *reg_value);
65+
66+
/**
67+
* @brief Write a register via RPU hardware interface
68+
*
69+
* @param reg_addr Register address (opcode)
70+
* @param reg_value Value to write
71+
* @return int 0 on success, negative error code on failure
72+
*/
73+
int rpu_write_reg(uint8_t reg_addr, uint8_t reg_value);
74+
5775
int rpu_init(void);
5876
int rpu_enable(void);
5977
int rpu_disable(void);

modules/nrf_wifi/bus/qspi_if.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,85 @@ int qspi_cmd_wakeup_rpu(const struct device *dev, uint8_t data)
11901190
return ret;
11911191
}
11921192

1193+
/**
1194+
* @brief Read a register via QSPI
1195+
*
1196+
* @param dev QSPI device
1197+
* @param reg_addr Register address (opcode)
1198+
* @param reg_value Pointer to store the read value
1199+
* @return int 0 on success, negative error code on failure
1200+
*/
1201+
int qspi_read_reg(const struct device *dev, uint8_t reg_addr, uint8_t *reg_value)
1202+
{
1203+
int ret = 0;
1204+
uint8_t sr = 0;
1205+
1206+
const struct qspi_buf sr_buf = {
1207+
.buf = &sr,
1208+
.len = sizeof(sr),
1209+
};
1210+
struct qspi_cmd cmd = {
1211+
.op_code = reg_addr,
1212+
.rx_buf = &sr_buf,
1213+
};
1214+
1215+
ret = qspi_device_init(dev);
1216+
if (ret != 0) {
1217+
return ret;
1218+
}
1219+
1220+
ret = qspi_send_cmd(dev, &cmd, false);
1221+
1222+
qspi_device_uninit(dev);
1223+
1224+
LOG_DBG("QSPI read reg 0x%02x = 0x%02x", reg_addr, sr);
1225+
1226+
if (ret == 0) {
1227+
*reg_value = sr;
1228+
}
1229+
1230+
return ret;
1231+
}
1232+
1233+
/**
1234+
* @brief Write a register via QSPI
1235+
*
1236+
* @param dev QSPI device
1237+
* @param reg_addr Register address (opcode)
1238+
* @param reg_value Value to write
1239+
* @return int 0 on success, negative error code on failure
1240+
*/
1241+
int qspi_write_reg(const struct device *dev, uint8_t reg_addr, uint8_t reg_value)
1242+
{
1243+
int ret = 0;
1244+
1245+
const struct qspi_buf tx_buf = {
1246+
.buf = &reg_value,
1247+
.len = sizeof(reg_value),
1248+
};
1249+
const struct qspi_cmd cmd = {
1250+
.op_code = reg_addr,
1251+
.tx_buf = &tx_buf,
1252+
};
1253+
1254+
ret = qspi_device_init(dev);
1255+
if (ret != 0) {
1256+
return ret;
1257+
}
1258+
1259+
ret = qspi_send_cmd(dev, &cmd, false);
1260+
1261+
qspi_device_uninit(dev);
1262+
1263+
LOG_DBG("QSPI write reg 0x%02x = 0x%02x", reg_addr, reg_value);
1264+
1265+
if (ret < 0) {
1266+
LOG_ERR("QSPI write reg 0x%02x failed: %d", reg_addr, ret);
1267+
}
1268+
1269+
return ret;
1270+
}
1271+
11931272
struct device qspi_perip = {
11941273
.data = &qspi_nor_memory_data,
11951274
};

modules/nrf_wifi/bus/rpu_hw_if.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,37 @@ int rpu_rdsr1(void)
429429
#endif
430430
}
431431

432+
/**
433+
* @brief Read a register via RPU hardware interface
434+
*
435+
* @param reg_addr Register address (opcode)
436+
* @param reg_value Pointer to store the read value
437+
* @return int 0 on success, negative error code on failure
438+
*/
439+
int rpu_read_reg(uint8_t reg_addr, uint8_t *reg_value)
440+
{
441+
#if CONFIG_NRF70_ON_QSPI
442+
return qspi_read_reg(&qspi_perip, reg_addr, reg_value);
443+
#else
444+
return spim_read_reg_wrapper(NULL, reg_addr, reg_value);
445+
#endif
446+
}
447+
448+
/**
449+
* @brief Write a register via RPU hardware interface
450+
*
451+
* @param reg_addr Register address (opcode)
452+
* @param reg_value Value to write
453+
* @return int 0 on success, negative error code on failure
454+
*/
455+
int rpu_write_reg(uint8_t reg_addr, uint8_t reg_value)
456+
{
457+
#if CONFIG_NRF70_ON_QSPI
458+
return qspi_write_reg(&qspi_perip, reg_addr, reg_value);
459+
#else
460+
return spim_write_reg_wrapper(NULL, reg_addr, reg_value);
461+
#endif
462+
}
432463

433464
int rpu_clks_on(void)
434465
{

modules/nrf_wifi/bus/spi_if.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,34 @@ int spim_WRSR2(const struct device *dev, const uint8_t wrsr2)
156156
return spim_write_reg(&spi_spec, 0x3F, wrsr2);
157157
}
158158

159+
/**
160+
* @brief Read a register via SPI (wrapper for compatibility)
161+
*
162+
* @param dev SPI device (unused, kept for compatibility)
163+
* @param reg_addr Register address (opcode)
164+
* @param reg_value Pointer to store the read value
165+
* @return int 0 on success, negative error code on failure
166+
*/
167+
int spim_read_reg_wrapper(const struct device *dev, uint8_t reg_addr, uint8_t *reg_value)
168+
{
169+
ARG_UNUSED(dev);
170+
return spim_read_reg(reg_addr, reg_value);
171+
}
172+
173+
/**
174+
* @brief Write a register via SPI (wrapper for compatibility)
175+
*
176+
* @param dev SPI device (unused, kept for compatibility)
177+
* @param reg_addr Register address (opcode)
178+
* @param reg_value Value to write
179+
* @return int 0 on success, negative error code on failure
180+
*/
181+
int spim_write_reg_wrapper(const struct device *dev, uint8_t reg_addr, uint8_t reg_value)
182+
{
183+
ARG_UNUSED(dev);
184+
return spim_write_reg(&spi_spec, reg_addr, reg_value);
185+
}
186+
159187
int _spim_wait_while_rpu_awake(void)
160188
{
161189
int ret;

modules/nrf_wifi/bus/spi_if.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* Zephyr OS layer of the Wi-Fi driver.
1010
*/
1111

12+
#include <zephyr/drivers/spi.h>
13+
1214
/* SPIM driver config */
1315

1416
int spim_init(struct qspi_config *config);
@@ -34,3 +36,42 @@ int spim_RDSR1(const struct device *dev, uint8_t *rdsr1);
3436
int spim_RDSR2(const struct device *dev, uint8_t *rdsr2);
3537

3638
int spim_WRSR2(const struct device *dev, const uint8_t wrsr2);
39+
40+
/**
41+
* @brief Read a register via SPI
42+
*
43+
* @param reg_addr Register address (opcode)
44+
* @param reg_value Pointer to store the read value
45+
* @return int 0 on success, negative error code on failure
46+
*/
47+
int spim_read_reg(uint32_t reg_addr, uint8_t *reg_value);
48+
49+
/**
50+
* @brief Write a register via SPI
51+
*
52+
* @param spi_spec SPI device specification
53+
* @param reg_addr Register address (opcode)
54+
* @param reg_value Value to write
55+
* @return int 0 on success, negative error code on failure
56+
*/
57+
int spim_write_reg(const struct spi_dt_spec *spi_spec, uint32_t reg_addr, const uint8_t reg_value);
58+
59+
/**
60+
* @brief Read a register via SPI (wrapper for compatibility)
61+
*
62+
* @param dev SPI device (unused, kept for compatibility)
63+
* @param reg_addr Register address (opcode)
64+
* @param reg_value Pointer to store the read value
65+
* @return int 0 on success, negative error code on failure
66+
*/
67+
int spim_read_reg_wrapper(const struct device *dev, uint8_t reg_addr, uint8_t *reg_value);
68+
69+
/**
70+
* @brief Write a register via SPI (wrapper for compatibility)
71+
*
72+
* @param dev SPI device (unused, kept for compatibility)
73+
* @param reg_addr Register address (opcode)
74+
* @param reg_value Value to write
75+
* @return int 0 on success, negative error code on failure
76+
*/
77+
int spim_write_reg_wrapper(const struct device *dev, uint8_t reg_addr, uint8_t reg_value);

0 commit comments

Comments
 (0)