diff options
| author | wdenk <wdenk> | 2003-06-15 22:40:42 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2003-06-15 22:40:42 +0000 | 
| commit | 71f9511803de65a3b98d2f592d418da1d1539f13 (patch) | |
| tree | 4be38a22fc4f588a80aa8cc350ecd5617a211389 /common | |
| parent | 487778b781257831aa9b9140dd3c7ad4176e8314 (diff) | |
| download | olio-uboot-2014.01-71f9511803de65a3b98d2f592d418da1d1539f13.tar.xz olio-uboot-2014.01-71f9511803de65a3b98d2f592d418da1d1539f13.zip | |
* Fix CONFIG_NET_MULTI support in include/net.hLABEL_2003_06_16_0055
* Patches by Kyle Harris, 13 Mar 2003:
  - Add FAT partition support
  - Add command support for FAT
  - Add command support for MMC
  ----
  - Add Intel PXA support for video
  - Add Intel PXA support for MMC
  ----
  - Enable MMC and FAT for lubbock board
  - Other misc changes for lubbock board
Diffstat (limited to 'common')
| -rw-r--r-- | common/Makefile | 5 | ||||
| -rw-r--r-- | common/cmd_fat.c | 231 | ||||
| -rw-r--r-- | common/cmd_mem.c | 66 | ||||
| -rw-r--r-- | common/cmd_mmc.c | 40 | ||||
| -rw-r--r-- | common/command.c | 14 | 
5 files changed, 337 insertions, 19 deletions
| diff --git a/common/Makefile b/common/Makefile index 524e8e213..d93dbb3f1 100644 --- a/common/Makefile +++ b/common/Makefile @@ -31,10 +31,11 @@ COBJS	= main.o altera.o bedbug.o \  	  cmd_autoscript.o cmd_bedbug.o cmd_bmp.o cmd_boot.o \  	  cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o \  	  cmd_dcr.o cmd_diag.o cmd_doc.o cmd_nand.o cmd_dtt.o \ -	  cmd_eeprom.o cmd_elf.o cmd_fdc.o cmd_fdos.o cmd_flash.o \ +	  cmd_eeprom.o cmd_elf.o \ +	  cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o \  	  cmd_fpga.o cmd_i2c.o cmd_ide.o cmd_immap.o \  	  cmd_jffs2.o cmd_log.o cmd_mem.o cmd_mii.o cmd_misc.o \ -	  cmd_net.o cmd_nvedit.o env_common.o \ +	  cmd_mmc.o cmd_net.o cmd_nvedit.o env_common.o \  	  env_flash.o env_eeprom.o env_nvram.o env_nowhere.o \  	  cmd_pci.o cmd_pcmcia.o cmd_portio.o \  	  cmd_reginfo.o cmd_scsi.o cmd_vfd.o cmd_usb.o \ diff --git a/common/cmd_fat.c b/common/cmd_fat.c new file mode 100644 index 000000000..4db70e1c1 --- /dev/null +++ b/common/cmd_fat.c @@ -0,0 +1,231 @@ +/* + * (C) Copyright 2002 + * Richard Jones, rjones@nexus-tech.net + * + * 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 + */ + +/* + * Boot support + */ +#include <common.h> +#include <command.h> +#include <cmd_boot.h> +#include <cmd_autoscript.h> +#include <s_record.h> +#include <net.h> +#include <ata.h> + +#if (CONFIG_COMMANDS & CFG_CMD_FAT) + +#undef	DEBUG + +#include <fat.h> + +extern block_dev_desc_t *ide_get_dev (int dev); + +int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	long size; +	unsigned long offset; +	unsigned long count; + +	if (argc < 3) { +		printf ("usage:fatload <filename> <addr> [bytes]\n"); +		return (0); +	} + +	offset = simple_strtoul (argv[2], NULL, 16); +	if (argc == 4) +		count = simple_strtoul (argv[3], NULL, 16); +	else +		count = 0; + +	size = file_fat_read (argv[1], (unsigned char *) offset, count); + +	printf ("%ld bytes read\n", size); + +	return size; +} + +int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	char *filename = "/"; +	int ret; + +	if (argc == 2) +		ret = file_fat_ls (argv[1]); +	else +		ret = file_fat_ls (filename); + +	return (ret); +} + +int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	int ret; + +	ret = 0; + +	printf ("FAT info: %d\n", file_fat_detectfs ()); + +	return (ret); +} + +#ifdef NOT_IMPLEMENTED_YET +/* find first device whose first partition is a DOS filesystem */ +int find_fat_partition (void) +{ +	int i, j; +	block_dev_desc_t *dev_desc; +	unsigned char *part_table; +	unsigned char buffer[ATA_BLOCKSIZE]; + +	for (i = 0; i < CFG_IDE_MAXDEVICE; i++) { +		dev_desc = ide_get_dev (i); +		if (!dev_desc) { +			debug ("couldn't get ide device!\n"); +			return (-1); +		} +		if (dev_desc->part_type == PART_TYPE_DOS) { +			if (dev_desc-> +				block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) { +				debug ("can't perform block_read!\n"); +				return (-1); +			} +			part_table = &buffer[0x1be];	/* start with partition #4 */ +			for (j = 0; j < 4; j++) { +				if ((part_table[4] == 1 ||	/* 12-bit FAT */ +				     part_table[4] == 4 ||	/* 16-bit FAT */ +				     part_table[4] == 6) &&	/* > 32Meg part */ +				    part_table[0] == 0x80) {	/* bootable? */ +					curr_dev = i; +					part_offset = part_table[11]; +					part_offset <<= 8; +					part_offset |= part_table[10]; +					part_offset <<= 8; +					part_offset |= part_table[9]; +					part_offset <<= 8; +					part_offset |= part_table[8]; +					debug ("found partition start at %ld\n", part_offset); +					return (0); +				} +				part_table += 16; +			} +		} +	} + +	debug ("no valid devices found!\n"); +	return (-1); +} + +int +do_fat_dump (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]) +{ +	__u8 block[1024]; +	int ret; +	int bknum; + +	ret = 0; + +	if (argc != 2) { +		printf ("needs an argument!\n"); +		return (0); +	} + +	bknum = simple_strtoul (argv[1], NULL, 10); + +	if (disk_read (0, bknum, block) != 0) { +		printf ("Error: reading block\n"); +		return -1; +	} +	printf ("FAT dump: %d\n", bknum); +	hexdump (512, block); + +	return (ret); +} + +int disk_read (__u32 startblock, __u32 getsize, __u8 *bufptr) +{ +	ulong tot; +	block_dev_desc_t *dev_desc; + +	if (curr_dev < 0) { +		if (find_fat_partition () != 0) +			return (-1); +	} + +	dev_desc = ide_get_dev (curr_dev); +	if (!dev_desc) { +		debug ("couldn't get ide device\n"); +		return (-1); +	} + +	tot = dev_desc->block_read (0, startblock + part_offset, +				    getsize, (ulong *) bufptr); + +	/* should we do this here? +	   flush_cache ((ulong)buf, cnt*ide_dev_desc[device].blksz); +	 */ + +	if (tot == getsize) +		return (0); + +	debug ("unable to read from device!\n"); + +	return (-1); +} + + +static int isprint (unsigned char ch) +{ +	if (ch >= 32 && ch < 127) +		return (1); + +	return (0); +} + + +void hexdump (int cnt, unsigned char *data) +{ +	int i; +	int run; +	int offset; + +	offset = 0; +	while (cnt) { +		printf ("%04X : ", offset); +		if (cnt >= 16) +			run = 16; +		else +			run = cnt; +		cnt -= run; +		for (i = 0; i < run; i++) +			printf ("%02X ", (unsigned int) data[i]); +		printf (": "); +		for (i = 0; i < run; i++) +			printf ("%c", isprint (data[i]) ? data[i] : '.'); +		printf ("\n"); +		data = &data[16]; +		offset += run; +	} +} +#endif	/* NOT_IMPLEMENTED_YET */ + +#endif	/* CFG_CMD_FAT */ diff --git a/common/cmd_mem.c b/common/cmd_mem.c index d77b04728..bbfe95848 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -30,6 +30,9 @@  #include <common.h>  #include <command.h>  #include <cmd_mem.h> +#if (CONFIG_COMMANDS & CFG_CMD_MMC) +#include <mmc.h> +#endif  #if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\  			| CMD_CMD_PORTIO)) @@ -323,6 +326,46 @@ int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	}  #endif +#if (CONFIG_COMMANDS & CFG_CMD_MMC) +	if (mmc2info(dest)) { +		int rc; + +		printf ("Copy to MMC... "); +		switch (rc = mmc_write ((uchar *)addr, dest, count*size)) { +		case 0: +			printf ("\n"); +			return 1; +		case -1: +			printf("failed\n"); +			return 1; +		default: +			printf ("%s[%d] FIXME: rc=%d\n",__FILE__,__LINE__,rc); +			return 1; +		} +		puts ("done\n"); +		return 0; +	} + +	if (mmc2info(addr)) { +		int rc; + +		printf ("Copy from MMC... "); +		switch (rc = mmc_read (addr, (uchar *)dest, count*size)) { +		case 0: +			printf ("\n"); +			return 1; +		case -1: +			printf("failed\n"); +			return 1; +		default: +			printf ("%s[%d] FIXME: rc=%d\n",__FILE__,__LINE__,rc); +			return 1; +		} +		puts ("done\n"); +		return 0; +	} +#endif +  	while (count-- > 0) {  		if (size == 4)  			*((ulong  *)dest) = *((ulong  *)addr); @@ -820,30 +863,29 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[])  int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { -	ulong	addr, length; -	ulong	crc; -	ulong   *ptr; +	ulong addr, length; +	ulong crc; +	ulong *ptr;  	if (argc < 3) {  		printf ("Usage:\n%s\n", cmdtp->usage);  		return 1;  	} -	addr = simple_strtoul(argv[1], NULL, 16); +	addr = simple_strtoul (argv[1], NULL, 16);  	addr += base_address; -	length = simple_strtoul(argv[2], NULL, 16); +	length = simple_strtoul (argv[2], NULL, 16); -	crc = crc32 (0, (const uchar *)addr, length); +	crc = crc32 (0, (const uchar *) addr, length);  	printf ("CRC32 for %08lx ... %08lx ==> %08lx\n", -		addr, addr + length -1, crc); +			addr, addr + length - 1, crc); -	if (argc > 3) -	  { -	    ptr = (ulong *)simple_strtoul(argv[3], NULL, 16); -	    *ptr = crc; -	  } +	if (argc > 3) { +		ptr = (ulong *) simple_strtoul (argv[3], NULL, 16); +		*ptr = crc; +	}  	return 0;  } diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c new file mode 100644 index 000000000..45b506416 --- /dev/null +++ b/common/cmd_mmc.c @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2003 + * Kyle Harris, kharris@nexus-tech.net + * + * 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> + +#if (CONFIG_COMMANDS & CFG_CMD_MMC) + +#include <mmc.h> + +int do_mmc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	if (mmc_init (1) != 0) { +		printf ("No MMC card found\n"); +		return 1; +	} +	return 0; +} + +#endif	/* CFG_CMD_MMC */ diff --git a/common/command.c b/common/command.c index d52ddf1c8..842e784d6 100644 --- a/common/command.c +++ b/common/command.c @@ -74,6 +74,8 @@  #include <cmd_fdos.h>  #include <cmd_bmp.h>  #include <cmd_portio.h> +#include <cmd_mmc.h> +#include <cmd_fat.h>  #ifdef CONFIG_AMIGAONEG3SE  #include <cmd_menu.h> @@ -131,13 +133,14 @@ do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		if (i > 1)  			putc(' '); -		while ((c = *p++) != '\0') +		while ((c = *p++) != '\0') {  			if (c == '\\' && *p == 'c') {  				putnl = 0;  				p++; -			} -			else +			} else {  				putc(c); +			} +		}  	}  	if (putnl) @@ -190,8 +193,7 @@ do_help (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  			if (cmdtp->usage)  				puts (cmdtp->usage);  #endif	/* CFG_LONGHELP */ -		} -		else { +		} else {  			printf ("Unknown command '%s' - try 'help'"  				" without arguments for list of all"  				" known commands\n\n", @@ -263,6 +265,7 @@ cmd_tbl_t cmd_tbl[] = {  	CMD_TBL_DTT  	CMD_TBL_ECHO  	CMD_TBL_EEPROM +	CMD_TBL_FAT  	CMD_TBL_FCCINFO  	CMD_TBL_FLERASE  	CMD_TBL_FDC @@ -302,6 +305,7 @@ cmd_tbl_t cmd_tbl[] = {  	CMD_TBL_LOOP  	CMD_TBL_JFFS2_LS  	CMD_TBL_MCCINFO +	CMD_TBL_MMC  	CMD_TBL_MD  	CMD_TBL_MEMCINFO  #ifdef CONFIG_AMIGAONEG3SE |