⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 put.c

📁 三星2410-arm920t处理器在Linux环境下在用户层直接读写flash!
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
//#include <linux/ppcflash.h>
#include "ppcflash.h"
#include "iomap.h"
#define STEP 1	

char filename[SIZE][32]={"/etc/passwd","/etc/shadow","/etc/group","/etc/config/chat.ttyS1","/etc/config/dhcpd.leases"};
//char filename[10][32]={"/etc/config/dhcpd.leases","/etc/config/chat.ttyS1"};
int size=10;
long int getfilelength(char *fname){
	FILE *fp;
	long int i;
	int j;
	if((fp=fopen(fname,"r"))==NULL)
	{
		perror("open file fail");
		return 0;
	}
	fseek(fp,0L,2);
	i=ftell(fp);
	j=fclose(fp);
	return(i);
}
#if 0
int write_to_flash_con(char *filename,struct ioport_ioctl_request rq)
{
	int fd;
	FILE *fp=NULL;
	char *c;
	unsigned char *p;
	unsigned long i,j,len;
	unsigned char value_w,temp_w;
	i=0;
	if((fd=open(DEVICE_PPCFLASH,O_RDONLY | O_NONBLOCK))<0)
	{
		perror("can not open device");
		exit(1);
	}
	map_flag=0;
	if(iomap(fd,&rq))
	{
		printf("can't iomap\n");
		exit(1);
	}
	rq.count = rq.map_len;
	rq.offset = 0;
	c = malloc(sizeof(char)*rq.count);
	p=(unsigned char *)&len;
	len=getfilelength(filename);
	printf("len is %x\n",len);
	if(len>rq.count){
		printf("the file's len is too long\n");
		return 1;
	}
	for(i=0;i<32;i+=STEP){
		*(c +i) = *(unsigned char *)(filename+i); 
	}
	printf("it is %x --%x\n",*(unsigned char *)p,*(unsigned char *)(p+3));
	*(c +i)=*(unsigned char *)p;
	i++;
	*(c +i)=*(unsigned char *)(p+1);
	i++;
	*(c +i)=*(unsigned char *)(p+2);
	i++;
	*(c +i)=*(unsigned char *)(p+3);
	i++;
	if((fp=fopen(filename,"r"))==NULL){
		perror("open file err");
		return 1;
	}
	for(;;){
		j=fread(&value_w,sizeof(unsigned char),1,fp);
		//value_w = exchangew(value_w);
		if(j!=1){
			if(ferror(fp) != 0)
				printf("over or wrong\n");
			else{
				printf("\nFile write successfully!\n");
				printf("i is %d\n",i);
			}
			break;
		}
		//*(c +i)=*(unsigned short *)(&value_w);
		*(c +i)=(unsigned char )value_w;
		i+=STEP;
	}
	printf("i is %d\n",i);
	fclose(fp);
	rq.buff = c;
	iowrite(fd,&rq);
	unmap(fd,&rq);
	close(fd);
	return i;
}
#endif
int write_to_flash(char fname[][32],struct ioport_ioctl_request rq,int flag)
{
	int fd;
	FILE *fp=NULL;
	char *c;
	unsigned char *p;
	unsigned long i,j,len;
	unsigned long count,init;
	unsigned char value_w,temp_w;
	int size=10;
	for(i=0;i<2;i++)
		printf("name is %s\n",fname[i]);
	i=0;
	if((fd=open(DEVICE_PPCFLASH,O_RDONLY | O_NONBLOCK))<0)
	{
		perror("can not open device");
		exit(1);
	}
	map_flag=0;
	if(iomap(fd,&rq))
	{
		printf("can't iomap\n");
		exit(1);
	}
	rq.count = rq.map_len;
	rq.offset = 0;
	c = malloc(sizeof(char)*rq.count);

	p=(unsigned char *)&len;
#if 0
	printf("len is %ld\n",len);
	if(len>rq.count){
		printf("the file's len is too long\n");
		return 1;
	}
#endif
	init=0;
	size=2;
	i=0;
	for(count=0;count<size;count++){
		len=getfilelength(fname[count]);
		for(j=0;j<32;j+=STEP){
			*(c +i) = *(unsigned char *)(fname[count]+j); 
			i++;
		}
		printf("it is %x --%x\n",*(unsigned char *)p,*(unsigned char *)(p+3));
		*(c +i)=*(unsigned char *)p;
		i++;
		*(c +i)=*(unsigned char *)(p+1);
		i++;
		*(c +i)=*(unsigned char *)(p+2);
		i++;
		*(c +i)=*(unsigned char *)(p+3);
		i++;
		if((fp=fopen(fname[count],"r"))==NULL){
			
		//	printf()
			perror(fname[count]);
			exit(255);
		}
		printf("filename=%s,len=%d\n",fname[count],len);
		for(;;){
			j=fread(&value_w,sizeof(unsigned char),1,fp);
			//value_w = exchangew(value_w);
			if(j!=1){
				if(ferror(fp) != 0)
					printf("over or wrong\n");
				else{
					printf("\nFile write successfully!\n");
				//	printf("i is %d\n",i);
				}
				break;
			}
			//*(c +i)=*(unsigned short *)(&value_w);
			*(c +i)=(unsigned char )value_w;
			i+=STEP;
		}
		fclose(fp);
//		init=i;
	}
//	printf("i is %d\n",i);
	rq.buff = c;
	iowrite(fd,&rq,flag);
	unmap(fd,&rq);
	close(fd);
	return i;
}

int main()
{
	int fd;
	struct ioport_ioctl_request rq;
	unsigned char *p;
//	char filename[20][32];
	int base=0;
	int i=0;
	memset(&rq,0,sizeof(struct ioport_ioctl_request));
	rq.map_base = FLASH_PHY_ADDR;
	rq.map_len = FLASH_LENGTH;
	for(i=0;i<2;i++)
		printf("name is %s\n",filename[i]);
	for(i=0;i<32;i++)
		printf("%x ",filename[0][i]);
	printf("\n");
	for(i=0;i<32;i++)
		printf("%x ",filename[1][i]);
	//	sprintf(filename,"%s","/etc/config/diald.conf");
	base=write_to_flash(filename,rq,0);
#if 0
	printf("base is %x\n",base);

	rq.map_base +=base+1;
	printf("mapbase is %x\n",rq.map_base);
	sprintf(filename,"%s","/etc/config/chat.ttyS1");
	base=write_to_flash(filename,rq,1); //writhout erase flash
	printf("WIRTE SUCC!\n");
#endif
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -