
Logic unit: Purpose: Add support for bare partitions (no partition table) Author: Antnoio R. Costa <antonio.costa <at> atmel.com> Date : 11 Jun 2008
Status: ~~~~~~ Some SD cards are not formatted with a partition table but with just a bare partition at the beginnig of the memory.
I modified get_partition_info_extended to call test_block_type as done by print_partition_extended. In this way bare FAT partitions are recognised. Now we need a test for Ext2.
Signed-off-by: Antonio R. Costa antonio.costa@atmel.com
diff --git a/disk/part_dos.c b/disk/part_dos.c index 4d778ec..e5cc8aa 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -1,4 +1,7 @@ /* + * (C) Copyright 2008 Atmel Corp. + * Antonio R. Costa <antonio.costa <at> atmel.com> + * <costa.antonior <at> gmail.com> * (C) Copyright 2001 * Raymond Lo, lo@routefree.com * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -53,6 +56,11 @@ static inline int le32_to_int(unsigned char *le32) ); }
+static inline int le16_to_int(unsigned char *le16) +{ + return ((le16[1] << 8) + le16[0]); +} + static inline int is_extended(int part_type) { return (part_type == 0x5 || @@ -166,12 +174,20 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part unsigned char buffer[DEFAULT_SECTOR_SIZE]; dos_partition_t *pt; int i; - + if (dev_desc->block_read (dev_desc->dev, ext_part_sector, 1, (ulong *) buffer) != 1) { printf ("** Can't read partition table on %d:%d **\n", dev_desc->dev, ext_part_sector); return -1; } + +/* + * ARC: This check is bad: + * unfortunately both MBR and FAT bootsector + * have a sign 0x55aa @ 0x1FF + * I replaced it by test_block_type as in + * print_partition_extended + if (buffer[DOS_PART_MAGIC_OFFSET] != 0x55 || buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) { printf ("bad MBR sector signature 0x%02x%02x\n", @@ -179,7 +195,19 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part buffer[DOS_PART_MAGIC_OFFSET + 1]); return -1; } - +*/ + i=test_block_type(buffer); + + if(i==-1) { + printf ("bad MBR sector signature 0x%02x%02x\n", + buffer[DOS_PART_MAGIC_OFFSET], + buffer[DOS_PART_MAGIC_OFFSET + 1]); + return -1; + } + + if(i==DOS_PBR) + return -1; + /* Print all primary/logical partitions */ pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET); for (i = 0; i < 4; i++, pt++) { @@ -193,6 +221,7 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part info->blksz = 512; info->start = ext_part_sector + le32_to_int (pt->start4); info->size = le32_to_int (pt->size4); + switch(dev_desc->if_type) { case IF_TYPE_IDE: case IF_TYPE_SATA: @@ -208,6 +237,13 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part case IF_TYPE_DOC: sprintf ((char *)info->name, "docd%c%d\n", 'a' + dev_desc->dev, part_num); break; + case IF_TYPE_MMC: + sprintf ((char *)info->name, "mmc%c%d\n", 'a' + dev_desc->dev, part_num); + break; + case IF_TYPE_SD: + case IF_TYPE_SDHC: + sprintf ((char *)info->name, "sd%c%d\n", 'a' + dev_desc->dev, part_num); + break; default: sprintf ((char *)info->name, "xx%c%d\n", 'a' + dev_desc->dev, part_num); break;