FAT mbr on MMC or SD cards
Hi all,
I've been testing a wide variety of MMC/SD cards straight out of the package. Some cards have a MBR at sector 0 (like a hard drive) while others are unpartitioned with a volume boot sector at sector 0 (like a floppy). And it might change if you reformat the card.
I'm still on 1.1.5, but I didn't see any major changes in 1.1.6. Within fs/fat/fat.c one of the first functions file_fat_detectfs() calls read_bootsectandvi(). I think I need to make, and then submit patches for, a few changes:
1. This code assumes that sector 0 contains a VBR. Instead I think it should decide if 0 is an MBR or VBR, or even better utilize the dev:part command line. Can I make this determination that from the first three bytes, or is there a better way?
2. The decision of fat12, fat16, and fat32 is made upon fat_length and an ascii field. The Microsoft document claims that the determination shall be made only by the count of clusters. Any disputes on that fix?
3. Structure boot_sector may need a packed attribute. As far as I can tell there are no makefile flags so gcc is free to add padding to align members inside structures. This would be a problem for the memcpy from block to boot_sector within read_bootsectandvi(). What is the coding standard for specifying 1-byte packing where necessary? Just add the gcc attribute?
Thanks!
-joey
Quoted 7 lines · In message <[email protected]> you wrote:
I've been testing a wide variety of MMC/SD cards straight out of the package. Some cards have a MBR at sector 0 (like a hard drive) while others are unpartitioned with a volume boot sector at sector 0 (like a floppy). And it might change if you reformat the card.
I'm still on 1.1.5, but I didn't see any major changes in 1.1.6. Within
Comparing to ancient versions probably shows little difference in that area. indeed.
Quoted 8 lines
fs/fat/fat.cone of the first functionsfile_fat_detectfs()callsread_bootsectandvi(). I think I need to make, and then submit patches for, a few changes:1. This code assumes that sector 0 contains a VBR. Instead I think it should decide if 0 is an MBR or VBR, or even better utilize the dev:part command line. Can I make this determination that from the first three bytes, or is there a better way?
We have a patch in the queue to fix this, but it did not pass our internal review and unfortunately the engineer is on vacation right now so he cannot clean it up. Please be patiend for a week or two.
Quoted 3 lines
2. The decision of fat12, fat16, and fat32 is made upon
fat_lengthand an ascii field. The Microsoft document claims that the determination shall be made only by the count of clusters. Any disputes on that fix?
I have no idea...
Quoted 5 lines
3. Structure
boot_sectormay need a packed attribute. As far as I can tell there are no makefile flags so gcc is free to add padding to align members inside structures. This would be a problem for the memcpy from block toboot_sectorwithinread_bootsectandvi(). What is the coding standard for specifying 1-byte packing where necessary? Just add the gcc attribute?
Just add "__attribute__ ((packed))".
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de If I can have honesty, it's easier to overlook mistakes. -- Kirk, "Space Seed", stardate 3141.9
"Wolfgang Denk" <[email protected]> wrote in message news:20070613184133.A9478352681 at atlas.denx.de...
Quoted 10 lines
Quoted 6 lines
1. This code assumes that sector 0 contains a VBR. Instead I think it should
decide if 0 is an MBR or VBR, or even better utilize the dev:part command line. Can I make this determination that from the first three bytes, or is
there a better way?We have a patch in the queue to fix this, but it did not pass our internal review and unfortunately the engineer is on vacation right now so he cannot clean it up. Please be patiend for a week or two.
I wanted to share that with the list in case anybody else gets stuck.
Since my original email, I noticed code in fat_register_device() which determines a part_offset for 1.1.5 and 1.1.6. For now I've hacked this code to check the first three bytes EB:xx:90 or E9:xx:xx to make the mbr/pbr decision instead of the ascii string. Also I have it reading the valid partition offset instead of assuming 32. And finally I added a packed attribute to all structs.
Quoted 6 lines
Quoted 4 lines
2. The decision of fat12, fat16, and fat32 is made upon
fat_lengthand an ascii field. The Microsoft document claims that the determination shall be
made only by the count of clusters. Any disputes on that fix?I have no idea...
I was reading a document "FAT: General Overfiew of On-Disk Format" v1.02 May 5, 1999 by Microsoft Corporation. The correct way is to calculate CountofClusters. Less than 4085 is FAT12, less than 65525 is FAT16, anything else is FAT32. I'll watch, and after he gets back from vacation we can do something about it.
-joey
From "abiyani at unix dot telasic dot com" at unix.telasic.com Wed Jun 13 23:01:29 2007
From: "abiyani at unix dot telasic dot com" at unix.telasic.com (Arun Biyani)
Date: Wed, 13 Jun 2007 14:01:29 -0700
Subject: [U-Boot-Users] U-Boot 1.2 - Cannot run hello_world - Coldfire
Message-ID: <[email protected]>
I have a target board with a Coldfire CPU. I am unable to run the example programhello_world which comes with the distribution. Transcript of session is below. What
am I missing? The cross compile tools were run on Linux (FC 7), downloaded from
snapgear.org uClinux directory. I tried this with v1.1.6 also. I'll be glad to provide
any additional data. I have just started with U-Boot so please be explicit. On the host,
I was running Tera Term and used "send file" from the "File" menu to send the srec file.
I ran the program with parameters as well with the same result.
U-Boot 1.2.0 (Jun 13 2007 - 07:36:11)
CPU: Freescale MCF5272 (Mask:1) Board: Telasic RLB 2.0 DRAM: 16 MB FLASH: 32 MB In: serial Out: serial Err: serial Hit any key to stop autoboot: 0
->
-> ds
Unknown command 'ds' - try 'help'
-> loads
## Ready for S-Record download ...
## First Load Addr = 0x00020000
## Last Load Addr = 0x000222F7
## Total Size = 0x000022F8 = 8952 Bytes
## Start Addr = 0x00020000
-> go 0x00020004
## Starting application at 0x00020004 ...
*** Unexpected exception ***
Vector Number: 4 Format: 04 Fault Status: 0
PC: 00ff94fc SR: 00002004 SP: 00f6db0c
D0: 00000000 D1: 0000048c D2: 00000000 D3: 00ff8fac
D4: 000000f3 D5: 00000000 D6: 00000000 D7: 00f7df90
A0: 00fed912 A1: 00ff94fc A2: 00020004 A3: 00f6ded8
A4: 00000002 A5: 00ff7300 A6: 00f6db8c
*** Please Reset Board! ***