定义一个struct objStorage的结构来存储传入的参数、设备文件描述符、以及读写数据缓存等信息,采用标准文件IO操作底层驱动实现NAND Flash的读写和擦除。
该模块实现了应用层对于NAND Flash操作的封装,能够实现对于NAND Flash的初始化、读写数据、擦除以及关闭设备等功能。
无
l 结构体设计
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;
|
l 主要函数说明
函数原型 | objStorage * storage_init(char * name, int32 buffLen) |
功能描述 | 初始化数据存储模块 |
输入参数 | char *name:存储设备名称; int32 buffLen: 设备缓冲区大小
|
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | NULL-失败; 存储设备指针-成功。 |
函数原型 | STATUS storage_erase(objStorage * obj) |
功能描述 | 擦除FLASH存储设备 |
输入参数 | objStorage * obj:存储设备指针,设置offset为起始擦除地址,bytes为擦除长度 |
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | OK-成功 ERROR-失败 |
函数原型 | STATUS storage_write(objStorage * obj) |
功能描述 | 将FLASH缓冲区数据写入存储设备 |
输入参数 | objStorage * obj:存储设备指针,设置offset为写入的地址,需写入的数据放置在buff,数据长度为buffRealLen |
输出参数 | 无 |
全局变量值的变化 | 无 |
返回值 | OK-成功 ERROR-失败 |
函数原型 | STATUS storage_read(objStorage * obj) |
功能描述 | 读FLASH存储设备数据到缓冲区 |
输入参数 | objStorage * obj:存储设备指针,读取起始地址为offset,数据长度为buffRealLen |
输出参数 | objStorage * obj:存储设备指针,从FLASH读取的数据将放置在buff |
全局变量值的变化 | 无 |
返回值 | OK-成功 ERROR-失败 |
函数原型 | 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分
暂无评价
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