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

📄 common_util.c

📁 AT91RM9200的完整启动代码:包括loader, boot及U-boot三部分均已编译通过!欢迎下载使用!
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * (C) Copyright 2001 * Denis Peter, MPL AG Switzerland, d.peter@mpl.ch * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * */#include <common.h>#include <command.h>#include <video_fb.h>#include "common_util.h"#include <asm/processor.h>#include <asm/byteorder.h>#include <i2c.h>#include <devices.h>#include <pci.h>#ifdef CONFIG_PIP405#include "../pip405/pip405.h"#include <405gp_pci.h>#endif#ifdef CONFIG_MIP405#include "../mip405/mip405.h"#include <405gp_pci.h>#endifextern int  gunzip (void *, int, unsigned char *, int *);extern int mem_test(unsigned long start, unsigned long ramsize, int quiet);#define I2C_BACKUP_ADDR 0x7C00 /* 0x200 bytes for backup */#define IMAGE_SIZE 0x80000extern flash_info_t flash_info[];	/* info for FLASH chips */static image_header_t header;int mpl_prg(unsigned long src,unsigned long size){	unsigned long start;	flash_info_t *info;	int i,rc;#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)	char *copystr = (char *)src;	unsigned long *magic = (unsigned long *)src;#endif	info = &flash_info[0];#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)	if(ntohl(magic[0]) != IH_MAGIC) {		printf("Bad Magic number\n");		return -1;	}	/* some more checks before we delete the Flash... */	/* Checking the ISO_STRING prevents to program a	 * wrong Firmware Image into the flash.	 */	i=4; /* skip Magic number */	while(1) {		if(strncmp(&copystr[i],"MEV-",4)==0)			break;		if(i++>=0x100) {			printf("Firmware Image for unknown Target\n");			return -1;		}	}	/* we have the ISO STRING, check */	if(strncmp(&copystr[i],CONFIG_ISO_STRING,sizeof(CONFIG_ISO_STRING)-1)!=0) {		printf("Wrong Firmware Image: %s\n",&copystr[i]);		return -1;	}	start = 0 - size;	for(i=info->sector_count-1;i>0;i--)	{		info->protect[i] = 0; /* unprotect this sector */		if(start>=info->start[i])		break;	}	/* set-up flash location */	/* now erase flash */	printf("Erasing at %lx (sector %d) (start %lx)\n",				start,i,info->start[i]);	flash_erase (info, i, info->sector_count-1);#elif defined(CONFIG_VCMA9)	start = 0;	for (i = 0; i <info->sector_count; i++)	{		info->protect[i] = 0; /* unprotect this sector */		if (size < info->start[i])		    break;	}	/* set-up flash location */	/* now erase flash */	printf("Erasing at %lx (sector %d) (start %lx)\n",				start,0,info->start[0]);	flash_erase (info, 0, i);#endif	printf("flash erased, programming from 0x%lx 0x%lx Bytes\n",src,size);	if ((rc = flash_write ((uchar *)src, start, size)) != 0) {		puts ("ERROR ");		flash_perror (rc);		return (1);	}	puts ("OK programming done\n");	return 0;}int mpl_prg_image(unsigned long ld_addr){	unsigned long data,len,checksum;	image_header_t *hdr=&header;	/* Copy header so we can blank CRC field for re-calculation */	memcpy (&header, (char *)ld_addr, sizeof(image_header_t));	if (ntohl(hdr->ih_magic)  != IH_MAGIC) {		printf ("Bad Magic Number\n");		return 1;	}	print_image_hdr(hdr);	if (hdr->ih_os  != IH_OS_U_BOOT) {		printf ("No U-Boot Image\n");		return 1;	}	if (hdr->ih_type  != IH_TYPE_FIRMWARE) {		printf ("No Firmware Image\n");		return 1;	}	data = (ulong)&header;	len  = sizeof(image_header_t);	checksum = ntohl(hdr->ih_hcrc);	hdr->ih_hcrc = 0;	if (crc32 (0, (char *)data, len) != checksum) {		printf ("Bad Header Checksum\n");		return 1;	}	data = ld_addr + sizeof(image_header_t);	len  = ntohl(hdr->ih_size);	printf ("Verifying Checksum ... ");	if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {		printf ("Bad Data CRC\n");		return 1;	}	switch (hdr->ih_comp) {	case IH_COMP_NONE:		break;	case IH_COMP_GZIP:		printf ("  Uncompressing  ... ");		if (gunzip ((void *)(data+0x100000), 0x400000,			    (uchar *)data, (int *)&len) != 0) {			printf ("GUNZIP ERROR\n");			return 1;		}		data+=0x100000;		break;	default:		printf ("   Unimplemented compression type %d\n", hdr->ih_comp);		return 1;	}	printf ("  OK\n");	return(mpl_prg(data,len));}void get_backup_values(backup_t *buf){	i2c_read(CFG_DEF_EEPROM_ADDR, I2C_BACKUP_ADDR,2,(void *)buf,sizeof(backup_t));}void set_backup_values(int overwrite){	backup_t back;	int i;	get_backup_values(&back);	if(!overwrite) {		if(strncmp(back.signature,"MPL\0",4)==0) {			printf("Not possible to write Backup\n");			return;		}	}	memcpy(back.signature,"MPL\0",4);	i = getenv_r("serial#",back.serial_name,16);	if(i < 0) {		printf("Not possible to write Backup\n");		return;	}	back.serial_name[16]=0;	i = getenv_r("ethaddr",back.eth_addr,20);	if(i < 0) {		printf("Not possible to write Backup\n");		return;	}	back.eth_addr[20]=0;	i2c_write(CFG_DEF_EEPROM_ADDR, I2C_BACKUP_ADDR,2,(void *)&back,sizeof(backup_t));}void clear_env_values(void){	backup_t back;	unsigned char env_crc[4];	memset(&back,0xff,sizeof(backup_t));	memset(env_crc,0x00,4);	i2c_write(CFG_DEF_EEPROM_ADDR,I2C_BACKUP_ADDR,2,(void *)&back,sizeof(backup_t));	i2c_write(CFG_DEF_EEPROM_ADDR,CFG_ENV_OFFSET,2,(void *)env_crc,4);}/* * check crc of "older" environment */int check_env_old_size(ulong oldsize){	ulong crc, len, new;	unsigned off;	uchar buf[64];	/* read old CRC */	eeprom_read (CFG_DEF_EEPROM_ADDR,		     CFG_ENV_OFFSET,		     (uchar *)&crc, sizeof(ulong));	new = 0;	len = oldsize;	off = sizeof(long);	len = oldsize-off;	while (len > 0) {		int n = (len > sizeof(buf)) ? sizeof(buf) : len;		eeprom_read (CFG_DEF_EEPROM_ADDR, CFG_ENV_OFFSET+off, buf, n);		new = crc32 (new, buf, n);		len -= n;		off += n;	}	return (crc == new);}static ulong oldsizes[] = {	0x200,	0x800,	0};void copy_old_env(ulong size){	uchar name_buf[64];	uchar value_buf[0x800];	uchar c;	ulong len;	unsigned off;	uchar *name, *value;	name=&name_buf[0];	value=&value_buf[0];	len=size;	off = sizeof(long);	while (len > off) {		eeprom_read (CFG_DEF_EEPROM_ADDR, CFG_ENV_OFFSET+off, &c, 1);		if(c != '=') {			*name++=c;			off++;		}		else {			*name++='\0';			off++;			do {				eeprom_read (CFG_DEF_EEPROM_ADDR, CFG_ENV_OFFSET+off, &c, 1);				*value++=c;				off++;				if(c == '\0')					break;			} while(len > off);			name=&name_buf[0];			value=&value_buf[0];			if(strncmp(name,"baudrate",8)!=0) {				setenv(name,value);			}		}	}}void check_env(void){	unsigned char *s;	int i=0;	char buf[32];	backup_t back;	s=getenv("serial#");	if(!s) {		while(oldsizes[i]) {			if(check_env_old_size(oldsizes[i]))				break;			i++;		}		if(!oldsizes[i]) {			/* no old environment has been found */			get_backup_values (&back);			if (strncmp (back.signature, "MPL\0", 4) == 0) {				sprintf (buf, "%s", back.serial_name);				setenv ("serial#", buf);				sprintf (buf, "%s", back.eth_addr);				setenv ("ethaddr", buf);				printf ("INFO:  serial# and ethaddr recovered, use saveenv\n");				return;			}		}		else {			copy_old_env(oldsizes[i]);			printf ("INFO:  old environment ajusted, use saveenv\n");		}	}	else {		/* check if back up is set */		get_backup_values(&back);		if(strncmp(back.signature,"MPL\0",4)!=0) {			set_backup_values(0);		}	}}extern device_t *stdio_devices[];extern char *stdio_names[];void show_stdio_dev(void){	/* Print information */	printf ("In:    ");	if (stdio_devices[stdin] == NULL) {		printf ("No input devices available!\n");	} else {		printf ("%s\n", stdio_devices[stdin]->name);	}

⌨️ 快捷键说明

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