spi_nor_read_data()代码解析
时间: 2024-05-08 20:21:53 浏览: 152
`spi_nor_read_data()`是SPI NOR Flash驱动中的函数,用于从Flash芯片中读取指定长度的数据。下面是代码解析:
```c
int spi_nor_read_data(struct spi_nor *nor, u32 from, size_t len, void *buf)
{
int ret;
ret = spi_nor_wait_till_ready(nor);
if (ret)
return ret;
while (len) {
u32 read_len = len;
/* Read up to the next page boundary. */
if (nor->cur_4byte_mode && (from & 0xff)) {
read_len = min_t(size_t, 256 - (from & 0xff), read_len);
} else if (from & 0x3) {
read_len = min_t(size_t, 4 - (from & 0x3), read_len);
}
ret = nor->read(nor, from, read_len, buf);
if (ret)
return ret;
from += read_len;
buf += read_len;
len -= read_len;
}
return 0;
}
```
首先,该函数会调用 `spi_nor_wait_till_ready()`函数,等待Flash芯片处于可读状态。
接着,循环读取数据,每次读取的长度为 `read_len`。`read_len` 的计算方式是:
- 如果当前SPI NOR Flash设备处于 4 字节地址模式,并且 `from` 地址不是 256 的整数倍,那么 `read_len` 就等于从 `from` 地址开始到下一个 256 的整数倍的地址之间的字节数(最多读取 256 字节)。
- 如果当前SPI NOR Flash设备未处于 4 字节地址模式,并且 `from` 地址不是 4 的整数倍,那么 `read_len` 就等于从 `from` 地址开始到下一个 4 的整数倍的地址之间的字节数(最多读取 4 字节)。
然后,调用SPI NOR Flash驱动中的 `read()` 函数进行实际的读取操作。该函数将读取的数据保存到 `buf` 缓冲区中。
最后,更新 `from` 地址、`buf` 缓冲区指针和 `len` 剩余长度,循环读取数据,直到读取完指定长度的数据或出现错误。如果读取成功,函数返回 0。否则,返回错误码。
阅读全文