diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-10-28 14:00:43 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-10-28 14:00:43 +0000 |
commit | ef142d71a50c742ee9e4e9c53052a53d8bbfffcf (patch) | |
tree | 69eb3fab240ffead981c8e458a7d20e11ceeab68 /cpukit/libblock/include/rtems/ide_part_table.h | |
parent | 2002-10-28 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-ef142d71a50c742ee9e4e9c53052a53d8bbfffcf.tar.bz2 |
2002-10-28 Eugeny S. Mints <Eugeny.Mints@oktet.ru>
* Added ATA support.
* include/rtems/blkdev.h: Added last IO status.
* include/rtems/ata.h, include/rtems/ata_internal.h,
include/rtems/ide_part_table.h, src/ata.c, src/ide_part_table.c: New
files.
Diffstat (limited to 'cpukit/libblock/include/rtems/ide_part_table.h')
-rw-r--r-- | cpukit/libblock/include/rtems/ide_part_table.h | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/cpukit/libblock/include/rtems/ide_part_table.h b/cpukit/libblock/include/rtems/ide_part_table.h new file mode 100644 index 0000000000..79d3f7710a --- /dev/null +++ b/cpukit/libblock/include/rtems/ide_part_table.h @@ -0,0 +1,186 @@ +/***************************************************************************** + * + * ide_part_table.h + * + * The header file for library supporting "MS-DOS-style" partition table + * + * + * Copyright (C) 2002 OKTET Ltd., St.-Petersburg, Russia + * + * Author: Konstantin Abramenko <Konstantin.Abramenko@oktet.ru> + * Alexander Kukuta <Alexander.Kukuta@oktet.ru> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + * + *****************************************************************************/ + +#ifndef __RTEMS_IDE_PART_TABLE_H__ +#define __RTEMS_IDE_PART_TABLE_H__ + +#include <assert.h> +#include <chain.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <rtems.h> +#include <rtems/blkdev.h> +#include <rtems/libio.h> +#include <rtems/libio_.h> +#include <rtems/bdbuf.h> +#include <rtems/seterr.h> + +/* Minor base number for all logical devices */ +#define RTEMS_IDE_SECTOR_BITS 9 +#define RTEMS_IDE_SECTOR_SIZE 512 +#define RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE 16 +#define RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER 63 +#define RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER 4 +#define RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX 16 + +#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1 0x55 +#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA2 0xaa +#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET 0x1fe +#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be +#define RTEMS_IDE_PARTITION_BOOTABLE_OFFSET 0 +#define RTEMS_IDE_PARTITION_SYS_TYPE_OFFSET 4 +#define RTEMS_IDE_PARTITION_START_OFFSET 8 +#define RTEMS_IDE_PARTITION_SIZE_OFFSET 12 + +/* + * Conversion from and to little-endian byte order. (no-op on i386/i486) + */ + +#if (CPU_BIG_ENDIAN == TRUE) +# define LE_TO_CPU_U16(v) CPU_swap_u16(v) +# define LE_TO_CPU_U32(v) CPU_swap_u32(v) +# define CPU_TO_LE_U16(v) CPU_swap_u16(v) +# define CPU_TO_LE_U32(v) CPU_swap_u32(v) +#else +# define LE_TO_CPU_U16(v) (v) +# define LE_TO_CPU_U32(v) (v) +# define CPU_TO_LE_U16(v) (v) +# define CPU_TO_LE_U32(v) (v) +#endif + + +/* + * sector_data_t -- + * corresponds to the sector on the device + */ +typedef struct sector_data_s +{ + unsigned32 sector_num; /* sector number on the device */ + unsigned8 data[0]; /* raw sector data */ +} sector_data_t; + + +/* + * Enum partition types + */ +enum { + EMPTY_PARTITION = 0, + EXTENDED_PARTITION = 5, + DM6_PARTITION = 0x54, + EZD_PARTITION = 0x55, + DM6_AUX1PARTITION = 0x51, + DM6_AUX3PARTITION = 0x53, + LINUX_SWAP = 0x82, + LINUX_NATIVE = 0x83, + LINUX_EXTENDED = 0x85 +}; + + +/* Forward declaration */ +struct disk_desc_s; + +/* + * part_desc_t -- + * contains all neccessary information about partition + */ +typedef struct part_desc_s { + unsigned8 bootable; /* is the partition active */ + unsigned8 sys_type; /* type of partition */ + unsigned8 log_id; /* logical number of partition */ + unsigned32 start; /* first partition sector, in absolute numeration */ + unsigned32 size; /* size in sectors */ + unsigned32 end; /* last partition sector, end = start + size - 1 */ + struct disk_desc_s *disk_desc; /* descriptor of disk, partition contains in */ + struct part_desc_s *ext_part; /* extended partition containing this one */ + + /* partitions, containing in this one */ + struct part_desc_s *sub_part[RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER]; +} part_desc_t; + + + +typedef struct disk_desc_s { + dev_t dev; /* device number */ + + /* device name in /dev filesystem */ + unsigned8 dev_name[RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX]; + + unsigned32 sector_size; /* size of sector */ + unsigned32 sector_bits; /* the base-2 logarithm of sector_size */ + unsigned32 lba_size; /* total amount of sectors in lba address mode */ + int last_log_id; /* used for logical disks enumerating */ + + /* primary partition descriptors */ + part_desc_t *partitions[RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER]; +} disk_desc_t; + + +/* + * rtems_ide_part_table_free -- + * frees disk descriptor structure + * + * PARAMETERS: + * disk_desc - disc descriptor structure to free + * + * RETURNS: + * N/A + */ +void +rtems_ide_part_table_free(disk_desc_t *disk_desc); + + +/* + * rtems_ide_part_table_get -- + * reads partition table structure from the device + * and creates disk description structure + * + * PARAMETERS: + * dev_name - path to physical device in /dev filesystem + * disk_desc - returned disc description structure + * + * RETURNS: + * RTEMS_SUCCESSFUL if success, or -1 and corresponding errno else + */ +rtems_status_code +rtems_ide_part_table_get(const char *dev_name, disk_desc_t *disk_desc); + + +/* + * rtems_ide_part_table_initialize -- + * initializes logical devices on the physical IDE drive + * + * PARAMETERS: + * dev_name - path to physical device in /dev filesystem + * + * RETURNS: + * RTEMS_SUCCESSFUL if success, or -1 and corresponding errno else + */ +rtems_status_code +rtems_ide_part_table_initialize(char *dev_name); + + +#endif /* __RTEMS_IDE_PART_TABLE_H__ */ |