1*6a54128fSAndroid Build Coastguard Worker /* 2*6a54128fSAndroid Build Coastguard Worker * v1.0 3*6a54128fSAndroid Build Coastguard Worker * 4*6a54128fSAndroid Build Coastguard Worker * Disk I/O include file for the ext2fs/DOS library. 5*6a54128fSAndroid Build Coastguard Worker * 6*6a54128fSAndroid Build Coastguard Worker * Copyright (c) 1997 Mark Habersack 7*6a54128fSAndroid Build Coastguard Worker * 8*6a54128fSAndroid Build Coastguard Worker * %Begin-Header% 9*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Library 10*6a54128fSAndroid Build Coastguard Worker * General Public License, version 2. 11*6a54128fSAndroid Build Coastguard Worker * %End-Header% 12*6a54128fSAndroid Build Coastguard Worker */ 13*6a54128fSAndroid Build Coastguard Worker 14*6a54128fSAndroid Build Coastguard Worker #ifndef __diskio_h 15*6a54128fSAndroid Build Coastguard Worker #define __diskio_h 16*6a54128fSAndroid Build Coastguard Worker #ifdef __TURBOC__ 17*6a54128fSAndroid Build Coastguard Worker #ifndef __LARGE__ 18*6a54128fSAndroid Build Coastguard Worker # error "ext2fs/DOS library requires LARGE model!" 19*6a54128fSAndroid Build Coastguard Worker #endif 20*6a54128fSAndroid Build Coastguard Worker #endif 21*6a54128fSAndroid Build Coastguard Worker 22*6a54128fSAndroid Build Coastguard Worker #ifdef __TURBOC__ 23*6a54128fSAndroid Build Coastguard Worker #include "msdos.h" 24*6a54128fSAndroid Build Coastguard Worker #endif 25*6a54128fSAndroid Build Coastguard Worker 26*6a54128fSAndroid Build Coastguard Worker /* 27*6a54128fSAndroid Build Coastguard Worker * A helper structure used in LBA => CHS conversion 28*6a54128fSAndroid Build Coastguard Worker */ 29*6a54128fSAndroid Build Coastguard Worker typedef struct 30*6a54128fSAndroid Build Coastguard Worker { 31*6a54128fSAndroid Build Coastguard Worker unsigned short cyl; /* Cylinder (or track) */ 32*6a54128fSAndroid Build Coastguard Worker unsigned short head; 33*6a54128fSAndroid Build Coastguard Worker unsigned short sector; 34*6a54128fSAndroid Build Coastguard Worker unsigned short offset; /* Offset of byte within the sector */ 35*6a54128fSAndroid Build Coastguard Worker } CHS; 36*6a54128fSAndroid Build Coastguard Worker 37*6a54128fSAndroid Build Coastguard Worker /* 38*6a54128fSAndroid Build Coastguard Worker * All partition data we need is here 39*6a54128fSAndroid Build Coastguard Worker */ 40*6a54128fSAndroid Build Coastguard Worker typedef struct 41*6a54128fSAndroid Build Coastguard Worker { 42*6a54128fSAndroid Build Coastguard Worker char *dev; /* _Linux_ device name (like "/dev/hda1") */ 43*6a54128fSAndroid Build Coastguard Worker unsigned char phys; /* Physical DOS drive number */ 44*6a54128fSAndroid Build Coastguard Worker unsigned long start; /* LBA address of partition start */ 45*6a54128fSAndroid Build Coastguard Worker unsigned long len; /* length of partition in sectors */ 46*6a54128fSAndroid Build Coastguard Worker unsigned char pno; /* Partition number (read from *dev) */ 47*6a54128fSAndroid Build Coastguard Worker 48*6a54128fSAndroid Build Coastguard Worker /* This partition's drive geometry */ 49*6a54128fSAndroid Build Coastguard Worker unsigned short cyls; 50*6a54128fSAndroid Build Coastguard Worker unsigned short heads; 51*6a54128fSAndroid Build Coastguard Worker unsigned short sects; 52*6a54128fSAndroid Build Coastguard Worker } PARTITION; 53*6a54128fSAndroid Build Coastguard Worker 54*6a54128fSAndroid Build Coastguard Worker /* 55*6a54128fSAndroid Build Coastguard Worker * PC partition table entry format 56*6a54128fSAndroid Build Coastguard Worker */ 57*6a54128fSAndroid Build Coastguard Worker #ifdef __DJGPP__ 58*6a54128fSAndroid Build Coastguard Worker #pragma pack(1) 59*6a54128fSAndroid Build Coastguard Worker #endif 60*6a54128fSAndroid Build Coastguard Worker typedef struct 61*6a54128fSAndroid Build Coastguard Worker { 62*6a54128fSAndroid Build Coastguard Worker unsigned char active; 63*6a54128fSAndroid Build Coastguard Worker unsigned char start_head; 64*6a54128fSAndroid Build Coastguard Worker unsigned char start_sec; 65*6a54128fSAndroid Build Coastguard Worker unsigned char start_cyl; 66*6a54128fSAndroid Build Coastguard Worker unsigned char type; 67*6a54128fSAndroid Build Coastguard Worker unsigned char end_head; 68*6a54128fSAndroid Build Coastguard Worker unsigned char end_sec; 69*6a54128fSAndroid Build Coastguard Worker unsigned char end_cyl; 70*6a54128fSAndroid Build Coastguard Worker unsigned long first_sec_rel; 71*6a54128fSAndroid Build Coastguard Worker unsigned long size; 72*6a54128fSAndroid Build Coastguard Worker } PTABLE_ENTRY; 73*6a54128fSAndroid Build Coastguard Worker #ifdef __DJGPP__ 74*6a54128fSAndroid Build Coastguard Worker #pragma pack() 75*6a54128fSAndroid Build Coastguard Worker #endif 76*6a54128fSAndroid Build Coastguard Worker 77*6a54128fSAndroid Build Coastguard Worker /* 78*6a54128fSAndroid Build Coastguard Worker * INT 0x13 operation codes 79*6a54128fSAndroid Build Coastguard Worker */ 80*6a54128fSAndroid Build Coastguard Worker #define DISK_READ 0x02 81*6a54128fSAndroid Build Coastguard Worker #define DISK_WRITE 0x03 82*6a54128fSAndroid Build Coastguard Worker #define DISK_GET_GEOMETRY 0x08 83*6a54128fSAndroid Build Coastguard Worker #define DISK_READY 0x10 84*6a54128fSAndroid Build Coastguard Worker 85*6a54128fSAndroid Build Coastguard Worker /* 86*6a54128fSAndroid Build Coastguard Worker * Errors to put in _dio_error 87*6a54128fSAndroid Build Coastguard Worker */ 88*6a54128fSAndroid Build Coastguard Worker #define ERR_BADDEV 0x00000001L 89*6a54128fSAndroid Build Coastguard Worker #define ERR_HARDWARE 0x00000002L 90*6a54128fSAndroid Build Coastguard Worker #define ERR_NOTSUPP 0x00000003L 91*6a54128fSAndroid Build Coastguard Worker #define ERR_NOTEXT2FS 0x00000004L 92*6a54128fSAndroid Build Coastguard Worker #define ERR_EMPTYPART 0x00000005L 93*6a54128fSAndroid Build Coastguard Worker #define ERR_LINUXSWAP 0x00000006L 94*6a54128fSAndroid Build Coastguard Worker 95*6a54128fSAndroid Build Coastguard Worker /* 96*6a54128fSAndroid Build Coastguard Worker * Functions in diskio.c 97*6a54128fSAndroid Build Coastguard Worker */ 98*6a54128fSAndroid Build Coastguard Worker 99*6a54128fSAndroid Build Coastguard Worker /* 100*6a54128fSAndroid Build Coastguard Worker * Variable contains last module's error 101*6a54128fSAndroid Build Coastguard Worker */ 102*6a54128fSAndroid Build Coastguard Worker extern unsigned long _dio_error; 103*6a54128fSAndroid Build Coastguard Worker 104*6a54128fSAndroid Build Coastguard Worker /* 105*6a54128fSAndroid Build Coastguard Worker * This one contains last hardware error (if _dio_error == ERR_HARDWARE) 106*6a54128fSAndroid Build Coastguard Worker */ 107*6a54128fSAndroid Build Coastguard Worker extern unsigned long _dio_hw_error; 108*6a54128fSAndroid Build Coastguard Worker 109*6a54128fSAndroid Build Coastguard Worker /* 110*6a54128fSAndroid Build Coastguard Worker * Macros to check for disk hardware errors 111*6a54128fSAndroid Build Coastguard Worker */ 112*6a54128fSAndroid Build Coastguard Worker #define HW_OK() ((unsigned char)_dio_hw_error == 0x00) 113*6a54128fSAndroid Build Coastguard Worker #define HW_BAD_CMD() ((unsigned char)_dio_hw_error == 0x01) 114*6a54128fSAndroid Build Coastguard Worker #define HW_NO_ADDR_MARK() ((unsigned char)_dio_hw_error == 0x02) 115*6a54128fSAndroid Build Coastguard Worker #define HW_WRITE_PROT() ((unsigned char)_dio_hw_error == 0x03) 116*6a54128fSAndroid Build Coastguard Worker #define HW_NO_SECTOR() ((unsigned char)_dio_hw_error == 0x04) 117*6a54128fSAndroid Build Coastguard Worker #define HW_RESET_FAIL() ((unsigned char)_dio_hw_error == 0x05) 118*6a54128fSAndroid Build Coastguard Worker #define HW_DISK_CHANGED() ((unsigned char)_dio_hw_error == 0x06) 119*6a54128fSAndroid Build Coastguard Worker #define HW_DRIVE_FAIL() ((unsigned char)_dio_hw_error == 0x07) 120*6a54128fSAndroid Build Coastguard Worker #define HW_DMA_OVERRUN() ((unsigned char)_dio_hw_error == 0x08) 121*6a54128fSAndroid Build Coastguard Worker #define HW_DMA_BOUNDARY() ((unsigned char)_dio_hw_error == 0x09) 122*6a54128fSAndroid Build Coastguard Worker #define HW_BAD_SECTOR() ((unsigned char)_dio_hw_error == 0x0A) 123*6a54128fSAndroid Build Coastguard Worker #define HW_BAD_TRACK() ((unsigned char)_dio_hw_error == 0x0B) 124*6a54128fSAndroid Build Coastguard Worker #define HW_UNSUPP_TRACK() ((unsigned char)_dio_hw_error == 0x0C) 125*6a54128fSAndroid Build Coastguard Worker #define HW_BAD_CRC_ECC() ((unsigned char)_dio_hw_error == 0x10) 126*6a54128fSAndroid Build Coastguard Worker #define HW_CRC_ECC_CORR() ((unsigned char)_dio_hw_error == 0x11) 127*6a54128fSAndroid Build Coastguard Worker #define HW_CONTR_FAIL() ((unsigned char)_dio_hw_error == 0x20) 128*6a54128fSAndroid Build Coastguard Worker #define HW_SEEK_FAIL() ((unsigned char)_dio_hw_error == 0x40) 129*6a54128fSAndroid Build Coastguard Worker #define HW_ATTACH_FAIL() ((unsigned char)_dio_hw_error == 0x80) 130*6a54128fSAndroid Build Coastguard Worker #define HW_DRIVE_NREADY() ((unsigned char)_dio_hw_error == 0xAA) 131*6a54128fSAndroid Build Coastguard Worker #define HW_UNDEF_ERROR() ((unsigned char)_dio_hw_error == 0xBB) 132*6a54128fSAndroid Build Coastguard Worker #define HW_WRITE_FAULT() ((unsigned char)_dio_hw_error == 0xCC) 133*6a54128fSAndroid Build Coastguard Worker #define HW_STATUS_ERROR() ((unsigned char)_dio_hw_error == 0xE0) 134*6a54128fSAndroid Build Coastguard Worker #define HW_SENSE_FAIL() ((unsigned char)_dio_hw_error == 0xFF) 135*6a54128fSAndroid Build Coastguard Worker 136*6a54128fSAndroid Build Coastguard Worker 137*6a54128fSAndroid Build Coastguard Worker /* 138*6a54128fSAndroid Build Coastguard Worker * Open the specified partition. 139*6a54128fSAndroid Build Coastguard Worker * String 'dev' must have a format: 140*6a54128fSAndroid Build Coastguard Worker * 141*6a54128fSAndroid Build Coastguard Worker * /dev/{sd|hd|fd}[X] 142*6a54128fSAndroid Build Coastguard Worker * 143*6a54128fSAndroid Build Coastguard Worker * where, 144*6a54128fSAndroid Build Coastguard Worker * 145*6a54128fSAndroid Build Coastguard Worker * only one of the option in curly braces can be used and X is an optional 146*6a54128fSAndroid Build Coastguard Worker * partition number for the given device. If X is not specified, function 147*6a54128fSAndroid Build Coastguard Worker * scans the drive's partition table in search for the first Linux ext2fs 148*6a54128fSAndroid Build Coastguard Worker * partition (signature 0x83). Along the way it dives into every extended 149*6a54128fSAndroid Build Coastguard Worker * partition encountered. 150*6a54128fSAndroid Build Coastguard Worker * Scan ends if either (a) there are no more used partition entries, or 151*6a54128fSAndroid Build Coastguard Worker * (b) there is no Xth partition. 152*6a54128fSAndroid Build Coastguard Worker * 153*6a54128fSAndroid Build Coastguard Worker * Routine returns 0 on success and !=0 otherwise. 154*6a54128fSAndroid Build Coastguard Worker */ 155*6a54128fSAndroid Build Coastguard Worker int open_partition(char *dev); 156*6a54128fSAndroid Build Coastguard Worker 157*6a54128fSAndroid Build Coastguard Worker #endif /* __diskio_h */ 158