Hallo, habe erfolgreich eine MMC mit nem AVR ansteuern können. Nun wollte ich mit dem Dateisystem FAT anfangen und lese die Partitionstabelle im MBR aus. Die letzten 66 Bytes habe ich mitdokummentiert, jedoch sieht das alles nicht nach Adressen aus (Medienfehler, Taste drücken)??? Siehe Bild Bytes 446-512 Abschluss mit 55h AAh Was hat der Text zu bedeuten? Das kann doch nicht die Adresse sein? Gruß Alex
Hi, die Karte wurde wohl mit windows formatiert. Ich habe hier auch ein Projekt, bei dem eine MMC verwendet wird. Dabei habe ich fetsgestellt, das windows bei meiner MMC garkeinen MBR an den Anfang schreibt, sondern direkt mit der FAT Partition anfaengt. Schau dir doch mal die restlichen Werte im ersten Sektor an. Ich wette, das du die typischen FAT Standardwerte findest(512 Byte pro Sektor, 0x20 reservierte Sektoren, 2FATs) Gruß Tobias
nur zur info... ohne mbr und partition zeugs heisst superfloppy... usb-sticks werden gerne so vergewaltigt um ein paar bytes mehr rauszuholen oder weiß gott warum.... ich hab hier im forum schon gepostet wie man die dinger wieder mit mbr/partitionen usw versieht ;) 73
Meine MMC mit 32MB hat MBR und VBR, alles an den richtigen stellen: 0, 64, 66, 552 MBR, VBR, FAT, (data oder root, dont know) dave
So jetzt habe ich doch noch Fragen dazu. Habe jetzt die ersten 62 Bytes (FAT16 Boot Record) vor mir liegen. Ich weiß aber nicht so richtig wie es nun weitergeht. Auf dieser Seite habe hole ich meine Informationen: http://home.teleport.com/~brainy/fat16.htm Bis jetzt vermute ich folgende Vorgehensweise... Die ersten 2 Bytes ist ein Sprungcode (Adresse 0x00) zu diesem Spruncode werden die reservierten Sektoren addiert (0x20) dann wird die (Anzahl der Sektoren pro FAT)*2 addiert (1Word) und das soll mein Root Directory Entry geben. Wobei mich die Anzahl Sektoren pro FAT irritieren. Sollen das nicht Cluster sein? So komme ich nie auf meine Speicherkarte (256MB)! Gruß Alex
Bei FAT16 ist ein FAT-Eintrag zwei Byte groß. Da in einen Sektor 512 Byte passen, können also 256 FAT-Einträge in einem Sektor abgelegt werden. Da maximal 2^64 FAT-Einträge möglich sind, resultiert so eine maximale FAT-Größe von 128 kByte, was 256 Sektoren sind. Der Wert bei Offset 0x16 kann also nicht größer als 0x100 werden. Bei Dir steht da ein Wert von 0x00F5, (dez. 245) die Anzahl der Sektoren pro Cluster (Offset 0xD) beträgt 8, also 4 kByte. Damit kann diese FAT eine Gesamtgröße von 245 256 8 = 501760 Sektoren 501760 Sektoren * 512 Bytes = 256901120 Bytes adressieren. Das korreliert mit dem Wert ab Offset 0x20 (Anzahl der Sektoren der Partition) von 0x7A800 (dez. 501760). <-- Kommt der Wert Dir bekannt vor?
;##################################################### ; volumen boot record ;´der 1. partition, enthalten im mbr (0) .equ mbr_offset = 0x0000 .equ vbr_address_offset = 0x01c6 ;##################################################### ; boot sector .equ bs_jmpboot = 0x00 ; char[3] .equ bs_oemname = 0x03 ; char[8] .equ bpb_bytespersec = 0x0b ; int .equ bpb_secperclus = 0x0d ; char .equ bpb_rsvdseccnt = 0x0e ; int .equ bpb_numfats = 0x10 ; char .equ bpb_rootentcnt = 0x11 ; int .equ bpb_totsec16 = 0x13 ; int .equ bpb_media = 0x15 ; char .equ bpb_fatsz16 = 0x16 ; int .equ bpb_secpertrk = 0x18 ; int .equ bpb_numheads = 0x1a ; int .equ bpb_hiddsec = 0x1c ; longint .equ bpb_totsec32 = 0x20 ; longint ; fat12 and fat16 .equ bs_drivenumber = 0x24 ; int .equ bs_reserved1 = 0x26 ; char .equ bs_bootsig = 0x27 ; longint .equ bs_volid = 0x2b ; char[11] .equ bs_vollab = 0x36 ; char[8] .equ bs_filsystype = 0x3e ; char[448] .equ bs_exemarker = 0x1fe ; char[2] ;##################################################### ; ram .equ ram_vbr_address = 0x150 ; word .equ ram_fat_address = 0x152 ; word .equ ram_root_address = 0x154 ; word .equ ram_data_address = 0x156 ; word .equ ram_sec_per_clus = 0x158 ; byte .equ ram_reserved_sectors = 0x159 ; word .equ ram_max_root_dir_ent = 0x15b ; word fat_load_info: ; where is the VBR? sts ram_address, null sts ram_address+1, null sts ram_address+2, null rcall mmc_read_sector ; read mbr (offset = 0) movi ram_vbr_address, ram_data + vbr_address_offset movi ram_vbr_address+1, ram_data + vbr_address_offset+1 ; where is the FAT? movi ram_address, ram_vbr_address movi ram_address+1, ram_vbr_address+1 sts ram_address+2, null rcall mmc_read_sector ; read vbr lds temp2, ram_vbr_address lds temp3, ram_vbr_address+1 lds temp4, ram_data + bpb_rsvdseccnt lds temp5, ram_data + bpb_rsvdseccnt+1 ; reserved sectors + partition's start = fat add temp2, temp4 adc temp3, temp5 sts ram_fat_address, temp2 sts ram_fat_address+1, temp3 ; where is the ROOT DIRECTORY? lds temp4, ram_data + bpb_fatsz16 lds temp5, ram_data + bpb_fatsz16+1 ; fat address + (sec per fat *2) = root lsl temp4 rol temp5 add temp2, temp4 adc temp3, temp5 sts ram_root_address, temp2 sts ram_root_address+1, temp3 ; where begins the DATA? ; root + (max root dir ent * 32)/bytes per sec ; ==> root + (512*32)/512 = root + 32 ldi temp1, 32 add temp2, temp1 adc temp3, null sts ram_data_address, temp2 sts ram_data_address+1, temp3 ret Das ist alles an die Source von Ulrich Radig angelehnt, bzw. anfangs. Da ich nicht immer verstanden hab, wasser da (in C) macht, hab ich nochmal neu angefangen, selbst durchdachter. Also: MBR ist Sektor 0. Den lad ich mir. Dann schau ich bei Offset 1BE (Anfang Partitionsinfo Part. 0) + 8 = 1C6 = Sektors between... Die werden bei mir direkt als VBR-Adresse abgelegt. Dann les ich den VBR aus (mit der vorher geholten Adresse). Die FAT fängt dann an: VBR + Reserved_Sectors. Also lad ich mit die Reserved Sectors udn addier die. Bei meiner 32er sinds nur 2. Dann lad ich (immernoch aus dem VBR) sec per fat, sollte ich mal nachschaun, was das ist. Wohl so wie Rufus das meint. Die x2 und auf die FAT-Adresse drauf, das ergibt den Root. Dannnn noch schaun, wieviel im Root maximal drin sein kann, sind normalerweise 512 Einträge, das rechne ich auch wärend des kompilierens (sonst halt aussem VBR holen) und jeder Eintrag hat 32byte: 512 * 32 / 512... 512 kürzt sich raus, bleiben 32 übrig. 32Sektoren Root-Directory, wird addiert. Da fangen deine Daten an. dave
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.