Ejemplo n.º 1
0
int mmc_read_bootloader(int dev, int part)
{
	long size;
	unsigned long offset = CFG_LOADADDR;
	block_dev_desc_t *dev_desc = NULL;
	unsigned char ret = 0;

	ret = mmc_init(dev);
	if (ret != 0){
		printf("\n MMC init failed \n");
		return -1;
	}

	if (part) {	/* FAT Read for extenal SD card */
		dev_desc = mmc_get_dev(dev);
		size = file_fat_read("u-boot.bin", (unsigned char *)offset, 0);
		if (size == -1)
			return -1;
	} else {	/* RAW read for EMMC */
		ret = mmc_read(dev, 0x400, (unsigned char *)offset, 0x60000);
		if (ret != 1)
			return -1;
	}

	return 0;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
int mmc_read_bootloader(int dev)
{
	unsigned char ret = 0;
	unsigned long offset = ( CFG_LOADADDR - 0x120 );

	ret = mmc_init(dev);
	if (ret != 0){
		printf("\n MMC init failed \n");
		return -1;
	}

#ifdef CFG_CMD_FAT
	long size;
	block_dev_desc_t *dev_desc = NULL;

	if (fat_boot()) {
		dev_desc = mmc_get_dev(dev);
		fat_register_device(dev_desc, 1);
		size = file_fat_read("u-boot.bin", (unsigned char *)offset, 0);
		if (size == -1)
			return -1;
	} else {
		/* FIXME: OMAP4 specific */
		 mmc_read(dev, 0x200, (unsigned char *)( CFG_LOADADDR - 0x120 ),
							0x00060000);
	}
#endif
	return 0;
}
Ejemplo n.º 4
0
int board_mmc_env_init(void)
{
	block_dev_desc_t *blk_dev;
	disk_partition_t disk_info;
	int ret;

	if (mmc_init(mmc_host.mmc)) {
		/* The HS mode command(cmd6) is getting timed out. So mmc card is
		 * not getting initialized properly. Since the env partition is not
		 * visible, the env default values are writing into the default
		 * partition (start of the mmc device). So do a reset again.
		 */
		if (mmc_init(mmc_host.mmc)) {
			printf("MMC init failed \n");
			return -1;
		}
	}
	blk_dev = mmc_get_dev(mmc_host.dev_num);
	ret = find_part_efi(blk_dev, "0:APPSBLENV", &disk_info);

	if (ret > 0) {
		board_env_offset = disk_info.start * disk_info.blksz;
		board_env_size = disk_info.size * disk_info.blksz;
		board_env_range = board_env_size;
		BUG_ON(board_env_size > CONFIG_ENV_SIZE_MAX);
	}
	return ret;
}
Ejemplo n.º 5
0
static int warp_sd_init(int dev, disk_partition_t * info,
                        block_dev_desc_t ** dev_desc)
{
    int ret;
    u32 lun, part;
    block_dev_desc_t *mmc_get_dev(int dev);
#ifdef CONFIG_GENERIC_MMC
    struct mmc *mmc;
#endif

    lun = WARP_DEV_TO_LUN(dev);
    part = WARP_DEV_TO_PART(dev);

#ifdef CONFIG_GENERIC_MMC
    if (!(mmc = find_mmc_device(lun))) {
        printf("device %d not found\n", lun);
        return -1;
    }

    ret = mmc_init(mmc);
#else
#if U_BOOT_VERSION_CODE < U_BOOT_VER(2009,3,0)
    ret = mmc_init(0);
#else
    ret = mmc_legacy_init(0);
#endif
#endif

    if (ret != 0) {
        printf("No MMC card found\n");
        return ret;
    }

    if ((*dev_desc = mmc_get_dev(lun)) == NULL) {
        printf("device %d not found\n", lun);
        return -1;
    }

    if (part == 0) {
        info->start = 0;
        return 0;
    }

    if ((ret = get_partition_info(*dev_desc, part, info)) != 0) {
        printf("partition %d:%d not found\n", lun, part);
        return ret;
    }

    return 0;
}
Ejemplo n.º 6
0
int mmc_write_prot_dump() {
    int rc, fd;
    char device[PATH_MAX];
    __u8 extcsd[512];
    __u32 mmc_sz, wp_grp_sz, wp_grp_cnt, i;
    __u64 wp;

    rc = mmc_get_dev("system", device);
    if (rc < 0)
        return -1;
    fd = open(device, O_RDWR);
    if (fd < 0)
        return -1;
    rc = mmc_read_extcsd(fd, extcsd);
    if (rc) {
        close(fd);
        return -1;
    }
    rc = mmc_get_card_sz(extcsd, &mmc_sz);
    if (rc) {
        close(fd);
        return -1;
    }
    printf("CARD SIZE: %08x\n", mmc_sz);
    rc = mmc_get_wp_grp_sz(extcsd, &wp_grp_sz);
    if (rc) {
        close(fd);
        return -1;
    }
    printf("WPGR SIZE: %08x\n", wp_grp_sz);
    wp_grp_cnt = mmc_sz / wp_grp_sz;
    for (i = 0; i < wp_grp_cnt; i += 32) {
        rc = mmc_send_write_prot_type(fd, i * wp_grp_sz, &wp);
        if (rc)
            break;
        printf(" %08x: %016llx\n", i * wp_grp_sz, wp);
    }
    close(fd);

    return i >= wp_grp_cnt ? 0 : -1;
}
Ejemplo n.º 7
0
int mmc_write_prot_off() {
    int rc, fd;
    char device[PATH_MAX];
    __u8 extcsd[512];
    __u32 rca, card_sz, wp_grp_sz;
    __u32 i, loop;
    bool is_sharp = is_sharp_dev();

    rc = mmc_get_dev("system", device);
    if (rc)
        return -1;
    fd = open(device, O_RDWR);
    if (fd < 0)
        return -1;
    rc = mmc_read_extcsd(fd, extcsd);
    if (rc) {
        close(fd);
        return -1;
    }
    rc = mmc_get_card_sz(extcsd, &card_sz);
    if (rc) {
        close(fd);
        return -1;
    }
    rc = mmc_get_wp_grp_sz(extcsd, &wp_grp_sz);
    if (rc) {
        close(fd);
        return -1;
    }
    rc = mmc_send_rca(fd, &rca);
    if (rc) {
        // close(fd);
        // return -1;
        rca = 0x0001;
    }
    rc = mmc_set_class_6_ctrl(fd, 0);
    if (rc) {
        close(fd);
        return -1;
    }
    loop = card_sz / wp_grp_sz;
    for (i = 0; i < loop; i++) {
        __u32 status = 0;

        if (is_sharp && mmc_sh_pre_clr_wp(fd)) {
            // printf("failed mmc_sh_pre_clr_wp, %d\n", i * wp_grp_sz);
            break;
        }
        // clear 1 group
        rc = mmc_clr_write_prot(fd, i * wp_grp_sz);
        if (rc) {
            // printf("failed mmc_clr_write_prot, %d\n", i * wp_grp_sz);
            break;
        }
        rc = mmc_send_status(fd, rca, &status);
        if (rc) {
            // printf("failed mmc_send_status, %d\n", i * wp_grp_sz);
            break;
        }
    }
    close(fd);

    return i == loop ? 0 : -1;
}
Ejemplo n.º 8
0
/*
 * Gets the ethernet address from the ART partition table and return the value
 */
int get_eth_mac_address(uchar *enetaddr, uint no_of_macs)
{
	s32 ret = 0 ;
	u32 start_blocks;
	u32 size_blocks;
	u32 length = (6 * no_of_macs);
	u32 flash_type;
	loff_t art_offset;
	ipq_smem_flash_info_t *sfi = &ipq_smem_flash_info;
#ifdef CONFIG_IPQ_MMC
	block_dev_desc_t *blk_dev;
	disk_partition_t disk_info;
	struct mmc *mmc;
#endif

	if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
		if (ipq_smem_flash_info.flash_type == SMEM_BOOT_SPI_FLASH)
			flash_type = CONFIG_IPQ_SPI_NAND_INFO_IDX;
		else if (ipq_smem_flash_info.flash_type == SMEM_BOOT_NAND_FLASH)
			flash_type = CONFIG_IPQ_NAND_NAND_INFO_IDX;
		else {
			printf("Unknown flash type\n");
			return -EINVAL;
		}

		ret = smem_getpart("0:ART", &start_blocks, &size_blocks);
		if (ret < 0) {
			printf("No ART partition found\n");
			return ret;
		}

		/*
		 * ART partition 0th position (6 * 4) 24 bytes will contain the
		 * 4 MAC Address. First 0-5 bytes for GMAC0, Second 6-11 bytes
		 * for GMAC1, 12-17 bytes for GMAC2 and 18-23 bytes for GMAC3
		 */
		art_offset = ((loff_t) ipq_smem_flash_info.flash_block_size * start_blocks);

		ret = nand_read(&nand_info[flash_type], art_offset, &length, enetaddr);
		if (ret < 0)
			printf("ART partition read failed..\n");
#ifdef CONFIG_IPQ_MMC
	} else {
		blk_dev = mmc_get_dev(mmc_host.dev_num);
		ret = find_part_efi(blk_dev, "0:ART", &disk_info);
		/*
		 * ART partition 0th position (6 * 4) 24 bytes will contain the
		 * 4 MAC Address. First 0-5 bytes for GMAC0, Second 6-11 bytes
		 * for GMAC1, 12-17 bytes for GMAC2 and 18-23 bytes for GMAC3
		 */
		if (ret > 0) {
			mmc = mmc_host.mmc;
			ret = mmc->block_dev.block_read(mmc_host.dev_num, disk_info.start, disk_info.size,
										enetaddr);
		}

		if (ret < 0)
			printf("ART partition read failed..\n");
#endif
	}
	return ret;
}