spi_nor_read_data函数走读
时间: 2024-05-21 11:14:16 浏览: 134
`spi_nor_read_data()`函数是用来从SPI NOR闪存中读取数据的函数。以下是函数的大致流程:
1. 首先,函数会检查函数参数是否合法。这些参数包括SPI NOR闪存设备结构体指针、读取数据的起始地址、读取数据的长度以及存放读取数据的缓冲区指针。如果参数不合法,函数会返回错误代码。
2. 然后,函数会调用SPI NOR闪存的“读取指令”函数来发送读取数据的指令。这个函数通常是通过调用SPI总线控制器的函数来完成的。
3. 接着,函数会循环读取SPI NOR闪存中的数据,并存储到缓冲区中。在每次循环中,函数会检查是否已经读取完指定长度的数据。如果已经读取完,则函数会退出循环。
4. 最后,函数会返回读取数据的长度。
总的来说,`spi_nor_read_data()`函数的主要作用是从SPI NOR闪存中读取指定长度的数据并存储到缓冲区中。
相关问题
uboot下norflash读写代码走读
U-Boot(Universal Bootloader)是一款开源的、通用的、模块化的嵌入式系统引导加载程序。它可以被用于各种嵌入式系统中,如计算机主板、网络设备、无线设备等。
在U-Boot中,对于Nor Flash的读写,主要是通过SPI接口进行的。下面是Nor Flash读写代码的走读:
1. 首先需要定义Nor Flash的设备结构体,其中包括了Nor Flash的基本信息以及对应的读写函数指针。
```
struct flash_info {
char* name; /* 设备名称 */
unsigned long base; /* 设备物理地址 */
unsigned long size; /* 设备大小 */
unsigned long sector_size; /* 扇区大小 */
unsigned long block_size; /* 块大小 */
void (*erase)(unsigned long); /* 擦除函数指针 */
void (*write)(unsigned long, const uchar*, unsigned long); /* 写函数指针 */
uchar (*read)(unsigned long); /* 读函数指针 */
};
```
2. 在U-Boot的配置文件中,需要定义Nor Flash的类型以及对应的设备结构体。
```
#define CONFIG_SPI_FLASH_SST
#define CONFIG_SPI_FLASH_WINBOND
#define CONFIG_SPI_FLASH_MACRONIX
#define CONFIG_SPI_FLASH_SPANSION
#define CONFIG_SPI_FLASH_STMICRO
#define CONFIG_SPI_FLASH_SST
#define CONFIG_SPI_FLASH_ISSI
#define CONFIG_SPI_FLASH_EON
#define CONFIG_SPI_FLASH_GIGADEVICE
#ifdef CONFIG_SPI_FLASH_SST
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_SYS_MAX_FLASH_BANKS_DETECT 1
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_SYS_FLASH_PROTECTION
#define CONFIG_SYS_FLASH_BASE 0x80000000
#define CONFIG_SYS_FLASH_EMPTY_INFO
#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
#endif
#ifdef CONFIG_SPI_FLASH_STMICRO
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_SYS_MAX_FLASH_BANKS_DETECT 1
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_SYS_FLASH_PROTECTION
#define CONFIG_SYS_FLASH_BASE 0x80000000
#define CONFIG_SYS_FLASH_EMPTY_INFO
#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
#endif
```
3. 在Nor Flash的驱动中,需要实现读写、擦除等具体操作函数。
```
static void spi_flash_cmd_write(struct spi_flash *flash, const void *buf, size_t size, uint32_t addr)
{
/* 发送写命令 */
spi_flash_cmd_write_enable(flash);
spi_flash_cmd_addr(flash, addr, flash->cmd.write);
spi_flash_cmd_buf(flash, buf, size);
spi_flash_cmd_wait_ready(flash);
}
static void spi_flash_cmd_read(struct spi_flash *flash, void *buf, size_t size, uint32_t addr)
{
/* 发送读命令 */
spi_flash_cmd_addr(flash, addr, flash->cmd.read);
spi_flash_cmd_buf(flash, NULL, size);
spi_flash_cmd_read_data(flash, buf, size);
}
```
4. 在Nor Flash的驱动中,还需要实现设备初始化、扇区擦除等操作。
```
static int spi_flash_probe(struct spi_flash *flash)
{
/* 初始化设备 */
spi_flash_cmd_init(flash);
/* 读取设备ID */
spi_flash_cmd_read_id(flash);
/* 设置读写擦除函数指针 */
flash->write = spi_flash_cmd_write;
flash->read = spi_flash_cmd_read;
flash->erase = spi_flash_cmd_erase;
return 0;
}
static int spi_flash_erase_sector(struct spi_flash *flash, uint32_t addr)
{
/* 发送擦除命令 */
spi_flash_cmd_write_enable(flash);
spi_flash_cmd_addr(flash, addr, flash->cmd.erase);
spi_flash_cmd_wait_ready(flash);
return 0;
}
```
5. 在main函数中,需要初始化SPI总线以及Nor Flash设备,并进行读写操作。
```
int main(void)
{
/* 初始化SPI总线 */
spi_init();
/* 初始化Nor Flash设备 */
spi_flash_init();
/* 读取数据 */
spi_flash_read_data(FLASH_BASE_ADDR, buf, sizeof(buf));
/* 写入数据 */
spi_flash_write_data(FLASH_BASE_ADDR, buf, sizeof(buf));
/* 擦除扇区 */
spi_flash_erase_sector(FLASH_BASE_ADDR);
return 0;
}
```
以上就是Nor Flash读写的主要代码走读。在实际应用中,还需要根据具体的Nor Flash型号以及使用场景进行相应的优化和调整。
mt7981cpuuboot下norflash读写代码走读
MT7981 CPUUboot 是联发科技公司针对 MT7981 芯片开发的一个 bootloader,用于引导系统启动。该 bootloader 支持从 NOR Flash 中读取启动镜像。
在 MT7981 CPUUboot 中,NOR Flash 的读写操作主要通过 SPI 接口来实现。以下是大致的代码走读:
1. 首先,定义了 NOR Flash 的一些基本参数,如地址宽度、数据宽度、页大小等。
```c
#define NOR_FLASH_ADDR_WIDTH 24 /* 地址宽度为 24 位 */
#define NOR_FLASH_DATA_WIDTH 8 /* 数据宽度为 8 位 */
#define NOR_FLASH_PAGE_SIZE 256 /* 每页大小为 256 字节 */
```
2. 接着,定义了一些 SPI 操作函数,如 spi_init、spi_read、spi_write 等。这些函数用于初始化 SPI 接口和进行数据读写。
```c
void spi_init(void) {
/* 初始化 SPI 接口 */
/* ... */
}
void spi_read(uint32_t addr, uint8_t *data, uint32_t len) {
/* 从 addr 地址开始读取 len 字节的数据到 data 中 */
/* ... */
}
void spi_write(uint32_t addr, uint8_t *data, uint32_t len) {
/* 从 addr 地址开始写入 len 字节的数据,数据来源为 data */
/* ... */
}
```
3. 然后,定义了 NOR Flash 的一些操作函数,如 norflash_read、norflash_write 等。这些函数用于对 NOR Flash 进行读写操作。
```c
void norflash_read(uint32_t addr, uint8_t *data, uint32_t len) {
while (len > 0) {
uint32_t page_offset = addr % NOR_FLASH_PAGE_SIZE; /* 计算当前地址在页内的偏移量 */
uint32_t page_addr = addr - page_offset; /* 计算当前地址所在的页的起始地址 */
uint32_t read_len = MIN(len, NOR_FLASH_PAGE_SIZE - page_offset); /* 计算本次读取的字节数 */
spi_read(page_addr, data, read_len); /* 从 NOR Flash 中读取数据 */
addr += read_len;
data += read_len;
len -= read_len;
}
}
void norflash_write(uint32_t addr, uint8_t *data, uint32_t len) {
while (len > 0) {
uint32_t page_offset = addr % NOR_FLASH_PAGE_SIZE; /* 计算当前地址在页内的偏移量 */
uint32_t page_addr = addr - page_offset; /* 计算当前地址所在的页的起始地址 */
uint32_t write_len = MIN(len, NOR_FLASH_PAGE_SIZE - page_offset); /* 计算本次写入的字节数 */
spi_write(page_addr, data, write_len); /* 向 NOR Flash 中写入数据 */
addr += write_len;
data += write_len;
len -= write_len;
}
}
```
4. 最后,还定义了一些其他的辅助函数,如 norflash_erase、norflash_init 等。这些函数用于对 NOR Flash 进行擦除、初始化等操作。
```c
void norflash_erase(uint32_t addr, uint32_t len) {
/* 对从 addr 开始的 len 字节的数据进行擦除 */
/* ... */
}
void norflash_init(void) {
/* 初始化 NOR Flash */
/* ... */
}
```
以上是对 MT7981 CPUUboot 下 NOR Flash 读写代码的大致走读。在实际的使用中,还需要根据具体的硬件平台和 NOR Flash 型号进行适当的修改和调整。
阅读全文