CODE_LINUX_APP_NAND

主要用途:该模块实现了应用层对于NAND Flash操作的封装,能够实现对于NAND Flash的初始化、读写数据、擦除以及关闭设备等功能。

能力分类:嵌入式

应用领域:安防监控,电源电池,机器人,射频通信

交易方式: 定制

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

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

 模块描述

1.1  原理及方式

定义一个struct objStorage的结构来存储传入的参数设备文件描述符、以及读写数据缓存等信息,采用标准文件IO操作底层驱动实现NAND Flash的读写和擦除。

1.2  主要功能

该模块实现了应用层对于NAND Flash操作的封装,能够实现对于NAND Flash的初始化、读写数据、擦除以及关闭设备等功能。

 标准模块

 模块设计

结构体设计

Struct objStorage的结构来存储传入的参数设备文件描述符、以及读写数据缓存等信息

typedef  struct objStorage{

    dll_t   node;

    devClass    class;

    char name[32];

    int32 fd;//device fd

char *   buff;//buffer to read and write

int32  buffMaxLen;//the maximum buffer length

int32 buffRealLen;//the used buffer length

uint32 offset;//storage offset

uint32 bytes;//storage size

}objStorage;

 

 

 

主要函数说明

数据存储初始化函数

函数原型

objStorage * storage_init(char * name, int32 buffLen)

功能描述

初始化数据存储模块

输入参数

char *name:存储设备名称

int32 buffLen 设备缓冲区大小

 

输出参数

全局变量值的变化

返回值

NULL-失败;

存储设备指针-成功。

 

擦除FLASH函数

函数原型

STATUS storage_erase(objStorage * obj)

功能描述

擦除FLASH存储设备

输入参数

objStorage * obj存储设备指针,设置offset起始擦除地址,bytes擦除长度

输出参数

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

FLASH函数

函数原型

STATUS storage_write(objStorage * obj)

功能描述

FLASH缓冲数据写入存储设备

输入参数

objStorage * obj存储设备指针设置offset写入的地址,写入的数据放置在buff数据长度为buffRealLen

输出参数

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

FLASH函数

函数原型

STATUS storage_read(objStorage * obj)

功能描述

FLASH存储设备数据到缓冲区

输入参数

objStorage * obj存储设备指针读取起始地址offset数据长度为buffRealLen

输出参数

objStorage * obj存储设备指针,从FLASH读取的数据放置在buff

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

关闭FLASH函数

函数原型

STATUS storage_close(objStorage * obj)

功能描述

关闭FLASH存储设备

输入参数

objStorage * obj存储设备指针

输出参数

全局变量值的变化

返回值

OK-成功

ERROR-失败

 

类定义

应用举例

基于API实现能够读写擦除Nand Flash功能的测试程序

int storagetest(int argc, char *argv[])

{

int err = 0;

objStorage * pObjStorage = NULL;

FILE *fp;

int outfd  = -1;

char * filename;

u_int8_t *buff= NULL;

uint32 len =  0x20000 ;

 

enum {

OPT_READ,

OPT_WRITE,

OPT_ERASE

} option = OPT_READ;

 

/* open device */

 

if (NULL == (pObjStorage =  storage_init(“/dev/mtd4”, len) ))

OUT_MSG("init storage failed.\r\n");

 

switch (option) {

 

case OPT_READ:

outfd = creat(“1.txt”, 0666);

    if (outfd < 0) {

OUT_MSG(" creat() failed.\r\n");

return 1;

}

pObjStorage->offset = 0;

pObjStorage->buffRealLen =  len;

err = storage_read(pObjStorage);

if (OK != err)

{

OUT_MSG("read storage  failed.\r\n");

return 1;

}

 

err = write(outfd, pObjStorage->buff, len);

if (err < 0) {

OUT_MSG(" error:write, size %#x\n",  len);

return 1;

}

if (err != len) {

OUT_MSG( "Couldn't copy entire buffer to %s. (%d/%d bytes copied)\n", “1.txt”, err, len);

return 1;

}

close(outfd);

break;

case OPT_WRITE:

 

filename = “1.txt”;

if ((fp = fopen(filename, "r")) == NULL) {

OUT_MSG("fopen() failed.\r\n");

return 1;

}

if ((buff = (u_int8_t *) malloc(len)) == NULL) {

OUT_MSG( " malloc(%#x) failed\n",  len);

fclose(fp);

return 1;

}

if (fread(buff, len, 1, fp) != 1 || ferror(fp)) {

OUT_MSG(" error:fread, size %#x\n",  len);

free(buff);

fclose(fp);

return 1;

}

fclose(fp);

pObjStorage->offset = 0;

memcpy(pObjStorage->buff,buff, len);

pObjStorage->buffRealLen = len;

err = storage_write(pObjStorage);

if (OK != err)

{

OUT_MSG("read storage  failed.\r\n");

return 1;

}

break;

case OPT_ERASE:

OUT_MSG("erase...\r\n");

pObjStorage->offset = 0;

pObjStorage->bytes  = len;

err = storage_erase(pObjStorage);

if (OK != err)

{

OUT_MSG("erase storage  failed.\r\n");

return 1;

}

break;

default :

OUT_MSG("invalid  operation.\r\n");

}

 

/* close device */

err = storage_close(pObjStorage);

 

return err;

}

 

 

其他


总体评价

好评率:100%

好评数量:0

总体评分

工作速度:5分

工作质量:5分

工作态度:5分

暂无评价

企业其他能力

More>