CODE_LINUX_APP_TESTNAND

主要用途:提供了NAND Flash的字、字节和块读写函数、FIFO队列进出操作函数、片选和Flash命令处理函数。

能力分类:嵌入式

应用领域:安防监控,测试设备,机器人,健康医疗,智能家居

交易方式: 定制

参考价格:50000.00 小贴士:当前佣金是0%

好评率:100%| 综合评分:5.0| 已购买:0次
联系我 收藏店铺
分享: 

 模块描述

1.1  原理及方式

通过向NAND FLASH寄存器的映射地址入控制命令字的方式实现NAND Flash的读写操作

1.2  主要功能

提供了NAND Flash的字字节和块读写函数FIFO队列进出操作函数片选和Flash命令处理函数

 标准模块

 模块设计

结构体设计

 

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;

 

主要函数说明

Flash FIFO缓冲区初始化

函数原型

static void init_fifo(void)

功能描述

初始化NAND FIFO队列

输入参数

输出参数

全局变量值的变化

nand_rd_fifo 数组清零

返回值

 

将一个4字节数放入Flash FIFO缓冲区

函数原型

static int enter_fifo(u32 val)

功能描述

将一个4字节数放入Flash FIFO缓冲区

输入参数

u32 val写入FIFO的数值 

 

输出参数

全局变量值的变化

返回值

0-成功

-EINVAL-失败

 

FIFO缓冲区中的头部返回一个四字节数据

函数原型

static int leave_fifo(void)

功能描述

FIFO缓冲区中的头部返回一个四字节数据

输入参数

输出参数

全局变量值的变化

返回值

FIFO缓冲区的第一个四字节数据

 

复制ZYNQ_NAND_PAGA_SIZE的数据到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:芯片编号

输出参数

全局变量值的变化

返回值

NAND FLASH操作命令处理函数

函数原型

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 commandNAND 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分

暂无评价

企业其他能力

More>