block_dev_desc_t *get_dev (char* ifname, int dev) { #if (CONFIG_COMMANDS & CFG_CMD_IDE) if (strncmp(ifname,"ide",3)==0) { extern block_dev_desc_t * ide_get_dev(int dev); return(ide_get_dev(dev)); } #endif #if (CONFIG_COMMANDS & CFG_CMD_SCSI) if (strncmp(ifname,"scsi",4)==0) { extern block_dev_desc_t * scsi_get_dev(int dev); return(scsi_get_dev(dev)); } #endif #if ((CONFIG_COMMANDS & CFG_CMD_USB) && defined(CONFIG_USB_STORAGE)) if (strncmp(ifname,"usb",3)==0) { extern block_dev_desc_t * usb_stor_get_dev(int dev); return(usb_stor_get_dev(dev)); } #endif #if defined(CONFIG_MMC) if (strncmp(ifname,"mmc",3)==0) { extern block_dev_desc_t * mmc_get_dev(int dev); return(mmc_get_dev(dev)); } #endif #if defined(CONFIG_SYSTEMACE) if (strcmp(ifname,"ace")==0) { extern block_dev_desc_t * systemace_get_dev(int dev); return(systemace_get_dev(dev)); } #endif return NULL; }
void spl_usb_load_image(void) { struct usb_device *usb_dev; int err; block_dev_desc_t *stor_dev; usb_stop(); err = usb_init(); if (err) { #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT printf("spl: usb init failed: err - %d\n", err); #endif hang(); } else { #ifdef CONFIG_USB_STORAGE /* try to recognize storage devices immediately */ usb_stor_curr_dev = usb_stor_scan(1); stor_dev = usb_stor_get_dev(usb_stor_curr_dev); #endif } debug("boot mode - FAT\n"); err = fat_register_device(stor_dev, CONFIG_SYS_USB_FAT_BOOT_PARTITION); if (err) { #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT printf("spl: fat register err - %d\n", err); #endif hang(); } #ifdef CONFIG_SPL_OS_BOOT if (spl_start_uboot() || usb_load_image_fat_os(usb_dev)) #endif err = usb_load_image_fat(CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); if (err) { puts("Error loading USB device\n"); hang(); } }
static int load_rescue_image(ulong addr) { disk_partition_t info; int devno; int partno; int i; char fwdir[64]; char nxri[128]; char *tmp; char dev[7]; char addr_str[16]; char *argv[6] = { "fatload", "usb", dev, addr_str, nxri, NULL }; block_dev_desc_t *stor_dev = NULL; cmd_tbl_t *bcmd; /* Get name of firmware directory */ tmp = getenv("fw-dir"); /* Copy it into fwdir */ strncpy(fwdir, tmp ? tmp : FW_DIR, sizeof(fwdir)); fwdir[sizeof(fwdir) - 1] = 0; /* Terminate string */ printf(LOG_PREFIX "Checking for firmware image directory '%s' on USB" " storage...\n", fwdir); usb_stop(); if (usb_init() != 0) return 1; /* Check for storage device */ if (usb_stor_scan(1) != 0) { usb_stop(); return 1; } /* Detect storage device */ for (devno = 0; devno < USB_MAX_STOR_DEV; devno++) { stor_dev = usb_stor_get_dev(devno); if (stor_dev->type != DEV_TYPE_UNKNOWN) break; } if (!stor_dev || stor_dev->type == DEV_TYPE_UNKNOWN) { printf(LOG_PREFIX "No valid storage device found...\n"); usb_stop(); return 1; } /* Detect partition */ for (partno = -1, i = 0; i < 6; i++) { if (get_partition_info(stor_dev, i, &info) == 0) { if (fat_register_device(stor_dev, i) == 0) { /* Check if rescue image is present */ FW_DEBUG("Looking for firmware directory '%s'" " on partition %d\n", fwdir, i); if (do_fat_read(fwdir, NULL, 0, LS_NO) == -1) { FW_DEBUG("No NX rescue image on " "partition %d.\n", i); partno = -2; } else { partno = i; FW_DEBUG("Partition %d contains " "firmware directory\n", partno); break; } } } } if (partno < 0) { switch (partno) { case -1: printf(LOG_PREFIX "Error: No valid (FAT) partition " "detected\n"); break; case -2: printf(LOG_PREFIX "Error: No NX rescue image on FAT " "partition\n"); break; default: printf(LOG_PREFIX "Error: Failed with code %d\n", partno); } usb_stop(); return 1; } /* Load the rescue image */ bcmd = find_cmd("fatload"); if (!bcmd) { printf(LOG_PREFIX "Error - 'fatload' command not present.\n"); usb_stop(); return 1; } tmp = getenv("nx-rescue-image"); sprintf(nxri, "%s/%s", fwdir, tmp ? tmp : RESCUE_IMAGE); sprintf(dev, "%d:%d", devno, partno); sprintf(addr_str, "%lx", addr); FW_DEBUG("fat_fsload device='%s', addr='%s', file: %s\n", dev, addr_str, nxri); if (do_fat_fsload(bcmd, 0, 5, argv) != 0) { usb_stop(); return 1; } /* Stop USB */ usb_stop(); return 0; }