通过向NAND FLASH寄存器的映射地址写入控制命令字的方式,实现NAND Flash的读写操作。
提供了NAND Flash的字、字节和块读写函数、FIFO队列进出操作函数、片选和Flash命令处理函数。
无
l 结构体设计
ZYNQ NAND Flash 寄存器描述结构体
struct zynq_nand_regs { u32 version; /* offset 00h */ u32 cs_n; /* offset 04h:two ce,bit 0~1,low level valid */ u32 cmd_reg1; /* offset 08h */ u32 addr_reg1; /* offset 0ch */ u32 addr_reg2; /* offset 10h */ u32 addr_reg3; /* offset 14h */ u32 addr_reg4; /* offset 18h */ u32 addr_reg5; /* offset 1ch */ u32 cmd_reg2; /* offset 20h */ u32 cmd1_flg; /* offset 24h */ u32 addr1_flg; /* offset 28h */ u32 addr2_flg; /* offset 2ch */ u32 addr3_flg; /* offset 30h */ u32 addr4_flg; /* offset 34h */ u32 addr5_flg; /* offset 38h */ u32 cmd2_flg; /* offset 3ch */ u32 start; /* offset 40h */ u32 data[ZYNQ_NAND_PAGA_SIZE]; /* offset 44~2140h */ u32 wdata_flg; /* offset 2144h */ u32 dly_cnt; /* offset 2148h */ u32 wdata_num; /* offset 214ch */ u32 rdata_num; /* offset 2150h */ u32 rdata_flg; /* offset 2154h */ u32 rdone; /* offset 2158h */ u32 ready; /* offset 215ch:1 ready, 0 busy */ }; |
ZYNQ NAND Flash FIFO队列结构体
typedef struct nand_rd_fifo{ u32 data[ZYNQ_NAND_PAGA_SIZE]; u32 count; }nand_rd_fifo_t; |
l 主要函数说明
函数原型 | static void init_fifo(void) |
功能描述 | 初始化NAND FIFO队列 |
输入参数 | 无 |
输出参数 | 无 |
全局变量值的变化 | nand_rd_fifo 数组清零 |
返回值 | 无 |
函数原型 | static int enter_fifo(u32 val) |
功能描述 | 将一个4字节数放入Flash FIFO缓冲区 |
输入参数 | u32 val,写入FIFO的数值
|
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | 0-成功 -EINVAL-失败 |
函数原型 | static int leave_fifo(void) |
功能描述 | 从FIFO缓冲区中的头部返回一个四字节数据 |
输入参数 | 无 |
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | FIFO缓冲区的第一个四字节数据 |
函数原型 | static void cp_rdbuff(u32 * addr) |
功能描述 | 从addr复制ZYNQ_NAND_PAGA_SIZE大小的数据到FIFO缓冲区 |
输入参数 | addr,源数据的地址 |
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | 无 |
函数原型 | static void zynq_select_chip(u32 * cs, int chipnr) |
功能描述 | 选择使用的Nand Flash芯片 |
输入参数 | u32 * cs:片选寄存器地址 int chipnr:芯片编号 |
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | 无 |
函数原型 | static void zynq_cmd_function(struct zynq_nand_regs *regs, unsigned int command,int column, int page_addr) |
功能描述 | 处理NAND FLASH的各种控制命令 |
输入参数 | struct zynq_nand_regs *regs:寄存器映射地址首地址 unsigned int command:NAND FLASH寄存器控制命令 int column:列号 int page_addr: 页面地址 |
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | 无 |
无
基于上述提供的API实现NAND FLASH的片选和读操作
int main() { struct zynq_nand_regs * regs = (struct zynq_nand_regs *)0x40000000; int maf_id = 0; int dev_id = 0; int i = 0; char id_data[8]={'\0'}; /* Select the device */ zynq_select_chip(®s->cs_n, 0);
/* * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx) * after power-up. */ zynq_cmd_function(regs, NAND_CMD_RESET, -1, -1);
/* Send the command for reading device ID */ zynq_cmd_function(regs, NAND_CMD_READID, 0x00, -1);
/* Read manufacturer and device IDs */ maf_id = zynq_read_byte(); dev_id = zynq_read_byte();
/* * Try again to make sure, as some systems the bus-hold or other * interface concerns can cause random data which looks like a * possibly credible NAND flash to appear. If the two results do * not match, ignore the device completely. */
zynq_cmd_function(regs, NAND_CMD_READID, 0x00, -1);
/* Read entire ID string */ for (i = 0; i < 8; i++) id_data[i] = zynq_read_byte(); printf("test0,%x,%x;%x %x %x %x %x\n",maf_id, dev_id,id_data[0],id_data[1],id_data[2],id_data[3],id_data[4]); } |
无
好评率:100%
好评数量:0个
工作速度:5分
工作质量:5分
工作态度:5分
暂无评价
CPU/GPU ¥12000.00
CPU/GPU ¥25000.00
CPU/GPU ¥10000.00
CPU/GPU ¥30000.00
CPU/GPU ¥10000.00
CPU/GPU ¥15000.00
CPU/GPU ¥10000.00
CPU/GPU ¥10000.00
其他 ¥5000.00
其他 ¥5000.00
其他 ¥10000.00
其他 ¥10000.00
其他 ¥10000.00
其他 ¥10000.00
其他 ¥10000.00
其他 ¥10000.00
FPGA电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
CPU/GPU ¥10000.00
FPGA电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
FPGA电路 ¥10000.00
DSP电路 ¥10000.00
CPU/GPU ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
CPU/GPU ¥10000.00
FPGA电路 ¥10000.00
FPGA电路 ¥10000.00
模拟电路 ¥10000.00
模拟电路 ¥5000.00
模拟电路 ¥5000.00
模拟电路 ¥5000.00
模拟电路 ¥10000.00
模拟电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
FPGA电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
DSP电路 ¥10000.00
CPU/GPU ¥20000.00
CPU/GPU ¥20000.00
CPU/GPU ¥20000.00
CPU/GPU ¥20000.00
CPU/GPU ¥15000.00
CPU/GPU ¥20000.00
CPU/GPU ¥18000.00
CPU/GPU ¥20000.00
其他 ¥10000.00
其他 ¥6000.00
其他 ¥2000.00
其他 ¥3000.00
其他 ¥12000.00
其他 ¥8000.00
FPGA电路 ¥5000.00
MCU电路 ¥4800.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
嵌入式 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
MCU电路 ¥50000.00
MCU电路 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥500000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00
其他 ¥50000.00