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; }
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; }
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; }
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; }
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; }
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; }
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; }
/* * 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; }