diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/Makefile | 10 | ||||
| -rw-r--r-- | common/cmd_bdinfo.c | 2 | ||||
| -rw-r--r-- | common/cmd_boot.c | 4 | ||||
| -rw-r--r-- | common/cmd_bootldr.c | 21 | ||||
| -rw-r--r-- | common/cmd_bootm.c | 9 | ||||
| -rw-r--r-- | common/cmd_gpio.c | 89 | ||||
| -rw-r--r-- | common/cmd_i2c.c | 12 | ||||
| -rw-r--r-- | common/cmd_ide.c | 37 | ||||
| -rw-r--r-- | common/cmd_ldrinfo.c | 192 | ||||
| -rw-r--r-- | common/cmd_led.c | 153 | ||||
| -rw-r--r-- | common/cmd_md5sum.c | 53 | ||||
| -rw-r--r-- | common/cmd_mdio.c | 286 | ||||
| -rw-r--r-- | common/cmd_mem.c | 108 | ||||
| -rw-r--r-- | common/cmd_mmc.c | 3 | ||||
| -rw-r--r-- | common/cmd_mmc_spi.c | 89 | ||||
| -rw-r--r-- | common/cmd_nvedit.c | 215 | ||||
| -rw-r--r-- | common/cmd_sf.c | 111 | ||||
| -rw-r--r-- | common/cmd_sha1sum.c | 53 | ||||
| -rw-r--r-- | common/cmd_unzip.c | 59 | ||||
| -rw-r--r-- | common/cmd_usb.c | 2 | ||||
| -rw-r--r-- | common/ddr_spd.c | 2 | ||||
| -rw-r--r-- | common/env_mmc.c | 31 | ||||
| -rw-r--r-- | common/env_sf.c | 39 | ||||
| -rw-r--r-- | common/exports.c | 2 | ||||
| -rw-r--r-- | common/fdt_support.c | 4 | ||||
| -rw-r--r-- | common/image.c | 72 | ||||
| -rw-r--r-- | common/miiphyutil.c | 315 | ||||
| -rw-r--r-- | common/usb_storage.c | 27 |
28 files changed, 1577 insertions, 423 deletions
diff --git a/common/Makefile b/common/Makefile index 048df0cbc..f81cff93c 100644 --- a/common/Makefile +++ b/common/Makefile @@ -98,6 +98,7 @@ COBJS-$(CONFIG_CMD_FLASH) += cmd_flash.o ifdef CONFIG_FPGA COBJS-$(CONFIG_CMD_FPGA) += cmd_fpga.o endif +COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o COBJS-$(CONFIG_CMD_IDE) += cmd_ide.o COBJS-$(CONFIG_CMD_IMMAP) += cmd_immap.o @@ -105,18 +106,25 @@ COBJS-$(CONFIG_CMD_IRQ) += cmd_irq.o COBJS-$(CONFIG_CMD_ITEST) += cmd_itest.o COBJS-$(CONFIG_CMD_JFFS2) += cmd_jffs2.o COBJS-$(CONFIG_CMD_CRAMFS) += cmd_cramfs.o +COBJS-$(CONFIG_CMD_LDRINFO) += cmd_ldrinfo.o COBJS-$(CONFIG_CMD_LICENSE) += cmd_license.o COBJS-y += cmd_load.o COBJS-$(CONFIG_LOGBUFFER) += cmd_log.o COBJS-$(CONFIG_ID_EEPROM) += cmd_mac.o +COBJS-$(CONFIG_CMD_MD5SUM) += cmd_md5sum.o COBJS-$(CONFIG_CMD_MEMORY) += cmd_mem.o COBJS-$(CONFIG_CMD_MFSL) += cmd_mfsl.o COBJS-$(CONFIG_CMD_MG_DISK) += cmd_mgdisk.o COBJS-$(CONFIG_MII) += miiphyutil.o COBJS-$(CONFIG_CMD_MII) += miiphyutil.o +COBJS-$(CONFIG_PHYLIB) += miiphyutil.o COBJS-$(CONFIG_CMD_MII) += cmd_mii.o +ifdef CONFIG_PHYLIB +COBJS-$(CONFIG_CMD_MII) += cmd_mdio.o +endif COBJS-$(CONFIG_CMD_MISC) += cmd_misc.o COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o +COBJS-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o COBJS-$(CONFIG_MP) += cmd_mp.o COBJS-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o COBJS-$(CONFIG_CMD_NAND) += cmd_nand.o @@ -133,6 +141,7 @@ COBJS-$(CONFIG_CMD_REISER) += cmd_reiser.o COBJS-$(CONFIG_CMD_SATA) += cmd_sata.o COBJS-$(CONFIG_CMD_SF) += cmd_sf.o COBJS-$(CONFIG_CMD_SCSI) += cmd_scsi.o +COBJS-$(CONFIG_CMD_SHA1SUM) += cmd_sha1sum.o COBJS-$(CONFIG_CMD_SETEXPR) += cmd_setexpr.o COBJS-$(CONFIG_CMD_SPI) += cmd_spi.o COBJS-$(CONFIG_CMD_SPIBOOTLDR) += cmd_spibootldr.o @@ -143,6 +152,7 @@ COBJS-$(CONFIG_CMD_TSI148) += cmd_tsi148.o COBJS-$(CONFIG_CMD_UBI) += cmd_ubi.o COBJS-$(CONFIG_CMD_UBIFS) += cmd_ubifs.o COBJS-$(CONFIG_CMD_UNIVERSE) += cmd_universe.o +COBJS-$(CONFIG_CMD_UNZIP) += cmd_unzip.o ifdef CONFIG_CMD_USB COBJS-y += cmd_usb.o COBJS-y += usb.o diff --git a/common/cmd_bdinfo.c b/common/cmd_bdinfo.c index bba737460..1d76ffaa2 100644 --- a/common/cmd_bdinfo.c +++ b/common/cmd_bdinfo.c @@ -304,7 +304,7 @@ int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #elif defined(CONFIG_AVR32) -int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { bd_t *bd = gd->bd; diff --git a/common/cmd_boot.c b/common/cmd_boot.c index 7b603d350..0afd93964 100644 --- a/common/cmd_boot.c +++ b/common/cmd_boot.c @@ -28,6 +28,8 @@ #include <command.h> #include <net.h> +#ifdef CONFIG_CMD_GO + /* Allow ports to override the default behavior */ __attribute__((weak)) unsigned long do_go_exec (ulong (*entry)(int, char * const []), int argc, char * const argv[]) @@ -67,6 +69,8 @@ U_BOOT_CMD( " passing 'arg' as arguments" ); +#endif + U_BOOT_CMD( reset, 1, 0, do_reset, "Perform RESET of the CPU", diff --git a/common/cmd_bootldr.c b/common/cmd_bootldr.c index 535b931ff..bc5c1f95e 100644 --- a/common/cmd_bootldr.c +++ b/common/cmd_bootldr.c @@ -24,7 +24,7 @@ static bool ldr_valid_signature(uint8_t *data) #if defined(__ADSPBF561__) /* BF56x has a 4 byte global header */ - if (data[3] == 0xA0) + if (data[3] == (GFLAG_56X_SIGN_MAGIC << (GFLAG_56X_SIGN_SHIFT - 24))) return true; #elif defined(__ADSPBF531__) || defined(__ADSPBF532__) || defined(__ADSPBF533__) || \ @@ -53,11 +53,6 @@ static bool ldr_valid_signature(uint8_t *data) * LDRs from random memory addresses. So whenever possible, use that. In * the older cases (BF53x/BF561), parse the LDR format ourselves. */ -#define ZEROFILL 0x0001 -#define RESVECT 0x0002 -#define INIT 0x0008 -#define IGNORE 0x0010 -#define FINAL 0x8000 static void ldr_load(uint8_t *base_addr) { #if defined(__ADSPBF531__) || defined(__ADSPBF532__) || defined(__ADSPBF533__) || \ @@ -76,7 +71,7 @@ static void ldr_load(uint8_t *base_addr) # endif memmove(&flags, base_addr + 8, sizeof(flags)); - bfin_write_EVT1(flags & RESVECT ? 0xFFA00000 : 0xFFA08000); + bfin_write_EVT1(flags & BFLAG_53X_RESVECT ? 0xFFA00000 : 0xFFA08000); do { /* block header may not be aligned */ @@ -85,24 +80,24 @@ static void ldr_load(uint8_t *base_addr) memmove(&flags, base_addr+8, sizeof(flags)); base_addr += sizeof(addr) + sizeof(count) + sizeof(flags); - printf("loading to 0x%08x (0x%x bytes) flags: 0x%04x\n", + printf("loading to 0x%08x (%#x bytes) flags: 0x%04x\n", addr, count, flags); - if (!(flags & IGNORE)) { - if (flags & ZEROFILL) + if (!(flags & BFLAG_53X_IGNORE)) { + if (flags & BFLAG_53X_ZEROFILL) memset((void *)addr, 0x00, count); else memcpy((void *)addr, base_addr, count); - if (flags & INIT) { + if (flags & BFLAG_53X_INIT) { void (*init)(void) = (void *)addr; init(); } } - if (!(flags & ZEROFILL)) + if (!(flags & BFLAG_53X_ZEROFILL)) base_addr += count; - } while (!(flags & FINAL)); + } while (!(flags & BFLAG_53X_FINAL)); #endif } diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 18019d652..1966da48c 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -344,7 +344,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) switch (comp) { case IH_COMP_NONE: - if (load == blob_start) { + if (load == blob_start || load == image_start) { printf (" XIP %s ... ", type_name); } else { printf (" Loading %s ... ", type_name); @@ -544,11 +544,12 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv } break; #endif -#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_SYS_BOOTMAPSZ) +#if defined(CONFIG_OF_LIBFDT) case BOOTM_STATE_FDT: { - ulong bootmap_base = getenv_bootm_low(); - ret = boot_relocate_fdt(&images.lmb, bootmap_base, + boot_fdt_add_mem_rsv_regions(&images.lmb, + images.ft_addr); + ret = boot_relocate_fdt(&images.lmb, &images.ft_addr, &images.ft_len); break; } diff --git a/common/cmd_gpio.c b/common/cmd_gpio.c new file mode 100644 index 000000000..9cc790aba --- /dev/null +++ b/common/cmd_gpio.c @@ -0,0 +1,89 @@ +/* + * Control GPIO pins on the fly + * + * Copyright (c) 2008-2011 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include <common.h> +#include <command.h> + +#include <asm/gpio.h> + +#ifndef name_to_gpio +#define name_to_gpio(name) simple_strtoul(name, NULL, 10) +#endif + +enum gpio_cmd { + GPIO_INPUT, + GPIO_SET, + GPIO_CLEAR, + GPIO_TOGGLE, +}; + +static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int gpio; + enum gpio_cmd sub_cmd; + ulong value; + const char *str_cmd, *str_gpio; + +#ifdef gpio_status + if (argc == 2 && !strcmp(argv[1], "status")) { + gpio_status(); + return 0; + } +#endif + + if (argc != 3) + show_usage: + return cmd_usage(cmdtp); + str_cmd = argv[1]; + str_gpio = argv[2]; + + /* parse the behavior */ + switch (*str_cmd) { + case 'i': sub_cmd = GPIO_INPUT; break; + case 's': sub_cmd = GPIO_SET; break; + case 'c': sub_cmd = GPIO_CLEAR; break; + case 't': sub_cmd = GPIO_TOGGLE; break; + default: goto show_usage; + } + + /* turn the gpio name into a gpio number */ + gpio = name_to_gpio(str_gpio); + if (gpio < 0) + goto show_usage; + + /* grab the pin before we tweak it */ + if (gpio_request(gpio, "cmd_gpio")) { + printf("gpio: requesting pin %u failed\n", gpio); + return -1; + } + + /* finally, let's do it: set direction and exec command */ + if (sub_cmd == GPIO_INPUT) { + gpio_direction_input(gpio); + value = gpio_get_value(gpio); + } else { + switch (sub_cmd) { + case GPIO_SET: value = 1; break; + case GPIO_CLEAR: value = 0; break; + case GPIO_TOGGLE: value = !gpio_get_value(gpio); break; + default: goto show_usage; + } + gpio_direction_output(gpio, value); + } + printf("gpio: pin %s (gpio %i) value is %lu\n", + str_gpio, gpio, value); + + gpio_free(gpio); + + return value; +} + +U_BOOT_CMD(gpio, 3, 0, do_gpio, + "input/set/clear/toggle gpio pins", + "<input|set|clear|toggle> <pin>\n" + " - input/set/clear/toggle the specified pin"); diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index c272b0dd4..d913e1366 100644 --- a/common/cmd_i2c.c +++ b/common/cmd_i2c.c @@ -132,6 +132,14 @@ DECLARE_GLOBAL_DATA_PTR; #define DISP_LINE_LEN 16 +/* implement possible board specific board init */ +void __def_i2c_init_board(void) +{ + return; +} +void i2c_init_board(void) + __attribute__((weak, alias("__def_i2c_init_board"))); + /* TODO: Implement architecture-specific get/set functions */ unsigned int __def_i2c_get_bus_speed(void) { @@ -1541,6 +1549,8 @@ int i2x_mux_select_mux(int bus) mux = dev->mux; while (mux != NULL) { + /* do deblocking on each level of mux, before mux config */ + i2c_init_board(); if (i2c_write(mux->chip, 0, 0, &mux->channel, 1) != 0) { printf ("Error setting Mux: chip:%x channel: \ %x\n", mux->chip, mux->channel); @@ -1548,6 +1558,8 @@ int i2x_mux_select_mux(int bus) } mux = mux->next; } + /* do deblocking on each level of mux and after mux config */ + i2c_init_board(); return 0; } #endif /* CONFIG_I2C_MUX */ diff --git a/common/cmd_ide.c b/common/cmd_ide.c index a1f7e5715..21fe1eaba 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -160,7 +160,7 @@ static uchar ide_wait (int dev, ulong t); #define IDE_SPIN_UP_TIME_OUT 5000 /* 5 sec spin-up timeout */ static void input_data(int dev, ulong *sect_buf, int words); -static void output_data(int dev, ulong *sect_buf, int words); +static void output_data(int dev, const ulong *sect_buf, int words); static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len); #ifndef CONFIG_SYS_ATA_PORT_ADDR @@ -517,8 +517,20 @@ __ide_outb(int dev, int port, unsigned char val) { debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n", dev, port, val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); + +#if defined(CONFIG_IDE_AHB) + if (port) { + /* write command */ + ide_write_register(dev, port, val); + } else { + /* write data */ + outb(val, (ATA_CURR_BASE(dev))); + } +#else outb(val, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); +#endif } + void ide_outb (int dev, int port, unsigned char val) __attribute__((weak, alias("__ide_outb"))); @@ -526,7 +538,13 @@ unsigned char inline __ide_inb(int dev, int port) { uchar val; + +#if defined(CONFIG_IDE_AHB) + val = ide_read_register(dev, port); +#else val = inb((ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port))); +#endif + debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n", dev, port, (ATA_CURR_BASE(dev)+CONFIG_SYS_ATA_PORT_ADDR(port)), val); return val; @@ -695,6 +713,7 @@ void ide_init (void) ide_dev_desc[i].blksz=0; ide_dev_desc[i].lba=0; ide_dev_desc[i].block_read=ide_read; + ide_dev_desc[i].block_write = ide_write; if (!ide_bus_ok[IDE_BUS(i)]) continue; ide_led (led, 1); /* LED on */ @@ -856,7 +875,7 @@ input_swap_data(int dev, ulong *sect_buf, int words) #if defined(CONFIG_IDE_SWAP_IO) static void -output_data(int dev, ulong *sect_buf, int words) +output_data(int dev, const ulong *sect_buf, int words) { #if defined(CONFIG_CPC45) uchar *dbuf; @@ -900,9 +919,13 @@ output_data(int dev, ulong *sect_buf, int words) } #else /* ! CONFIG_IDE_SWAP_IO */ static void -output_data(int dev, ulong *sect_buf, int words) +output_data(int dev, const ulong *sect_buf, int words) { - outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words<<1); +#if defined(CONFIG_IDE_AHB) + ide_write_data(dev, sect_buf, words); +#else + outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1); +#endif } #endif /* CONFIG_IDE_SWAP_IO */ @@ -960,7 +983,11 @@ input_data(int dev, ulong *sect_buf, int words) static void input_data(int dev, ulong *sect_buf, int words) { +#if defined(CONFIG_IDE_AHB) + ide_read_data(dev, sect_buf, words); +#else insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1); +#endif } #endif /* CONFIG_IDE_SWAP_IO */ @@ -1321,7 +1348,7 @@ IDE_READ_E: /* ------------------------------------------------------------------------- */ -ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, void *buffer) +ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, const void *buffer) { ulong n = 0; unsigned char c; diff --git a/common/cmd_ldrinfo.c b/common/cmd_ldrinfo.c new file mode 100644 index 000000000..2aa56bdb6 --- /dev/null +++ b/common/cmd_ldrinfo.c @@ -0,0 +1,192 @@ +/* + * U-boot - ldrinfo + * + * Copyright (c) 2010 Analog Devices Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * Licensed under the GPL-2 or later. + */ + +#include <config.h> +#include <common.h> +#include <command.h> + +#include <asm/blackfin.h> +#include <asm/mach-common/bits/bootrom.h> + +static uint32_t ldrinfo_header(const void *addr) +{ + uint32_t skip = 0; + +#if defined(__ADSPBF561__) + /* BF56x has a 4 byte global header */ + uint32_t header, sign; + static const char * const spi_speed[] = { + "500K", "1M", "2M", "??", + }; + + memcpy(&header, addr, sizeof(header)); + + sign = (header & GFLAG_56X_SIGN_MASK) >> GFLAG_56X_SIGN_SHIFT; + printf("Header: %08X ( %s-bit-flash wait:%i hold:%i spi:%s %s)\n", + header, + (header & GFLAG_56X_16BIT_FLASH) ? "16" : "8", + (header & GFLAG_56X_WAIT_MASK) >> GFLAG_56X_WAIT_SHIFT, + (header & GFLAG_56X_HOLD_MASK) >> GFLAG_56X_HOLD_SHIFT, + spi_speed[(header & GFLAG_56X_SPI_MASK) >> GFLAG_56X_SPI_SHIFT], + sign == GFLAG_56X_SIGN_MAGIC ? "" : "!!hdrsign!! "); + + skip = 4; +#endif + + /* |Block @ 12345678: 12345678 12345678 12345678 12345678 | */ +#if defined(__ADSPBF531__) || defined(__ADSPBF532__) || defined(__ADSPBF533__) || \ + defined(__ADSPBF534__) || defined(__ADSPBF536__) || defined(__ADSPBF537__) || \ + defined(__ADSPBF538__) || defined(__ADSPBF539__) || defined(__ADSPBF561__) + printf(" Address Count Flags\n"); +#else + printf(" BCode Address Count Argument\n"); +#endif + + return skip; +} + +struct ldr_flag { + uint16_t flag; + const char *desc; +}; + +static uint32_t ldrinfo_block(const void *base_addr) +{ + uint32_t count; + + printf("Block @ %08X: ", (uint32_t)base_addr); + +#if defined(__ADSPBF531__) || defined(__ADSPBF532__) || defined(__ADSPBF533__) || \ + defined(__ADSPBF534__) || defined(__ADSPBF536__) || defined(__ADSPBF537__) || \ + defined(__ADSPBF538__) || defined(__ADSPBF539__) || defined(__ADSPBF561__) + + uint32_t addr, pval; + uint16_t flags; + int i; + static const struct ldr_flag ldr_flags[] = { + { BFLAG_53X_ZEROFILL, "zerofill" }, + { BFLAG_53X_RESVECT, "resvect" }, + { BFLAG_53X_INIT, "init" }, + { BFLAG_53X_IGNORE, "ignore" }, + { BFLAG_53X_COMPRESSED, "compressed"}, + { BFLAG_53X_FINAL, "final" }, + }; + + memcpy(&addr, base_addr, sizeof(addr)); + memcpy(&count, base_addr+4, sizeof(count)); + memcpy(&flags, base_addr+8, sizeof(flags)); + + printf("%08X %08X %04X ( ", addr, count, flags); + + for (i = 0; i < ARRAY_SIZE(ldr_flags); ++i) + if (flags & ldr_flags[i].flag) + printf("%s ", ldr_flags[i].desc); + + pval = (flags & BFLAG_53X_PFLAG_MASK) >> BFLAG_53X_PFLAG_SHIFT; + if (pval) + printf("gpio%i ", pval); + pval = (flags & BFLAG_53X_PPORT_MASK) >> BFLAG_53X_PPORT_SHIFT; + if (pval) + printf("port%c ", 'e' + pval); + + if (flags & BFLAG_53X_ZEROFILL) + count = 0; + if (flags & BFLAG_53X_FINAL) + count = 0; + else + count += sizeof(addr) + sizeof(count) + sizeof(flags); + +#else + + const uint8_t *raw8 = base_addr; + uint32_t bcode, addr, arg, sign, chk; + int i; + static const struct ldr_flag ldr_flags[] = { + { BFLAG_SAFE, "safe" }, + { BFLAG_AUX, "aux" }, + { BFLAG_FILL, "fill" }, + { BFLAG_QUICKBOOT, "quickboot" }, + { BFLAG_CALLBACK, "callback" }, + { BFLAG_INIT, "init" }, + { BFLAG_IGNORE, "ignore" }, + { BFLAG_INDIRECT, "indirect" }, + { BFLAG_FIRST, "first" }, + { BFLAG_FINAL, "final" }, + }; + + memcpy(&bcode, base_addr, sizeof(bcode)); + memcpy(&addr, base_addr+4, sizeof(addr)); + memcpy(&count, base_addr+8, sizeof(count)); + memcpy(&arg, base_addr+12, sizeof(arg)); + + printf("%08X %08X %08X %08X ( ", bcode, addr, count, arg); + + if (addr % 4) + printf("!!addralgn!! "); + if (count % 4) + printf("!!cntalgn!! "); + + sign = (bcode & BFLAG_HDRSIGN_MASK) >> BFLAG_HDRSIGN_SHIFT; + if (sign != BFLAG_HDRSIGN_MAGIC) + printf("!!hdrsign!! "); + + chk = 0; + for (i = 0; i < 16; ++i) + chk ^= raw8[i]; + if (chk) + printf("!!hdrchk!! "); + + printf("dma:%i ", bcode & BFLAG_DMACODE_MASK); + + for (i = 0; i < ARRAY_SIZE(ldr_flags); ++i) + if (bcode & ldr_flags[i].flag) + printf("%s ", ldr_flags[i].desc); + + if (bcode & BFLAG_FILL) + count = 0; + if (bcode & BFLAG_FINAL) + count = 0; + else + count += sizeof(bcode) + sizeof(addr) + sizeof(count) + sizeof(arg); + +#endif + + printf(")\n"); + + return count; +} + +static int do_ldrinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + const void *addr; + uint32_t skip; + + /* Get the address */ + if (argc < 2) + addr = (void *)load_addr; + else + addr = (void *)simple_strtoul(argv[1], NULL, 16); + + /* Walk the LDR */ + addr += ldrinfo_header(addr); + do { + skip = ldrinfo_block(addr); + addr += skip; + } while (skip); + + return 0; +} + +U_BOOT_CMD( + ldrinfo, 2, 0, do_ldrinfo, + "validate ldr image in memory", + "[addr]\n" +); diff --git a/common/cmd_led.c b/common/cmd_led.c new file mode 100644 index 000000000..f1e8a62cb --- /dev/null +++ b/common/cmd_led.c @@ -0,0 +1,153 @@ +/* + * (C) Copyright 2010 + * Jason Kridner <jkridner@beagleboard.org> + * + * Based on cmd_led.c patch from: + * http://www.mail-archive.com/u-boot@lists.denx.de/msg06873.html + * (C) Copyright 2008 + * Ulf Samuelsson <ulf.samuelsson@atmel.com> + * + * 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 <config.h> +#include <command.h> +#include <status_led.h> + +struct led_tbl_s { + char *string; /* String for use in the command */ + led_id_t mask; /* Mask used for calling __led_set() */ + void (*on)(void); /* Optional fucntion for turning LED on */ + void (*off)(void); /* Optional fucntion for turning LED on */ +}; + +typedef struct led_tbl_s led_tbl_t; + +static const led_tbl_t led_commands[] = { +#ifdef CONFIG_BOARD_SPECIFIC_LED +#ifdef STATUS_LED_BIT + { "0", STATUS_LED_BIT, NULL, NULL }, +#endif +#ifdef STATUS_LED_BIT1 + { "1", STATUS_LED_BIT1, NULL, NULL }, +#endif +#ifdef STATUS_LED_BIT2 + { "2", STATUS_LED_BIT2, NULL, NULL }, +#endif +#ifdef STATUS_LED_BIT3 + { "3", STATUS_LED_BIT3, NULL, NULL }, +#endif +#endif +#ifdef STATUS_LED_GREEN + { "green", STATUS_LED_GREEN, green_LED_off, green_LED_on }, +#endif +#ifdef STATUS_LED_YELLOW + { "yellow", STATUS_LED_YELLOW, yellow_LED_off, yellow_LED_on }, +#endif +#ifdef STATUS_LED_RED + { "red", STATUS_LED_RED, red_LED_off, red_LED_on }, +#endif +#ifdef STATUS_LED_BLUE + { "blue", STATUS_LED_BLUE, blue_LED_off, blue_LED_on }, +#endif + { NULL, 0, NULL, NULL } +}; + +int str_onoff (char *var) +{ + if (strcmp(var, "off") == 0) { + return 0; + } + if (strcmp(var, "on") == 0) { + return 1; + } + return -1; +} + +int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int state, i; + + /* Validate arguments */ + if ((argc != 3)) { + return cmd_usage(cmdtp); + } + + state = str_onoff(argv[2]); + if (state < 0) { + return cmd_usage(cmdtp); + } + + for (i = 0; led_commands[i].string; i++) { + if ((strcmp("all", argv[1]) == 0) || + (strcmp(led_commands[i].string, argv[1]) == 0)) { + if (led_commands[i].on) { + if (state) { + led_commands[i].on(); + } else { + led_commands[i].off(); + } + } else { + __led_set(led_commands[i].mask, state); + } + break; + } + } + + /* If we ran out of matches, print Usage */ + if (!led_commands[i].string && !(strcmp("all", argv[1]) == 0)) { + return cmd_usage(cmdtp); + } + + return 0; +} + +U_BOOT_CMD( + led, 3, 1, do_led, + "led\t- [" +#ifdef CONFIG_BOARD_SPECIFIC_LED +#ifdef STATUS_LED_BIT + "0|" +#endif +#ifdef STATUS_LED_BIT1 + "1|" +#endif +#ifdef STATUS_LED_BIT2 + "2|" +#endif +#ifdef STATUS_LED_BIT3 + "3|" +#endif +#endif +#ifdef STATUS_LED_GREEN + "green|" +#endif +#ifdef STATUS_LED_YELLOW + "yellow|" +#endif +#ifdef STATUS_LED_RED + "red|" +#endif +#ifdef STATUS_LED_BLUE + "blue|" +#endif + "all] [on|off]\n", + "led [led_name] [on|off] sets or clears led(s)\n" +); diff --git a/common/cmd_md5sum.c b/common/cmd_md5sum.c new file mode 100644 index 000000000..d6ebb802d --- /dev/null +++ b/common/cmd_md5sum.c @@ -0,0 +1,53 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 <u-boot/md5.h> + +static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + unsigned long addr, len; + unsigned int i; + u8 output[16]; + + if (argc < 3) + return cmd_usage(cmdtp); + + addr = simple_strtoul(argv[1], NULL, 16); + len = simple_strtoul(argv[2], NULL, 16); + + md5((unsigned char *) addr, len, output); + printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1); + for (i = 0; i < 16; i++) + printf("%02x", output[i]); + printf("\n"); + + return 0; +} + +U_BOOT_CMD( + md5sum, 3, 1, do_md5sum, + "compute MD5 message digest", + "address count" +); diff --git a/common/cmd_mdio.c b/common/cmd_mdio.c new file mode 100644 index 000000000..4ac9de4ac --- /dev/null +++ b/common/cmd_mdio.c @@ -0,0 +1,286 @@ +/* + * (C) Copyright 2011 Freescale Semiconductor, Inc + * Andy Fleming + * + * 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 + */ + +/* + * MDIO Commands + */ + +#include <common.h> +#include <command.h> +#include <miiphy.h> +#include <phy.h> + + +static char last_op[2]; +static uint last_data; +static uint last_addr_lo; +static uint last_addr_hi; +static uint last_devad_lo; +static uint last_devad_hi; +static uint last_reg_lo; +static uint last_reg_hi; + +static int extract_range(char *input, int *plo, int *phi) +{ + char *end; + *plo = simple_strtol(input, &end, 0); + if (end == input) + return -1; + + if ((*end == '-') && *(++end)) + *phi = simple_strtol(end, NULL, 0); + else if (*end == '\0') + *phi = *plo; + else + return -1; + + return 0; +} + +int mdio_write_ranges(struct mii_dev *bus, int addrlo, + int addrhi, int devadlo, int devadhi, + int reglo, int reghi, unsigned short data) +{ + int addr, devad, reg; + int err = 0; + + for (addr = addrlo; addr <= addrhi; addr++) { + for (devad = devadlo; devad <= devadhi; devad++) { + for (reg = reglo; reg <= reghi; reg++) { + err = bus->write(bus, addr, devad, reg, data); + + if (err) + goto err_out; + } + } + } + +err_out: + return err; +} + +int mdio_read_ranges(struct mii_dev *bus, int addrlo, + int addrhi, int devadlo, int devadhi, + int reglo, int reghi) +{ + int addr, devad, reg; + + printf("Reading from bus %s\n", bus->name); + for (addr = addrlo; addr <= addrhi; addr++) { + printf("PHY at address %d:\n", addr); + + for (devad = devadlo; devad <= devadhi; devad++) { + for (reg = reglo; reg <= reghi; reg++) { + int val; + + val = bus->read(bus, addr, devad, reg); + if (val < 0) { + printf("Error\n"); + + return val; + } + + if (devad >= 0) + printf("%d.", devad); + + printf("%d - 0x%x\n", reg, val & 0xffff); + } + } + } + + return 0; +} + +/* The register will be in the form [a[-b].]x[-y] */ +int extract_reg_range(char *input, int *devadlo, int *devadhi, + int *reglo, int *reghi) +{ + char *regstr; + + /* use strrchr to find the last string after a '.' */ + regstr = strrchr(input, '.'); + + /* If it exists, extract the devad(s) */ + if (regstr) { + char devadstr[32]; + + strncpy(devadstr, input, regstr - input); + devadstr[regstr - input] = '\0'; + + if (extract_range(devadstr, devadlo, devadhi)) + return -1; + + regstr++; + } else { + /* Otherwise, we have no devad, and we just got regs */ + *devadlo = *devadhi = MDIO_DEVAD_NONE; + + regstr = input; + } + + return extract_range(regstr, reglo, reghi); +} + +int extract_phy_range(char *const argv[], int argc, struct mii_dev **bus, + int *addrlo, int *addrhi) +{ + struct phy_device *phydev; + + if ((argc < 1) || (argc > 2)) + return -1; + + /* If there are two arguments, it's busname addr */ + if (argc == 2) { + *bus = miiphy_get_dev_by_name(argv[0]); + + if (!*bus) + return -1; + + return extract_range(argv[1], addrlo, addrhi); + } + + /* It must be one argument, here */ + + /* + * This argument can be one of two things: + * 1) Ethernet device name + * 2) Just an address (use the previously-used bus) + * + * We check all buses for a PHY which is connected to an ethernet + * device by the given name. If none are found, we call + * extract_range() on the string, and see if it's an address range. + */ + phydev = mdio_phydev_for_ethname(argv[0]); + + if (phydev) { + *addrlo = *addrhi = phydev->addr; + *bus = phydev->bus; + + return 0; + } + + /* It's an address or nothing useful */ + return extract_range(argv[0], addrlo, addrhi); +} + +/* ---------------------------------------------------------------- */ +static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + char op[2]; + int addrlo, addrhi, reglo, reghi, devadlo, devadhi; + unsigned short data; + int pos = argc - 1; + struct mii_dev *bus; + + if (argc < 2) + return cmd_usage(cmdtp); + + /* + * We use the last specified parameters, unless new ones are + * entered. + */ + op[0] = argv[1][0]; + addrlo = last_addr_lo; + addrhi = last_addr_hi; + devadlo = last_devad_lo; + devadhi = last_devad_hi; + reglo = last_reg_lo; + reghi = last_reg_hi; + data = last_data; + + bus = mdio_get_current_dev(); + + if (flag & CMD_FLAG_REPEAT) + op[0] = last_op[0]; + + switch (op[0]) { + case 'w': + if (pos > 1) + data = simple_strtoul(argv[pos--], NULL, 16); + case 'r': + if (pos > 1) + if (extract_reg_range(argv[pos--], &devadlo, &devadhi, + ®lo, ®hi)) + return -1; + + default: + if (pos > 1) + if (extract_phy_range(&(argv[2]), pos - 1, &bus, + &addrlo, &addrhi)) + return -1; + + break; + } + + if (op[0] == 'l') { + mdio_list_devices(); + + return 0; + } + + /* Save the chosen bus */ + miiphy_set_current_dev(bus->name); + + switch (op[0]) { + case 'w': + mdio_write_ranges(bus, addrlo, addrhi, devadlo, devadhi, + reglo, reghi, data); + break; + + case 'r': + mdio_read_ranges(bus, addrlo, addrhi, devadlo, devadhi, + reglo, reghi); + break; + } + + /* + * Save the parameters for repeats. + */ + last_op[0] = op[0]; + last_addr_lo = addrlo; + last_addr_hi = addrhi; + last_devad_lo = devadlo; + last_devad_hi = devadhi; + last_reg_lo = reglo; + last_reg_hi = reghi; + last_data = data; + + return 0; +} + +/***************************************************/ + +U_BOOT_CMD( + mdio, 6, 1, do_mdio, + "MDIO utility commands", + "list - List MDIO buses\n" + "mdio read <phydev> [<devad>.]<reg> - " + "read PHY's register at <devad>.<reg>\n" + "mdio write <phydev> [<devad>.]<reg> <data> - " + "write PHY's register at <devad>.<reg>\n" + "<phydev> may be:\n" + " <busname> <addr>\n" + " <addr>\n" + " <eth name>\n" + "<addr> <devad>, and <reg> may be ranges, e.g. 1-5.4-0x1f.\n" +); diff --git a/common/cmd_mem.c b/common/cmd_mem.c index 4b524cfc1..a5576aaab 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -34,9 +34,6 @@ #endif #include <watchdog.h> -#include <u-boot/md5.h> -#include <sha1.h> - #ifdef CMD_MEM_DEBUG #define PRINTF(fmt,args...) printf (fmt ,##args) #else @@ -1077,6 +1074,8 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) return 0; } +#ifdef CONFIG_CMD_CRC32 + #ifndef CONFIG_CRC32_VERIFY int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) @@ -1161,83 +1160,8 @@ usage: } #endif /* CONFIG_CRC32_VERIFY */ -#ifdef CONFIG_CMD_MD5SUM -int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - unsigned long addr, len; - unsigned int i; - u8 output[16]; - - if (argc < 3) - return cmd_usage(cmdtp); - - addr = simple_strtoul(argv[1], NULL, 16); - len = simple_strtoul(argv[2], NULL, 16); - - md5((unsigned char *) addr, len, output); - printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1); - for (i = 0; i < 16; i++) - printf("%02x", output[i]); - printf("\n"); - - return 0; -} #endif -#ifdef CONFIG_CMD_SHA1SUM -int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - unsigned long addr, len; - unsigned int i; - u8 output[20]; - - if (argc < 3) - return cmd_usage(cmdtp); - - addr = simple_strtoul(argv[1], NULL, 16); - len = simple_strtoul(argv[2], NULL, 16); - - sha1_csum((unsigned char *) addr, len, output); - printf("SHA1 for %08lx ... %08lx ==> ", addr, addr + len - 1); - for (i = 0; i < 20; i++) - printf("%02x", output[i]); - printf("\n"); - - return 0; -} -#endif - -#ifdef CONFIG_CMD_UNZIP -int do_unzip ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - unsigned long src, dst; - unsigned long src_len = ~0UL, dst_len = ~0UL; - char buf[32]; - - switch (argc) { - case 4: - dst_len = simple_strtoul(argv[3], NULL, 16); - /* fall through */ - case 3: - src = simple_strtoul(argv[1], NULL, 16); - dst = simple_strtoul(argv[2], NULL, 16); - break; - default: - return cmd_usage(cmdtp); - } - - if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0) - return 1; - - printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len); - sprintf(buf, "%lX", src_len); - setenv("filesize", buf); - - return 0; -} -#endif /* CONFIG_CMD_UNZIP */ - - /**************************************************/ U_BOOT_CMD( md, 3, 1, do_mem_md, @@ -1277,6 +1201,8 @@ U_BOOT_CMD( "[.b, .w, .l] addr1 addr2 count" ); +#ifdef CONFIG_CMD_CRC32 + #ifndef CONFIG_CRC32_VERIFY U_BOOT_CMD( @@ -1296,6 +1222,8 @@ U_BOOT_CMD( #endif /* CONFIG_CRC32_VERIFY */ +#endif + U_BOOT_CMD( base, 2, 1, do_mem_base, "print or set address offset", @@ -1336,27 +1264,3 @@ U_BOOT_CMD( "[.b, .w, .l] address value delay(ms)" ); #endif /* CONFIG_MX_CYCLIC */ - -#ifdef CONFIG_CMD_MD5SUM -U_BOOT_CMD( - md5sum, 3, 1, do_md5sum, - "compute MD5 message digest", - "address count" -); -#endif - -#ifdef CONFIG_CMD_SHA1SUM -U_BOOT_CMD( - sha1sum, 3, 1, do_sha1sum, - "compute SHA1 message digest", - "address count" -); -#endif /* CONFIG_CMD_SHA1SUM */ - -#ifdef CONFIG_CMD_UNZIP -U_BOOT_CMD( - unzip, 4, 1, do_unzip, - "unzip a memory region", - "srcaddr dstaddr [dstsize]" -); -#endif /* CONFIG_CMD_UNZIP */ diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index 4323f76b3..6166749ad 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -104,7 +104,8 @@ static void print_mmcinfo(struct mmc *mmc) (mmc->version >> 4) & 0xf, mmc->version & 0xf); printf("High Capacity: %s\n", mmc->high_capacity ? "Yes" : "No"); - printf("Capacity: %lld\n", mmc->capacity); + puts("Capacity: "); + print_size(mmc->capacity, "\n"); printf("Bus Width: %d-bit\n", mmc->bus_width); } diff --git a/common/cmd_mmc_spi.c b/common/cmd_mmc_spi.c new file mode 100644 index 000000000..cfd0fb113 --- /dev/null +++ b/common/cmd_mmc_spi.c @@ -0,0 +1,89 @@ +/* + * Command for mmc_spi setup. + * + * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> + * Licensed under the GPL-2 or later. + */ + +#include <common.h> +#include <mmc.h> +#include <spi.h> + +#ifndef CONFIG_MMC_SPI_BUS +# define CONFIG_MMC_SPI_BUS 0 +#endif +#ifndef CONFIG_MMC_SPI_CS +# define CONFIG_MMC_SPI_CS 1 +#endif +/* in SPI mode, MMC speed limit is 20MHz, while SD speed limit is 25MHz */ +#ifndef CONFIG_MMC_SPI_SPEED +# define CONFIG_MMC_SPI_SPEED 25000000 +#endif +/* MMC and SD specs only seem to care that sampling is on the + * rising edge ... meaning SPI modes 0 or 3. So either SPI mode + * should be legit. We'll use mode 0 since the steady state is 0, + * which is appropriate for hotplugging, unless the platform data + * specify mode 3 (if hardware is not compatible to mode 0). + */ +#ifndef CONFIG_MMC_SPI_MODE +# define CONFIG_MMC_SPI_MODE SPI_MODE_0 +#endif + +static int do_mmc_spi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + uint bus = CONFIG_MMC_SPI_BUS; + uint cs = CONFIG_MMC_SPI_CS; + uint speed = CONFIG_MMC_SPI_SPEED; + uint mode = CONFIG_MMC_SPI_MODE; + char *endp; + struct mmc *mmc; + + if (argc < 2) + goto usage; + + cs = simple_strtoul(argv[1], &endp, 0); + if (*argv[1] == 0 || (*endp != 0 && *endp != ':')) + goto usage; + if (*endp == ':') { + if (endp[1] == 0) + goto usage; + bus = cs; + cs = simple_strtoul(endp + 1, &endp, 0); + if (*endp != 0) + goto usage; + } + if (argc >= 3) { + speed = simple_strtoul(argv[2], &endp, 0); + if (*argv[2] == 0 || *endp != 0) + goto usage; + } + if (argc >= 4) { + mode = simple_strtoul(argv[3], &endp, 16); + if (*argv[3] == 0 || *endp != 0) + goto usage; + } + if (!spi_cs_is_valid(bus, cs)) { + printf("Invalid SPI bus %u cs %u\n", bus, cs); + return 1; + } + + mmc = mmc_spi_init(bus, cs, speed, mode); + if (!mmc) { + printf("Failed to create MMC Device\n"); + return 1; + } + printf("%s: %d at %u:%u hz %u mode %u\n", mmc->name, mmc->block_dev.dev, + bus, cs, speed, mode); + mmc_init(mmc); + return 0; + +usage: + cmd_usage(cmdtp); + return 1; +} + +U_BOOT_CMD( + mmc_spi, 4, 0, do_mmc_spi, + "mmc_spi setup", + "[bus:]cs [hz] [mode] - setup mmc_spi device" +); diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index fb69c242f..aa9de3a4e 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -4,7 +4,9 @@ * * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> * Andreas Heppel <aheppel@sysgo.de> - + * + * Copyright 2011 Freescale Semiconductor, Inc. + * * See file CREDITS for list of people who contributed to this * project. * @@ -54,18 +56,18 @@ DECLARE_GLOBAL_DATA_PTR; -#if !defined(CONFIG_ENV_IS_IN_EEPROM) && \ - !defined(CONFIG_ENV_IS_IN_FLASH) && \ - !defined(CONFIG_ENV_IS_IN_DATAFLASH) && \ - !defined(CONFIG_ENV_IS_IN_MG_DISK) && \ - !defined(CONFIG_ENV_IS_IN_MMC) && \ - !defined(CONFIG_ENV_IS_IN_NAND) && \ - !defined(CONFIG_ENV_IS_IN_NVRAM) && \ - !defined(CONFIG_ENV_IS_IN_ONENAND) && \ - !defined(CONFIG_ENV_IS_IN_SPI_FLASH) && \ - !defined(CONFIG_ENV_IS_NOWHERE) +#if !defined(CONFIG_ENV_IS_IN_EEPROM) && \ + !defined(CONFIG_ENV_IS_IN_FLASH) && \ + !defined(CONFIG_ENV_IS_IN_DATAFLASH) && \ + !defined(CONFIG_ENV_IS_IN_MG_DISK) && \ + !defined(CONFIG_ENV_IS_IN_MMC) && \ + !defined(CONFIG_ENV_IS_IN_NAND) && \ + !defined(CONFIG_ENV_IS_IN_NVRAM) && \ + !defined(CONFIG_ENV_IS_IN_ONENAND) && \ + !defined(CONFIG_ENV_IS_IN_SPI_FLASH) && \ + !defined(CONFIG_ENV_IS_NOWHERE) # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\ -SPI_FLASH|MG_DISK|NVRAM|MMC|NOWHERE} +SPI_FLASH|MG_DISK|NVRAM|MMC} or CONFIG_ENV_IS_NOWHERE #endif #define XMK_STR(x) #x @@ -93,7 +95,7 @@ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE; */ static int env_id = 1; -int get_env_id (void) +int get_env_id(void) { return env_id; } @@ -116,7 +118,7 @@ static int env_print(char *name) hsearch_r(e, FIND, &ep, &env_htab); if (ep == NULL) return 0; - len = printf ("%s=%s\n", ep->key, ep->data); + len = printf("%s=%s\n", ep->key, ep->data); return len; } @@ -160,6 +162,37 @@ int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return rcode; } +#ifdef CONFIG_CMD_GREPENV +static int do_env_grep (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + ENTRY *match; + unsigned char matched[env_htab.size / 8]; + int rcode = 1, arg = 1, idx; + + if (argc < 2) + return cmd_usage(cmdtp); + + memset(matched, 0, env_htab.size / 8); + + while (arg <= argc) { + idx = 0; + while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) { + if (!(matched[idx / 8] & (1 << (idx & 7)))) { + puts(match->key); + puts("="); + puts(match->data); + puts("\n"); + } + matched[idx / 8] |= 1 << (idx & 7); + rcode = 0; + } + arg++; + } + + return rcode; +} +#endif + /* * Set a new environment variable, * or replace or delete an existing one. @@ -176,7 +209,7 @@ int _do_env_set (int flag, int argc, char * const argv[]) name = argv[1]; if (strchr(name, '=')) { - printf ("## Error: illegal character '=' in variable name \"%s\"\n", name); + printf("## Error: illegal character '=' in variable name \"%s\"\n", name); return 1; } @@ -189,13 +222,12 @@ int _do_env_set (int flag, int argc, char * const argv[]) hsearch_r(e, FIND, &ep, &env_htab); /* Check for console redirection */ - if (strcmp(name,"stdin") == 0) { + if (strcmp(name, "stdin") == 0) console = stdin; - } else if (strcmp(name,"stdout") == 0) { + else if (strcmp(name, "stdout") == 0) console = stdout; - } else if (strcmp(name,"stderr") == 0) { + else if (strcmp(name, "stderr") == 0) console = stderr; - } if (console != -1) { if (argc < 3) { /* Cannot delete it! */ @@ -209,11 +241,11 @@ int _do_env_set (int flag, int argc, char * const argv[]) return i; #else /* Try assigning specified device */ - if (console_assign (console, argv[2]) < 0) + if (console_assign(console, argv[2]) < 0) return 1; #ifdef CONFIG_SERIAL_MULTI - if (serial_assign (argv[2]) < 0) + if (serial_assign(argv[2]) < 0) return 1; #endif #endif /* CONFIG_CONSOLE_MUX */ @@ -225,28 +257,28 @@ int _do_env_set (int flag, int argc, char * const argv[]) */ if (ep) { /* variable exists */ #ifndef CONFIG_ENV_OVERWRITE - if ((strcmp (name, "serial#") == 0) || - ((strcmp (name, "ethaddr") == 0) + if ((strcmp(name, "serial#") == 0) || + ((strcmp(name, "ethaddr") == 0) #if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR) - && (strcmp (ep->data,MK_STR(CONFIG_ETHADDR)) != 0) + && (strcmp(ep->data, MK_STR(CONFIG_ETHADDR)) != 0) #endif /* CONFIG_OVERWRITE_ETHADDR_ONCE && CONFIG_ETHADDR */ ) ) { - printf ("Can't overwrite \"%s\"\n", name); + printf("Can't overwrite \"%s\"\n", name); return 1; } #endif /* * Switch to new baudrate if new baudrate is supported */ - if (strcmp(name,"baudrate") == 0) { + if (strcmp(name, "baudrate") == 0) { int baudrate = simple_strtoul(argv[2], NULL, 10); int i; - for (i=0; i<N_BAUDRATES; ++i) { + for (i = 0; i < N_BAUDRATES; ++i) { if (baudrate == baudrate_table[i]) break; } if (i == N_BAUDRATES) { - printf ("## Baudrate %d bps not supported\n", + printf("## Baudrate %d bps not supported\n", baudrate); return 1; } @@ -258,11 +290,11 @@ int _do_env_set (int flag, int argc, char * const argv[]) gd->bd->bi_baudrate = baudrate; #endif - serial_setbrg (); + serial_setbrg(); udelay(50000); for (;;) { if (getc() == '\r') - break; + break; } } } @@ -276,14 +308,15 @@ int _do_env_set (int flag, int argc, char * const argv[]) /* * Insert / replace new value */ - for (i=2,len=0; i<argc; ++i) { + for (i = 2, len = 0; i < argc; ++i) len += strlen(argv[i]) + 1; - } - if ((value = malloc(len)) == NULL) { + + value = malloc(len); + if (value == NULL) { printf("## Can't malloc %d bytes\n", len); return 1; } - for (i=2,s=value; i<argc; ++i) { + for (i = 2, s = value; i < argc; ++i) { char *v = argv[i]; while ((*s++ = *v++) != '\0') @@ -308,12 +341,12 @@ int _do_env_set (int flag, int argc, char * const argv[]) * entry in the environment is changed */ - if (strcmp(name,"ipaddr") == 0) { + if (strcmp(name, "ipaddr") == 0) { char *s = argv[2]; /* always use only one arg */ char *e; unsigned long addr; bd->bi_ip_addr = 0; - for (addr=0, i=0; i<4; ++i) { + for (addr = 0, i = 0; i < 4; ++i) { ulong val = s ? simple_strtoul(s, &e, 10) : 0; addr <<= 8; addr |= (val & 0xFF); @@ -321,20 +354,20 @@ int _do_env_set (int flag, int argc, char * const argv[]) } bd->bi_ip_addr = htonl(addr); return 0; - } else if (strcmp(argv[1],"loadaddr") == 0) { + } else if (strcmp(argv[1], "loadaddr") == 0) { load_addr = simple_strtoul(argv[2], NULL, 16); return 0; } #if defined(CONFIG_CMD_NET) - else if (strcmp(argv[1],"bootfile") == 0) { - copy_filename (BootFile, argv[2], sizeof(BootFile)); + else if (strcmp(argv[1], "bootfile") == 0) { + copy_filename(BootFile, argv[2], sizeof(BootFile)); return 0; } #endif return 0; } -int setenv (char *varname, char *varvalue) +int setenv(char *varname, char *varvalue) { char * const argv[4] = { "setenv", varname, varvalue, NULL }; if ((varvalue == NULL) || (varvalue[0] == '\0')) @@ -343,7 +376,7 @@ int setenv (char *varname, char *varvalue) return _do_env_set(0, 3, argv); } -int do_env_set (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (argc < 2) return cmd_usage(cmdtp); @@ -355,7 +388,7 @@ int do_env_set (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * Prompt for environment variable */ #if defined(CONFIG_CMD_ASKENV) -int do_env_ask ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { extern char console_buffer[CONFIG_SYS_CBSIZE]; char message[CONFIG_SYS_CBSIZE]; @@ -383,10 +416,10 @@ int do_env_ask ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) break; default: /* env_ask envname message1 ... messagen size */ - for (i=2,pos=0; i < argc - 1; i++) { - if (pos) { + for (i = 2, pos = 0; i < argc - 1; i++) { + if (pos) message[pos++] = ' '; - } + strcpy(message+pos, argv[i]); pos += strlen(argv[i]); } @@ -449,7 +482,7 @@ int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * return address of storage for that variable, * or NULL if not found */ -char *getenv (char *name) +char *getenv(char *name) { if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */ ENTRY e, *ep; @@ -460,7 +493,7 @@ char *getenv (char *name) e.data = NULL; hsearch_r(e, FIND, &ep, &env_htab); - return (ep ? ep->data : NULL); + return ep ? ep->data : NULL; } /* restricted capabilities before import */ @@ -474,23 +507,24 @@ char *getenv (char *name) /* * Look up variable from environment for restricted C runtime env. */ -int getenv_f (char *name, char *buf, unsigned len) +int getenv_f(char *name, char *buf, unsigned len) { int i, nxt; - for (i=0; env_get_char(i) != '\0'; i=nxt+1) { + for (i = 0; env_get_char(i) != '\0'; i = nxt+1) { int val, n; - for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) { - if (nxt >= CONFIG_ENV_SIZE) { - return (-1); - } + for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) { + if (nxt >= CONFIG_ENV_SIZE) + return -1; } - if ((val=envmatch((uchar *)name, i)) < 0) + + val = envmatch((uchar *)name, i); + if (val < 0) continue; /* found; copy out */ - for (n=0; n<len; ++n, ++buf) { + for (n = 0; n < len; ++n, ++buf) { if ((*buf = env_get_char(val++)) == '\0') return n; } @@ -502,18 +536,18 @@ int getenv_f (char *name, char *buf, unsigned len) return n; } - return (-1); + return -1; } #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) -int do_env_save (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - extern char * env_name_spec; + extern char *env_name_spec; - printf ("Saving Environment to %s...\n", env_name_spec); + printf("Saving Environment to %s...\n", env_name_spec); - return (saveenv() ? 1 : 0); + return saveenv() ? 1 : 0; } U_BOOT_CMD( @@ -533,32 +567,32 @@ U_BOOT_CMD( * If the names match, return the index for the value2, else NULL. */ -int envmatch (uchar *s1, int i2) +int envmatch(uchar *s1, int i2) { - while (*s1 == env_get_char(i2++)) if (*s1++ == '=') - return(i2); + return i2; if (*s1 == '\0' && env_get_char(i2-1) == '=') - return(i2); - return(-1); + return i2; + return -1; } -static int do_env_default(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +static int do_env_default(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - if ((argc != 2) || (strcmp(argv[1], "-f") != 0)) { + if ((argc != 2) || (strcmp(argv[1], "-f") != 0)) return cmd_usage(cmdtp); - } + set_default_env("## Resetting to default environment\n"); return 0; } -static int do_env_delete(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +static int do_env_delete(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { printf("Not implemented yet\n"); return 0; } +#ifdef CONFIG_CMD_EXPORTENV /* * env export [-t | -b | -c] addr [size] * -t: export as text format; if size is given, data will be @@ -639,9 +673,8 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv } } - if (argc < 1) { + if (argc < 1) return cmd_usage(cmdtp); - } addr = (char *)simple_strtoul(argv[0], NULL, 16); @@ -659,7 +692,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv errno); return 1; } - sprintf(buf, "%zX", len); + sprintf(buf, "%zX", (size_t)len); setenv("filesize", buf); return 0; @@ -685,7 +718,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv envp->flags = ACTIVE_FLAG; #endif } - sprintf(buf, "%zX", len + offsetof(env_t,data)); + sprintf(buf, "%zX", (size_t)(len + offsetof(env_t, data))); setenv("filesize", buf); return 0; @@ -695,7 +728,9 @@ sep_err: cmd); return 1; } +#endif +#ifdef CONFIG_CMD_IMPORTENV /* * env import [-d] [-t | -b | -c] addr [size] * -d: delete existing environment before importing; @@ -708,7 +743,7 @@ sep_err: * size: length of input data; if missing, proper '\0' * termination is mandatory */ -static int do_env_import(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +static int do_env_import(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *cmd, *addr; char sep = '\n'; @@ -748,9 +783,8 @@ static int do_env_import(cmd_tbl_t * cmdtp, int flag, int argc, char * const arg } } - if (argc < 1) { + if (argc < 1) return cmd_usage(cmdtp); - } if (!fmt) printf("## Warning: defaulting to text format\n"); @@ -805,9 +839,10 @@ sep_err: cmd); return 1; } +#endif #if defined(CONFIG_CMD_RUN) -extern int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +extern int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); #endif /* @@ -822,8 +857,15 @@ static cmd_tbl_t cmd_env_sub[] = { #if defined(CONFIG_CMD_EDITENV) U_BOOT_CMD_MKENT(edit, 2, 0, do_env_edit, "", ""), #endif +#if defined(CONFIG_CMD_EXPORTENV) U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""), +#endif +#if defined(CONFIG_CMD_GREPENV) + U_BOOT_CMD_MKENT(grep, CONFIG_SYS_MAXARGS, 1, do_env_grep, "", ""), +#endif +#if defined(CONFIG_CMD_IMPORTENV) U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""), +#endif U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_env_print, "", ""), #if defined(CONFIG_CMD_RUN) U_BOOT_CMD_MKENT(run, CONFIG_SYS_MAXARGS, 1, do_run, "", ""), @@ -841,7 +883,7 @@ void env_reloc(void) } #endif -static int do_env (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { cmd_tbl_t *cp; @@ -870,8 +912,11 @@ U_BOOT_CMD( #if defined(CONFIG_CMD_EDITENV) "env edit name - edit environment variable\n" #endif - "env export [-t | -b | -c] addr [size] - export environmnt\n" - "env import [-d] [-t | -b | -c] addr [size] - import environmnt\n" + "env export [-t | -b | -c] addr [size] - export environment\n" +#if defined(CONFIG_CMD_GREPENV) + "env grep string [...] - search environment\n" +#endif + "env import [-d] [-t | -b | -c] addr [size] - import environment\n" "env print [name ...] - print environment\n" #if defined(CONFIG_CMD_RUN) "env run var [...] - run commands in an environment variable\n" @@ -903,6 +948,16 @@ U_BOOT_CMD_COMPLETE( var_complete ); +#ifdef CONFIG_CMD_GREPENV +U_BOOT_CMD_COMPLETE( + grepenv, CONFIG_SYS_MAXARGS, 0, do_env_grep, + "search environment variables", + "string ...\n" + " - list environment name=value pairs matching 'string'", + var_complete +); +#endif + U_BOOT_CMD_COMPLETE( setenv, CONFIG_SYS_MAXARGS, 0, do_env_set, "set environment variables", diff --git a/common/cmd_sf.c b/common/cmd_sf.c index 6e7be818e..11a491df7 100644 --- a/common/cmd_sf.c +++ b/common/cmd_sf.c @@ -19,6 +19,47 @@ static struct spi_flash *flash; + +/* + * This function computes the length argument for the erase command. + * The length on which the command is to operate can be given in two forms: + * 1. <cmd> offset len - operate on <'offset', 'len') + * 2. <cmd> offset +len - operate on <'offset', 'round_up(len)') + * If the second form is used and the length doesn't fall on the + * sector boundary, than it will be adjusted to the next sector boundary. + * If it isn't in the flash, the function will fail (return -1). + * Input: + * arg: length specification (i.e. both command arguments) + * Output: + * len: computed length for operation + * Return: + * 1: success + * -1: failure (bad format, bad address). + */ +static int sf_parse_len_arg(char *arg, ulong *len) +{ + char *ep; + char round_up_len; /* indicates if the "+length" form used */ + ulong len_arg; + + round_up_len = 0; + if (*arg == '+') { + round_up_len = 1; + ++arg; + } + + len_arg = simple_strtoul(arg, &ep, 16); + if (ep == arg || *ep != '\0') + return -1; + + if (round_up_len && flash->sector_size > 0) + *len = ROUND(len_arg - 1, flash->sector_size); + else + *len = len_arg; + + return 1; +} + static int do_spi_flash_probe(int argc, char * const argv[]) { unsigned int bus = 0; @@ -29,30 +70,30 @@ static int do_spi_flash_probe(int argc, char * const argv[]) struct spi_flash *new; if (argc < 2) - goto usage; + return -1; cs = simple_strtoul(argv[1], &endp, 0); if (*argv[1] == 0 || (*endp != 0 && *endp != ':')) - goto usage; + return -1; if (*endp == ':') { if (endp[1] == 0) - goto usage; + return -1; bus = cs; cs = simple_strtoul(endp + 1, &endp, 0); if (*endp != 0) - goto usage; + return -1; } if (argc >= 3) { speed = simple_strtoul(argv[2], &endp, 0); if (*argv[2] == 0 || *endp != 0) - goto usage; + return -1; } if (argc >= 4) { mode = simple_strtoul(argv[3], &endp, 16); if (*argv[3] == 0 || *endp != 0) - goto usage; + return -1; } new = spi_flash_probe(bus, cs, speed, mode); @@ -65,14 +106,7 @@ static int do_spi_flash_probe(int argc, char * const argv[]) spi_flash_free(flash); flash = new; - printf("%u KiB %s at %u:%u is now current device\n", - flash->size >> 10, flash->name, bus, cs); - return 0; - -usage: - puts("Usage: sf probe [bus:]cs [hz] [mode]\n"); - return 1; } static int do_spi_flash_read_write(int argc, char * const argv[]) @@ -85,17 +119,17 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) int ret; if (argc < 4) - goto usage; + return -1; addr = simple_strtoul(argv[1], &endp, 16); if (*argv[1] == 0 || *endp != 0) - goto usage; + return -1; offset = simple_strtoul(argv[2], &endp, 16); if (*argv[2] == 0 || *endp != 0) - goto usage; + return -1; len = simple_strtoul(argv[3], &endp, 16); if (*argv[3] == 0 || *endp != 0) - goto usage; + return -1; buf = map_physmem(addr, len, MAP_WRBACK); if (!buf) { @@ -116,10 +150,6 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) } return 0; - -usage: - printf("Usage: sf %s addr offset len\n", argv[0]); - return 1; } static int do_spi_flash_erase(int argc, char * const argv[]) @@ -130,14 +160,15 @@ static int do_spi_flash_erase(int argc, char * const argv[]) int ret; if (argc < 3) - goto usage; + return -1; offset = simple_strtoul(argv[1], &endp, 16); if (*argv[1] == 0 || *endp != 0) - goto usage; - len = simple_strtoul(argv[2], &endp, 16); - if (*argv[2] == 0 || *endp != 0) - goto usage; + return -1; + + ret = sf_parse_len_arg(argv[2], &len); + if (ret != 1) + return -1; ret = spi_flash_erase(flash, offset, len); if (ret) { @@ -146,24 +177,25 @@ static int do_spi_flash_erase(int argc, char * const argv[]) } return 0; - -usage: - puts("Usage: sf erase offset len\n"); - return 1; } static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { const char *cmd; + int ret; /* need at least two arguments */ if (argc < 2) goto usage; cmd = argv[1]; + --argc; + ++argv; - if (strcmp(cmd, "probe") == 0) - return do_spi_flash_probe(argc - 1, argv + 1); + if (strcmp(cmd, "probe") == 0) { + ret = do_spi_flash_probe(argc, argv); + goto done; + } /* The remaining commands require a selected device */ if (!flash) { @@ -172,9 +204,15 @@ static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ } if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0) - return do_spi_flash_read_write(argc - 1, argv + 1); - if (strcmp(cmd, "erase") == 0) - return do_spi_flash_erase(argc - 1, argv + 1); + ret = do_spi_flash_read_write(argc, argv); + else if (strcmp(cmd, "erase") == 0) + ret = do_spi_flash_erase(argc, argv); + else + ret = -1; + +done: + if (ret != -1) + return ret; usage: return cmd_usage(cmdtp); @@ -189,5 +227,6 @@ U_BOOT_CMD( " `offset' to memory at `addr'\n" "sf write addr offset len - write `len' bytes from memory\n" " at `addr' to flash at `offset'\n" - "sf erase offset len - erase `len' bytes from `offset'" + "sf erase offset [+]len - erase `len' bytes from `offset'\n" + " `+len' round up `len' to block size" ); diff --git a/common/cmd_sha1sum.c b/common/cmd_sha1sum.c new file mode 100644 index 000000000..bb3cff01f --- /dev/null +++ b/common/cmd_sha1sum.c @@ -0,0 +1,53 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 <sha1.h> + +static int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + unsigned long addr, len; + unsigned int i; + u8 output[20]; + + if (argc < 3) + return cmd_usage(cmdtp); + + addr = simple_strtoul(argv[1], NULL, 16); + len = simple_strtoul(argv[2], NULL, 16); + + sha1_csum((unsigned char *) addr, len, output); + printf("SHA1 for %08lx ... %08lx ==> ", addr, addr + len - 1); + for (i = 0; i < 20; i++) + printf("%02x", output[i]); + printf("\n"); + + return 0; +} + +U_BOOT_CMD( + sha1sum, 3, 1, do_sha1sum, + "compute SHA1 message digest", + "address count" +); diff --git a/common/cmd_unzip.c b/common/cmd_unzip.c new file mode 100644 index 000000000..6483b9267 --- /dev/null +++ b/common/cmd_unzip.c @@ -0,0 +1,59 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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> + +static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + unsigned long src, dst; + unsigned long src_len = ~0UL, dst_len = ~0UL; + char buf[32]; + + switch (argc) { + case 4: + dst_len = simple_strtoul(argv[3], NULL, 16); + /* fall through */ + case 3: + src = simple_strtoul(argv[1], NULL, 16); + dst = simple_strtoul(argv[2], NULL, 16); + break; + default: + return cmd_usage(cmdtp); + } + + if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0) + return 1; + + printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len); + sprintf(buf, "%lX", src_len); + setenv("filesize", buf); + + return 0; +} + +U_BOOT_CMD( + unzip, 4, 1, do_unzip, + "unzip a memory region", + "srcaddr dstaddr [dstsize]" +); diff --git a/common/cmd_usb.c b/common/cmd_usb.c index b5731a7bb..3ba6fff4f 100644 --- a/common/cmd_usb.c +++ b/common/cmd_usb.c @@ -588,7 +588,7 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) break; } if (dev == NULL) { - printf("*** NO Device avaiable ***\n"); + printf("*** No device available ***\n"); return 0; } else { usb_display_desc(dev); diff --git a/common/ddr_spd.c b/common/ddr_spd.c index a7a30de22..7a388bb9f 100644 --- a/common/ddr_spd.c +++ b/common/ddr_spd.c @@ -18,7 +18,7 @@ spd_check(const u8 *buf, u8 spd_rev, u8 spd_cksum) /* * Check SPD revision supported - * Rev 1.2 or less supported by this code + * Rev 1.X or less supported by this code */ if (spd_rev >= 0x20) { printf("SPD revision %02X not supported by this code\n", diff --git a/common/env_mmc.c b/common/env_mmc.c index 71dcc4c3e..83f40f434 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2008-2010 Freescale Semiconductor, Inc. + * (C) Copyright 2008-2011 Freescale Semiconductor, Inc. * * See file CREDITS for list of people who contributed to this * project. @@ -51,6 +51,19 @@ static void use_default(void); DECLARE_GLOBAL_DATA_PTR; +#if !defined(CONFIG_ENV_OFFSET) +#define CONFIG_ENV_OFFSET 0 +#endif + +static int __mmc_get_env_addr(struct mmc *mmc, u32 *env_addr) +{ + *env_addr = CONFIG_ENV_OFFSET; + return 0; +} +__attribute__((weak, alias("__mmc_get_env_addr"))) +int mmc_get_env_addr(struct mmc *mmc, u32 *env_addr); + + uchar env_get_char_spec(int index) { return *((uchar *)(gd->env_addr + index)); @@ -102,10 +115,14 @@ int saveenv(void) ssize_t len; char *res; struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV); + u32 offset; if (init_mmc_for_env(mmc)) return 1; + if(mmc_get_env_addr(mmc, &offset)) + return 1; + res = (char *)&env_new.data; len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); if (len < 0) { @@ -114,7 +131,7 @@ int saveenv(void) } env_new.crc = crc32(0, env_new.data, ENV_SIZE); printf("Writing to MMC(%d)... ", CONFIG_SYS_MMC_ENV_DEV); - if (write_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, (u_char *)&env_new)) { + if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)&env_new)) { puts("failed\n"); return 1; } @@ -141,16 +158,22 @@ inline int read_env(struct mmc *mmc, unsigned long size, void env_relocate_spec(void) { #if !defined(ENV_IS_EMBEDDED) - char buf[CONFIG_ENV_SIZE]; + char buf[CONFIG_ENV_SIZE]; struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV); + u32 offset; if (init_mmc_for_env(mmc)) { use_default(); return; } - if (read_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, buf)) { + if(mmc_get_env_addr(mmc, &offset)) { + use_default(); + return ; + } + + if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) { use_default(); return; } diff --git a/common/env_sf.c b/common/env_sf.c index 41cc00aea..d3b36d010 100644 --- a/common/env_sf.c +++ b/common/env_sf.c @@ -59,7 +59,6 @@ DECLARE_GLOBAL_DATA_PTR; extern uchar default_environment[]; char * env_name_spec = "SPI Flash"; -env_t *env_ptr; static struct spi_flash *env_flash; @@ -79,7 +78,7 @@ int saveenv(void) char *saved_buffer = NULL; u32 sector = 1; int ret; - char flag = OBSOLETE_FLAG, new_flag = ACTIVE_FLAG; + char flag = OBSOLETE_FLAG; if (!env_flash) { env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, @@ -159,7 +158,7 @@ int saveenv(void) gd->env_valid = (gd->env_valid == 2 ? 1 : 2); - printf("Valid environment: %d\n", gd->env_valid); + printf("Valid environment: %d\n", (int)gd->env_valid); done: if (saved_buffer) @@ -174,25 +173,20 @@ void env_relocate_spec(void) env_t *tmp_env1 = NULL; env_t *tmp_env2 = NULL; env_t *ep = NULL; - uchar flag1, flag2; - /* current_env is set only in case both areas are valid! */ - int current_env = 0; tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE); tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE); if (!tmp_env1 || !tmp_env2) { - free(tmp_env1); - free(tmp_env2); set_default_env("!malloc() failed"); - return; + goto out; } env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); if (!env_flash) { set_default_env("!spi_flash_probe() failed"); - return; + goto out; } ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, @@ -204,33 +198,30 @@ void env_relocate_spec(void) if (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc) crc1_ok = 1; - flag1 = tmp_env1->flags; ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET_REDUND, CONFIG_ENV_SIZE, tmp_env2); if (!ret) { if (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc) crc2_ok = 1; - flag2 = tmp_env2->flags; } if (!crc1_ok && !crc2_ok) { - free(tmp_env1); - free(tmp_env2); set_default_env("!bad CRC"); - return; + goto err_read; } else if (crc1_ok && !crc2_ok) { gd->env_valid = 1; - ep = tmp_env1; } else if (!crc1_ok && crc2_ok) { + gd->env_valid = 2; + } else if (tmp_env1->flags == ACTIVE_FLAG && + tmp_env2->flags == OBSOLETE_FLAG) { gd->env_valid = 1; - } else if (flag1 == ACTIVE_FLAG && flag2 == OBSOLETE_FLAG) { - gd->env_valid = 1; - } else if (flag1 == OBSOLETE_FLAG && flag2 == ACTIVE_FLAG) { + } else if (tmp_env1->flags == OBSOLETE_FLAG && + tmp_env2->flags == ACTIVE_FLAG) { gd->env_valid = 2; - } else if (flag1 == flag2) { + } else if (tmp_env1->flags == tmp_env2->flags) { gd->env_valid = 2; - } else if (flag1 == 0xFF) { + } else if (tmp_env1->flags == 0xFF) { gd->env_valid = 2; } else { /* @@ -240,8 +231,6 @@ void env_relocate_spec(void) gd->env_valid = 2; } - free(env_ptr); - if (gd->env_valid == 1) ep = tmp_env1; else @@ -257,10 +246,6 @@ err_read: spi_flash_free(env_flash); env_flash = NULL; out: - if (tmp_env1) - free(tmp_env1); - if (tmp_env2) - free(tmp_env2); free(tmp_env1); free(tmp_env2); diff --git a/common/exports.c b/common/exports.c index 3dff7351b..717e4afe6 100644 --- a/common/exports.c +++ b/common/exports.c @@ -15,7 +15,7 @@ unsigned long get_version(void) /* Reuse _exports.h with a little trickery to avoid bitrot */ #define EXPORT_FUNC(sym) gd->jt[XF_##sym] = (void *)sym; -#if !defined(CONFIG_I386) && !defined(CONFIG_PPC) +#if !defined(CONFIG_X86) && !defined(CONFIG_PPC) # define install_hdlr dummy # define free_hdlr dummy #else /* kludge for non-standard function naming */ diff --git a/common/fdt_support.c b/common/fdt_support.c index 6c98e5b07..496040b54 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -183,7 +183,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) } } - err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start + 1); + err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start); if (err < 0) { printf("fdt_initrd: %s\n", fdt_strerror(err)); return err; @@ -394,7 +394,7 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks) { int err, nodeoffset; int addr_cell_len, size_cell_len, len; - u8 tmp[banks * 8]; + u8 tmp[banks * 16]; /* Up to 64-bit address + 64-bit size */ int bank; err = fdt_check_header(blob); diff --git a/common/image.c b/common/image.c index f63a2ff1a..e542a5736 100644 --- a/common/image.c +++ b/common/image.c @@ -454,6 +454,22 @@ phys_size_t getenv_bootm_size(void) #endif } +phys_size_t getenv_bootm_mapsize(void) +{ + phys_size_t tmp; + char *s = getenv ("bootm_mapsize"); + if (s) { + tmp = (phys_size_t)simple_strtoull (s, NULL, 16); + return tmp; + } + +#if defined(CONFIG_SYS_BOOTMAPSZ) + return CONFIG_SYS_BOOTMAPSZ; +#else + return getenv_bootm_size(); +#endif +} + void memmove_wd (void *to, void *from, size_t len, ulong chunksz) { if (to == from) @@ -1169,10 +1185,37 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify) #define CONFIG_SYS_FDT_PAD 0x3000 #endif +#if defined(CONFIG_OF_LIBFDT) +/** + * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable + * @lmb: pointer to lmb handle, will be used for memory mgmt + * @fdt_blob: pointer to fdt blob base address + * + * Adds the memreserve regions in the dtb to the lmb block. Adding the + * memreserve regions prevents u-boot from using them to store the initrd + * or the fdt blob. + */ +void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob) +{ + uint64_t addr, size; + int i, total; + + if (fdt_check_header (fdt_blob) != 0) + return; + + total = fdt_num_mem_rsv(fdt_blob); + for (i = 0; i < total; i++) { + if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0) + continue; + printf(" reserving fdt memory region: addr=%llx size=%llx\n", + (unsigned long long)addr, (unsigned long long)size); + lmb_reserve(lmb, addr, size); + } +} + /** * boot_relocate_fdt - relocate flat device tree * @lmb: pointer to lmb handle, will be used for memory mgmt - * @bootmap_base: base address of the bootmap region * @of_flat_tree: pointer to a char* variable, will hold fdt start address * @of_size: pointer to a ulong variable, will hold fdt length * @@ -1187,9 +1230,7 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify) * 0 - success * 1 - failure */ -#if defined(CONFIG_SYS_BOOTMAPSZ) -int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, - char **of_flat_tree, ulong *of_size) +int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size) { void *fdt_blob = *of_flat_tree; void *of_start = 0; @@ -1209,7 +1250,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, /* Pad the FDT by a specified amount */ of_len = *of_size + CONFIG_SYS_FDT_PAD; of_start = (void *)(unsigned long)lmb_alloc_base(lmb, of_len, 0x1000, - (CONFIG_SYS_BOOTMAPSZ + bootmap_base)); + getenv_bootm_mapsize() + getenv_bootm_low()); if (of_start == 0) { puts("device tree - allocation error\n"); @@ -1238,7 +1279,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, error: return 1; } -#endif /* CONFIG_SYS_BOOTMAPSZ */ +#endif /* CONFIG_OF_LIBFDT */ /** * boot_get_fdt - main fdt handling routine @@ -1567,11 +1608,9 @@ error: * @lmb: pointer to lmb handle, will be used for memory mgmt * @cmd_start: pointer to a ulong variable, will hold cmdline start * @cmd_end: pointer to a ulong variable, will hold cmdline end - * @bootmap_base: ulong variable, holds offset in physical memory to - * base of bootmap * * boot_get_cmdline() allocates space for kernel command line below - * BOOTMAPSZ + bootmap_base address. If "bootargs" U-boot environemnt + * BOOTMAPSZ + getenv_bootm_low() address. If "bootargs" U-boot environemnt * variable is present its contents is copied to allocated kernel * command line. * @@ -1579,14 +1618,13 @@ error: * 0 - success * -1 - failure */ -int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end, - ulong bootmap_base) +int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end) { char *cmdline; char *s; cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf, - CONFIG_SYS_BOOTMAPSZ + bootmap_base); + getenv_bootm_mapsize() + getenv_bootm_low()); if (cmdline == NULL) return -1; @@ -1610,21 +1648,19 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end, * boot_get_kbd - allocate and initialize kernel copy of board info * @lmb: pointer to lmb handle, will be used for memory mgmt * @kbd: double pointer to board info data - * @bootmap_base: ulong variable, holds offset in physical memory to - * base of bootmap * * boot_get_kbd() allocates space for kernel copy of board info data below - * BOOTMAPSZ + bootmap_base address and kernel board info is initialized with - * the current u-boot board info data. + * BOOTMAPSZ + getenv_bootm_low() address and kernel board info is initialized + * with the current u-boot board info data. * * returns: * 0 - success * -1 - failure */ -int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base) +int boot_get_kbd (struct lmb *lmb, bd_t **kbd) { *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf, - CONFIG_SYS_BOOTMAPSZ + bootmap_base); + getenv_bootm_mapsize() + getenv_bootm_low()); if (*kbd == NULL) return -1; diff --git a/common/miiphyutil.c b/common/miiphyutil.c index e282096a1..bcab74e73 100644 --- a/common/miiphyutil.c +++ b/common/miiphyutil.c @@ -28,6 +28,7 @@ #include <common.h> #include <miiphy.h> +#include <phy.h> #include <asm/types.h> #include <linux/list.h> @@ -39,27 +40,18 @@ #undef debug #ifdef MII_DEBUG -#define debug(fmt,args...) printf (fmt ,##args) +#define debug(fmt, args...) printf(fmt, ##args) #else -#define debug(fmt,args...) +#define debug(fmt, args...) #endif /* MII_DEBUG */ -struct mii_dev { - struct list_head link; - const char *name; - int (*read) (const char *devname, unsigned char addr, - unsigned char reg, unsigned short *value); - int (*write) (const char *devname, unsigned char addr, - unsigned char reg, unsigned short value); -}; - static struct list_head mii_devs; static struct mii_dev *current_mii; /* * Lookup the mii_dev struct by the registered device name. */ -static struct mii_dev *miiphy_get_dev_by_name(const char *devname, int quiet) +struct mii_dev *miiphy_get_dev_by_name(const char *devname) { struct list_head *entry; struct mii_dev *dev; @@ -75,8 +67,6 @@ static struct mii_dev *miiphy_get_dev_by_name(const char *devname, int quiet) return dev; } - if (!quiet) - printf("No such device: %s\n", devname); return NULL; } @@ -86,74 +76,190 @@ static struct mii_dev *miiphy_get_dev_by_name(const char *devname, int quiet) */ void miiphy_init(void) { - INIT_LIST_HEAD (&mii_devs); + INIT_LIST_HEAD(&mii_devs); current_mii = NULL; } +static int legacy_miiphy_read(struct mii_dev *bus, int addr, int devad, int reg) +{ + unsigned short val; + int ret; + struct legacy_mii_dev *ldev = bus->priv; + + ret = ldev->read(bus->name, addr, reg, &val); + + return ret ? -1 : (int)val; +} + +static int legacy_miiphy_write(struct mii_dev *bus, int addr, int devad, + int reg, u16 val) +{ + struct legacy_mii_dev *ldev = bus->priv; + + return ldev->write(bus->name, addr, reg, val); +} + /***************************************************************************** * * Register read and write MII access routines for the device <name>. */ void miiphy_register(const char *name, - int (*read) (const char *devname, unsigned char addr, + int (*read)(const char *devname, unsigned char addr, unsigned char reg, unsigned short *value), - int (*write) (const char *devname, unsigned char addr, + int (*write)(const char *devname, unsigned char addr, unsigned char reg, unsigned short value)) { struct mii_dev *new_dev; + struct legacy_mii_dev *ldev; unsigned int name_len; - char *new_name; /* check if we have unique name */ - new_dev = miiphy_get_dev_by_name(name, 1); + new_dev = miiphy_get_dev_by_name(name); if (new_dev) { printf("miiphy_register: non unique device name '%s'\n", name); return; } /* allocate memory */ - name_len = strlen (name); - new_dev = - (struct mii_dev *)malloc (sizeof (struct mii_dev) + name_len + 1); + name_len = strlen(name); + if (name_len > MDIO_NAME_LEN - 1) { + /* Hopefully this won't happen, but if it does, we'll know */ + printf("miiphy_register: MDIO name was longer than %d\n", + MDIO_NAME_LEN); + return; + } + + new_dev = mdio_alloc(); + ldev = malloc(sizeof(*ldev)); - if (new_dev == NULL) { - printf ("miiphy_register: cannot allocate memory for '%s'\n", + if (new_dev == NULL || ldev == NULL) { + printf("miiphy_register: cannot allocate memory for '%s'\n", name); return; } - memset (new_dev, 0, sizeof (struct mii_dev) + name_len); /* initalize mii_dev struct fields */ - INIT_LIST_HEAD (&new_dev->link); - new_dev->read = read; - new_dev->write = write; - new_dev->name = new_name = (char *)(new_dev + 1); - strncpy (new_name, name, name_len); - new_name[name_len] = '\0'; + new_dev->read = legacy_miiphy_read; + new_dev->write = legacy_miiphy_write; + sprintf(new_dev->name, name); + ldev->read = read; + ldev->write = write; + new_dev->priv = ldev; - debug ("miiphy_register: added '%s', read=0x%08lx, write=0x%08lx\n", - new_dev->name, new_dev->read, new_dev->write); + debug("miiphy_register: added '%s', read=0x%08lx, write=0x%08lx\n", + new_dev->name, ldev->read, ldev->write); /* add it to the list */ - list_add_tail (&new_dev->link, &mii_devs); + list_add_tail(&new_dev->link, &mii_devs); if (!current_mii) current_mii = new_dev; } +struct mii_dev *mdio_alloc(void) +{ + struct mii_dev *bus; + + bus = malloc(sizeof(*bus)); + if (!bus) + return bus; + + memset(bus, 0, sizeof(*bus)); + + /* initalize mii_dev struct fields */ + INIT_LIST_HEAD(&bus->link); + + return bus; +} + +int mdio_register(struct mii_dev *bus) +{ + if (!bus || !bus->name || !bus->read || !bus->write) + return -1; + + /* check if we have unique name */ + if (miiphy_get_dev_by_name(bus->name)) { + printf("mdio_register: non unique device name '%s'\n", + bus->name); + return -1; + } + + /* add it to the list */ + list_add_tail(&bus->link, &mii_devs); + + if (!current_mii) + current_mii = bus; + + return 0; +} + +void mdio_list_devices(void) +{ + struct list_head *entry; + + list_for_each(entry, &mii_devs) { + int i; + struct mii_dev *bus = list_entry(entry, struct mii_dev, link); + + printf("%s:\n", bus->name); + + for (i = 0; i < PHY_MAX_ADDR; i++) { + struct phy_device *phydev = bus->phymap[i]; + + if (phydev) { + printf("%d - %s", i, phydev->drv->name); + + if (phydev->dev) + printf(" <--> %s\n", phydev->dev->name); + else + printf("\n"); + } + } + } +} + int miiphy_set_current_dev(const char *devname) { struct mii_dev *dev; - dev = miiphy_get_dev_by_name(devname, 0); + dev = miiphy_get_dev_by_name(devname); if (dev) { current_mii = dev; return 0; } + printf("No such device: %s\n", devname); + return 1; } +struct mii_dev *mdio_get_current_dev(void) +{ + return current_mii; +} + +struct phy_device *mdio_phydev_for_ethname(const char *ethname) +{ + struct list_head *entry; + struct mii_dev *bus; + + list_for_each(entry, &mii_devs) { + int i; + bus = list_entry(entry, struct mii_dev, link); + + for (i = 0; i < PHY_MAX_ADDR; i++) { + if (!bus->phymap[i] || !bus->phymap[i]->dev) + continue; + + if (strcmp(bus->phymap[i]->dev->name, ethname) == 0) + return bus->phymap[i]; + } + } + + printf("%s is not a known ethernet\n", ethname); + return NULL; +} + const char *miiphy_get_current_dev(void) { if (current_mii) @@ -187,13 +293,19 @@ static struct mii_dev *miiphy_get_active_dev(const char *devname) int miiphy_read(const char *devname, unsigned char addr, unsigned char reg, unsigned short *value) { - struct mii_dev *dev; + struct mii_dev *bus; + int ret; - dev = miiphy_get_active_dev(devname); - if (dev) - return dev->read(devname, addr, reg, value); + bus = miiphy_get_active_dev(devname); + if (!bus) + return 1; - return 1; + ret = bus->read(bus, addr, MDIO_DEVAD_NONE, reg); + if (ret < 0) + return 1; + + *value = (unsigned short)ret; + return 0; } /***************************************************************************** @@ -207,11 +319,11 @@ int miiphy_read(const char *devname, unsigned char addr, unsigned char reg, int miiphy_write(const char *devname, unsigned char addr, unsigned char reg, unsigned short value) { - struct mii_dev *dev; + struct mii_dev *bus; - dev = miiphy_get_active_dev(devname); - if (dev) - return dev->write(devname, addr, reg, value); + bus = miiphy_get_active_dev(devname); + if (bus) + return bus->write(bus, addr, MDIO_DEVAD_NONE, reg, value); return 1; } @@ -220,20 +332,20 @@ int miiphy_write(const char *devname, unsigned char addr, unsigned char reg, * * Print out list of registered MII capable devices. */ -void miiphy_listdev (void) +void miiphy_listdev(void) { struct list_head *entry; struct mii_dev *dev; - puts ("MII devices: "); - list_for_each (entry, &mii_devs) { - dev = list_entry (entry, struct mii_dev, link); - printf ("'%s' ", dev->name); + puts("MII devices: "); + list_for_each(entry, &mii_devs) { + dev = list_entry(entry, struct mii_dev, link); + printf("'%s' ", dev->name); } - puts ("\n"); + puts("\n"); if (current_mii) - printf ("Current device: '%s'\n", current_mii->name); + printf("Current device: '%s'\n", current_mii->name); } /***************************************************************************** @@ -253,32 +365,33 @@ int miiphy_info(const char *devname, unsigned char addr, unsigned int *oui, unsigned int reg = 0; unsigned short tmp; - if (miiphy_read (devname, addr, MII_PHYSID2, &tmp) != 0) { - debug ("PHY ID register 2 read failed\n"); - return (-1); + if (miiphy_read(devname, addr, MII_PHYSID2, &tmp) != 0) { + debug("PHY ID register 2 read failed\n"); + return -1; } reg = tmp; - debug ("MII_PHYSID2 @ 0x%x = 0x%04x\n", addr, reg); + debug("MII_PHYSID2 @ 0x%x = 0x%04x\n", addr, reg); if (reg == 0xFFFF) { /* No physical device present at this address */ - return (-1); + return -1; } - if (miiphy_read (devname, addr, MII_PHYSID1, &tmp) != 0) { - debug ("PHY ID register 1 read failed\n"); - return (-1); + if (miiphy_read(devname, addr, MII_PHYSID1, &tmp) != 0) { + debug("PHY ID register 1 read failed\n"); + return -1; } reg |= tmp << 16; - debug ("PHY_PHYIDR[1,2] @ 0x%x = 0x%08x\n", addr, reg); + debug("PHY_PHYIDR[1,2] @ 0x%x = 0x%08x\n", addr, reg); *oui = (reg >> 10); *model = (unsigned char)((reg >> 4) & 0x0000003F); *rev = (unsigned char)(reg & 0x0000000F); - return (0); + return 0; } +#ifndef CONFIG_PHYLIB /***************************************************************************** * * Reset the PHY. @@ -290,16 +403,16 @@ int miiphy_reset(const char *devname, unsigned char addr) unsigned short reg; int timeout = 500; - if (miiphy_read (devname, addr, MII_BMCR, ®) != 0) { - debug ("PHY status read failed\n"); - return (-1); + if (miiphy_read(devname, addr, MII_BMCR, ®) != 0) { + debug("PHY status read failed\n"); + return -1; } - if (miiphy_write (devname, addr, MII_BMCR, reg | BMCR_RESET) != 0) { - debug ("PHY reset failed\n"); - return (-1); + if (miiphy_write(devname, addr, MII_BMCR, reg | BMCR_RESET) != 0) { + debug("PHY reset failed\n"); + return -1; } #ifdef CONFIG_PHY_RESET_DELAY - udelay (CONFIG_PHY_RESET_DELAY); /* Intel LXT971A needs this */ + udelay(CONFIG_PHY_RESET_DELAY); /* Intel LXT971A needs this */ #endif /* * Poll the control register for the reset bit to go to 0 (it is @@ -315,13 +428,14 @@ int miiphy_reset(const char *devname, unsigned char addr) udelay(1000); } if ((reg & 0x8000) == 0) { - return (0); + return 0; } else { - puts ("PHY reset timed out\n"); - return (-1); + puts("PHY reset timed out\n"); + return -1; } - return (0); + return 0; } +#endif /* !PHYLIB */ /***************************************************************************** * @@ -338,33 +452,32 @@ int miiphy_speed(const char *devname, unsigned char addr) * Check for 1000BASE-X. If it is supported, then assume that the speed * is 1000. */ - if (miiphy_is_1000base_x (devname, addr)) { + if (miiphy_is_1000base_x(devname, addr)) return _1000BASET; - } + /* * No 1000BASE-X, so assume 1000BASE-T/100BASE-TX/10BASE-T register set. */ /* Check for 1000BASE-T. */ - if (miiphy_read (devname, addr, MII_STAT1000, &btsr)) { - printf ("PHY 1000BT status"); + if (miiphy_read(devname, addr, MII_STAT1000, &btsr)) { + printf("PHY 1000BT status"); goto miiphy_read_failed; } if (btsr != 0xFFFF && - (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD))) { + (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD))) return _1000BASET; - } #endif /* CONFIG_PHY_GIGE */ /* Check Basic Management Control Register first. */ - if (miiphy_read (devname, addr, MII_BMCR, &bmcr)) { - printf ("PHY speed"); + if (miiphy_read(devname, addr, MII_BMCR, &bmcr)) { + printf("PHY speed"); goto miiphy_read_failed; } /* Check if auto-negotiation is on. */ if (bmcr & BMCR_ANENABLE) { /* Get auto-negotiation results. */ - if (miiphy_read (devname, addr, MII_LPA, &anlpar)) { - printf ("PHY AN speed"); + if (miiphy_read(devname, addr, MII_LPA, &anlpar)) { + printf("PHY AN speed"); goto miiphy_read_failed; } return (anlpar & LPA_100) ? _100BASET : _10BASET; @@ -373,7 +486,7 @@ int miiphy_speed(const char *devname, unsigned char addr) return (bmcr & BMCR_SPEED100) ? _100BASET : _10BASET; miiphy_read_failed: - printf (" read failed, assuming 10BASE-T\n"); + printf(" read failed, assuming 10BASE-T\n"); return _10BASET; } @@ -389,10 +502,10 @@ int miiphy_duplex(const char *devname, unsigned char addr) u16 btsr; /* Check for 1000BASE-X. */ - if (miiphy_is_1000base_x (devname, addr)) { + if (miiphy_is_1000base_x(devname, addr)) { /* 1000BASE-X */ - if (miiphy_read (devname, addr, MII_LPA, &anlpar)) { - printf ("1000BASE-X PHY AN duplex"); + if (miiphy_read(devname, addr, MII_LPA, &anlpar)) { + printf("1000BASE-X PHY AN duplex"); goto miiphy_read_failed; } } @@ -400,8 +513,8 @@ int miiphy_duplex(const char *devname, unsigned char addr) * No 1000BASE-X, so assume 1000BASE-T/100BASE-TX/10BASE-T register set. */ /* Check for 1000BASE-T. */ - if (miiphy_read (devname, addr, MII_STAT1000, &btsr)) { - printf ("PHY 1000BT status"); + if (miiphy_read(devname, addr, MII_STAT1000, &btsr)) { + printf("PHY 1000BT status"); goto miiphy_read_failed; } if (btsr != 0xFFFF) { @@ -414,15 +527,15 @@ int miiphy_duplex(const char *devname, unsigned char addr) #endif /* CONFIG_PHY_GIGE */ /* Check Basic Management Control Register first. */ - if (miiphy_read (devname, addr, MII_BMCR, &bmcr)) { - puts ("PHY duplex"); + if (miiphy_read(devname, addr, MII_BMCR, &bmcr)) { + puts("PHY duplex"); goto miiphy_read_failed; } /* Check if auto-negotiation is on. */ if (bmcr & BMCR_ANENABLE) { /* Get auto-negotiation results. */ - if (miiphy_read (devname, addr, MII_LPA, &anlpar)) { - puts ("PHY AN duplex"); + if (miiphy_read(devname, addr, MII_LPA, &anlpar)) { + puts("PHY AN duplex"); goto miiphy_read_failed; } return (anlpar & (LPA_10FULL | LPA_100FULL)) ? @@ -432,7 +545,7 @@ int miiphy_duplex(const char *devname, unsigned char addr) return (bmcr & BMCR_FULLDPLX) ? FULL : HALF; miiphy_read_failed: - printf (" read failed, assuming half duplex\n"); + printf(" read failed, assuming half duplex\n"); return HALF; } @@ -446,8 +559,8 @@ int miiphy_is_1000base_x(const char *devname, unsigned char addr) #if defined(CONFIG_PHY_GIGE) u16 exsr; - if (miiphy_read (devname, addr, MII_ESTATUS, &exsr)) { - printf ("PHY extended status read failed, assuming no " + if (miiphy_read(devname, addr, MII_ESTATUS, &exsr)) { + printf("PHY extended status read failed, assuming no " "1000BASE-X\n"); return 0; } @@ -467,17 +580,17 @@ int miiphy_link(const char *devname, unsigned char addr) unsigned short reg; /* dummy read; needed to latch some phys */ - (void)miiphy_read (devname, addr, MII_BMSR, ®); - if (miiphy_read (devname, addr, MII_BMSR, ®)) { - puts ("MII_BMSR read failed, assuming no link\n"); - return (0); + (void)miiphy_read(devname, addr, MII_BMSR, ®); + if (miiphy_read(devname, addr, MII_BMSR, ®)) { + puts("MII_BMSR read failed, assuming no link\n"); + return 0; } /* Determine if a link is active */ if ((reg & BMSR_LSTATUS) != 0) { - return (1); + return 1; } else { - return (0); + return 0; } } #endif diff --git a/common/usb_storage.c b/common/usb_storage.c index 1e6cd6af2..9ecf165d1 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -254,7 +254,7 @@ int usb_stor_scan(int mode) dev = usb_get_dev_index(i); /* get device */ USB_STOR_PRINTF("i=%d\n", i); if (dev == NULL) - break; /* no more devices avaiable */ + break; /* no more devices available */ if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) { /* OK, it's a storage device. Iterate over its LUNs @@ -1346,31 +1346,6 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss, unsigned long *capacity, *blksz; ccb *pccb = &usb_ccb; - /* for some reasons a couple of devices would not survive this reset */ - if ( - /* Sony USM256E */ - (dev->descriptor.idVendor == 0x054c && - dev->descriptor.idProduct == 0x019e) - || - /* USB007 Mini-USB2 Flash Drive */ - (dev->descriptor.idVendor == 0x066f && - dev->descriptor.idProduct == 0x2010) - || - /* SanDisk Corporation Cruzer Micro 20044318410546613953 */ - (dev->descriptor.idVendor == 0x0781 && - dev->descriptor.idProduct == 0x5151) - || - /* - * SanDisk Corporation U3 Cruzer Micro 1/4GB - * Flash Drive 000016244373FFB4 - */ - (dev->descriptor.idVendor == 0x0781 && - dev->descriptor.idProduct == 0x5406) - ) - USB_STOR_PRINTF("usb_stor_get_info: skipping RESET..\n"); - else - ss->transport_reset(ss); - pccb->pdata = usb_stor_buf; dev_desc->target = dev->devnum; |