From c7f7934e8f74be4b98abe83c2f6a2593fd294cf0 Mon Sep 17 00:00:00 2001 From: Björn Stenberg Date: Fri, 3 May 2002 11:59:53 +0000 Subject: Added disk/partition handling git-svn-id: svn://svn.rockbox.org/rockbox/trunk@405 a1c6a512-1295-4272-9138-f99709370657 --- firmware/common/disk.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 firmware/common/disk.c (limited to 'firmware/common/disk.c') diff --git a/firmware/common/disk.c b/firmware/common/disk.c new file mode 100644 index 0000000000..9572f115e5 --- /dev/null +++ b/firmware/common/disk.c @@ -0,0 +1,74 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Björn Stenberg + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "ata.h" +#include "debug.h" +#include "disk.h" + +/* Partition table entry layout: + ----------------------- + 0: 0x80 - active + 1: starting head + 2: starting sector + 3: starting cylinder + 4: partition type + 5: end head + 6: end sector + 7: end cylinder + 8-11: starting sector (LBA) + 12-15: nr of sectors in partition +*/ + +#define BYTES2INT32(array,pos) \ + (array[pos] | (array[pos+1] << 8 ) | \ + (array[pos+2] << 16 ) | (array[pos+3] << 24 )) + +struct partinfo part[8]; + +int disk_init(void) +{ + int i; + unsigned char sector[512]; + + ata_read_sectors(0,1,§or); + + /* check that the boot sector is initialized */ + if ( (sector[510] != 0x55) || + (sector[511] != 0xaa)) { + DEBUGF("Bad boot sector signature\n"); + return -1; + } + + /* parse partitions */ + for ( i=0; i<4; i++ ) { + unsigned char* ptr = sector + 0x1be + 16*i; + part[i].type = ptr[4]; + part[i].start = BYTES2INT32(ptr, 8); + part[i].size = BYTES2INT32(ptr, 12); + + DEBUGF("Part%d: Type %02x, start: %08x size: %08x\n", + i,part[i].type,part[i].start,part[i].size); + + /* extended? */ + if ( part[i].type == 5 ) { + /* not handled yet */ + } + } + + return 0; +} -- cgit v1.2.3