summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock/include/rtems/ide_part_table.h
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-10-28 14:00:43 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-10-28 14:00:43 +0000
commitef142d71a50c742ee9e4e9c53052a53d8bbfffcf (patch)
tree69eb3fab240ffead981c8e458a7d20e11ceeab68 /cpukit/libblock/include/rtems/ide_part_table.h
parent2002-10-28 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-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.h186
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__ */