#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <linux/compiler.h>
#include <mtd/mtd-user.h>
int non_region_erase(int Fd, int start, int count, int unlock)
{
mtd_info_t meminfo;
if (ioctl(Fd,MEMGETINFO,&meminfo) == 0)
{
erase_info_t erase;
erase.start = start;
erase.length = meminfo.erasesize;
for (; count > 0; count--) {
printf("\rPerforming Flash Erase of length %u at offset 0x%x",
erase.length, erase.start);
fflush(stdout);
if(unlock != 0)
{
//Unlock the sector first.
printf("\rPerforming Flash unlock at offset 0x%x",erase.start);
if(ioctl(Fd, MEMUNLOCK, &erase) != 0)
{
perror("\nMTD Unlock failure");
close(Fd);
return 8;
}
}
if (ioctl(Fd,MEMERASE,&erase) != 0)
{
perror("\nMTD Erase failure");
close(Fd);
return 8;
}
erase.start += meminfo.erasesize;
}
printf(" done\n");
}
return 0;
}
int main(int argc, char *argv[])
{
int fd,ifd;
int i,j;
char *cmd;
char *img;
struct mtd_info_user info;
int regcount;
int res = 0,cnt,write_cnt;
int imglen,imglen1;
int readlen=0;
char *write_buf;
if(3>argc)
{
printf("You must specify a device!\n");
return 16;
}
cmd=argv[1];
if (argc > 3)
{
img=argv[3];
}
// Open and size the device
if ((fd = open(argv[2],O_RDWR)) < 0)
{
fprintf(stderr,"File open error\n");
return 8;
}
else
{
ioctl(fd,MEMGETINFO,&info);
printf("info.size=%d\n info.erasesize=%d\n info.writesize=%d\n info.oobsize=%d \n",info.size,info.erasesize,info.writesize,info.oobsize);
}
if (ioctl(fd,MEMGETREGIONCOUNT,®count) == 0)
{
printf("regcount=%d\n",regcount);
}
/*erase the device*/
if (strcmp(cmd, "erase") == 0)
{
if(regcount == 0)
{
res = non_region_erase(fd,0,(info.size/info.erasesize),0);
}
printf("erase!\n");
}
/*write file to this device*/
if (strcmp(cmd, "write") == 0)
{
printf("write!\n");
if((ifd=open(img,O_RDONLY))==-1)
{
printf("open input file error!\n");
return 9;
}
else
{
imglen=lseek(ifd,0,SEEK_END);
lseek(ifd,0,SEEK_SET);
printf("The input file image len is %d!\n",imglen);
}
readlen=info.writesize;
write_buf=malloc(readlen);
if(write_buf==NULL)
{
printf("can't allocate memory!\n");
return 10;
}
else
printf("Write buf is ok!\n");
imglen1=imglen;
while(imglen)
{
memset(write_buf,0xff,readlen);
if((cnt=read(ifd,write_buf,readlen))!=readlen)
{
if(cnt<readlen)
printf("the file is end!\n");
else
{
printf("File I/O error on input file");
return 11;
}
}
if((write_cnt=write(fd,write_buf,readlen))!=readlen)
{
printf("write mtd device error! startaddr=%d\n",(imglen1-imglen));
return 12;
}
else
printf("\rwrite mtd device ok!startaddr=%d",(imglen1-imglen));
imglen-=cnt;
}
printf("\n");
return 0;
}
if (strcmp(cmd, "read") == 0)
{
char *pReadBuf;
int ret,i;
int nReadBytes;
printf("read!\n");
nReadBytes = info.erasesize;
pReadBuf = malloc(nReadBytes);
if(pReadBuf==NULL)
{
printf("%s--no memory avaliable!\n",__FUNCTION__);
return -1;
}
memset(pReadBuf,0,nReadBytes);
ret = read(fd,pReadBuf,256);
printf("%s--read %d bytes from mtd\n",__FUNCTION__,ret);
for(i=0; i<ret; i++)
printf("%02x,",*(pReadBuf+i));
free(pReadBuf);
}
return 1;
}
|