From 71f9511803de65a3b98d2f592d418da1d1539f13 Mon Sep 17 00:00:00 2001 From: wdenk Date: Sun, 15 Jun 2003 22:40:42 +0000 Subject: * Fix CONFIG_NET_MULTI support in include/net.h * 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 --- common/Makefile | 5 +- common/cmd_fat.c | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/cmd_mem.c | 66 +++++++++++++--- common/cmd_mmc.c | 40 ++++++++++ common/command.c | 14 ++-- 5 files changed, 337 insertions(+), 19 deletions(-) create mode 100644 common/cmd_fat.c create mode 100644 common/cmd_mmc.c (limited to 'common') diff --git a/common/Makefile b/common/Makefile index 524e8e2134..d93dbb3f14 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 0000000000..4db70e1c1f --- /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 +#include +#include +#include +#include +#include +#include + +#if (CONFIG_COMMANDS & CFG_CMD_FAT) + +#undef DEBUG + +#include + +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 [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 d77b04728a..bbfe958482 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -30,6 +30,9 @@ #include #include #include +#if (CONFIG_COMMANDS & CFG_CMD_MMC) +#include +#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 0000000000..45b506416f --- /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 +#include + +#if (CONFIG_COMMANDS & CFG_CMD_MMC) + +#include + +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 d52ddf1c8f..842e784d6a 100644 --- a/common/command.c +++ b/common/command.c @@ -74,6 +74,8 @@ #include #include #include +#include +#include #ifdef CONFIG_AMIGAONEG3SE #include @@ -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 -- cgit v1.2.1