[U-Boot-Users] [PATCH 1/1] FAT Bare Partition Support

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;

Hi Antonio
I am not responsible for this part of U-BOOT but your patch contain coding style violation.
Regards, Michal Simek
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>
choose only one email
- (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]);
+}
this should be in header file
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;
Coding style issue.
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;
Regards, Michal Simek

Michal Simek wrote:
Hi Antonio
I am not responsible for this part of U-BOOT but your patch contain coding style violation.
Regards, Michal Simek
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
[snip]
+static inline int le16_to_int(unsigned char *le16) +{
- return ((le16[1] << 8) + le16[0]);
+}
this should be in header file
Please use <asm/byteorder.h> rather than making Yet Another Define. Note that the subdirectory asm gets symlinked to the appropriate arch-specific subdirectory and then the right endian munching is selected and it Just Works[tm].
PowerPC example: http://git.denx.de/?p=u-boot.git;a=blob;f=include/asm-ppc/byteorder.h;h=3f5bcf63a1f980eb0c5e95e458119f55f5855274;hb=HEAD
[snip]
Regards, Michal Simek
Thanks, gvb

2008/6/16 Jerry Van Baren gerald.vanbaren@ge.com:
Michal Simek wrote:
Hi Antonio
I am not responsible for this part of U-BOOT but your patch contain coding style violation.
Regards, Michal Simek
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
[snip]
+static inline int le16_to_int(unsigned char *le16)
+{
- return ((le16[1] << 8) + le16[0]);
+}
this should be in header file
Please use <asm/byteorder.h> rather than making Yet Another Define. Note that the subdirectory asm gets symlinked to the appropriate arch-specific subdirectory and then the right endian munching is selected and it Just Works[tm].
PowerPC example: < http://git.denx.de/?p=u-boot.git;a=blob;f=include/asm-ppc/byteorder.h;h=3f5b...
Telling the truth it seems that I've used this function during debug in fact at a deeper look it seems it disappeared from the code a part the definition. Ok I'm going to fix the problem and re-submit.
In these cases is there a special manner to format the subject to make an explicit reference to a patched patch :) ?
Regards, Antonio
[snip]
Regards,
Michal Simek
Thanks, gvb

Hi JC, I have been busy on writing a Linux driver for the DSP on our AT572D940HF-EB board. Furthermore in the next 3 weeks I'm on vacation, please gimme more time cause I would like rework this patch but also support for our board and SDHC support for all Atmel devices together with Haarvard.
Regards, Antonio R.
2008/8/2 Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com
Telling the truth it seems that I've used this function during debug
in
fact at a deeper look it seems it disappeared from the code a part the definition. Ok I'm going to fix the problem and re-submit.
Any update about the re-submit patch?
Best Regards, J.
participants (4)
-
Antonio R. Costa
-
Jean-Christophe PLAGNIOL-VILLARD
-
Jerry Van Baren
-
Michal Simek