| #ifndef __BLOCK_H |
| #define __BLOCK_H |
| |
| #include "types.h" // u32 |
| |
| |
| /**************************************************************** |
| * Disk command request |
| ****************************************************************/ |
| |
| struct disk_op_s { |
| void *buf_fl; |
| struct drive_s *drive_fl; |
| u8 command; |
| u16 count; |
| union { |
| // Commands: READ, WRITE, VERIFY, SEEK, FORMAT |
| u64 lba; |
| // Commands: SCSI |
| struct { |
| u16 blocksize; |
| void *cdbcmd; |
| }; |
| }; |
| }; |
| |
| #define CMD_RESET 0x00 |
| #define CMD_READ 0x02 |
| #define CMD_WRITE 0x03 |
| #define CMD_VERIFY 0x04 |
| #define CMD_FORMAT 0x05 |
| #define CMD_SEEK 0x07 |
| #define CMD_ISREADY 0x10 |
| #define CMD_SCSI 0x20 |
| |
| |
| /**************************************************************** |
| * Global storage |
| ****************************************************************/ |
| |
| struct chs_s { |
| u16 head; |
| u16 cylinder; |
| u16 sector; |
| u16 pad; |
| }; |
| |
| struct drive_s { |
| u8 type; // Driver type (DTYPE_*) |
| u8 floppy_type; // Type of floppy (only for floppy drives). |
| struct chs_s lchs; // Logical CHS |
| u64 sectors; // Total sectors count |
| u32 cntl_id; // Unique id for a given driver type. |
| u32 max_bytes_transfer; // maximum number of bytes which can bet transferred at once |
| u8 removable; // Is media removable (currently unused) |
| |
| // Info for EDD calls |
| u8 translation; // type of translation |
| u16 blksize; // block size |
| struct chs_s pchs; // Physical CHS |
| |
| u8 target, lun; // SCSI target and LUN |
| }; |
| |
| #define DISK_SECTOR_SIZE 512 |
| #define CDROM_SECTOR_SIZE 2048 |
| |
| #define DTYPE_NONE 0x00 |
| #define DTYPE_FLOPPY 0x10 |
| #define DTYPE_ATA 0x20 |
| #define DTYPE_ATA_ATAPI 0x21 |
| #define DTYPE_RAMDISK 0x30 |
| #define DTYPE_CDEMU 0x40 |
| #define DTYPE_AHCI 0x50 |
| #define DTYPE_AHCI_ATAPI 0x51 |
| #define DTYPE_VIRTIO_SCSI 0x60 |
| #define DTYPE_VIRTIO_BLK 0x61 |
| #define DTYPE_USB 0x70 |
| #define DTYPE_USB_32 0x71 |
| #define DTYPE_UAS 0x72 |
| #define DTYPE_UAS_32 0x73 |
| #define DTYPE_LSI_SCSI 0x80 |
| #define DTYPE_ESP_SCSI 0x81 |
| #define DTYPE_MEGASAS 0x82 |
| #define DTYPE_PVSCSI 0x83 |
| #define DTYPE_MPT_SCSI 0x84 |
| #define DTYPE_SDCARD 0x90 |
| #define DTYPE_NVME 0x91 |
| |
| #define MAXDESCSIZE 80 |
| |
| #define TRANSLATION_NONE 0 |
| #define TRANSLATION_LBA 1 |
| #define TRANSLATION_LARGE 2 |
| #define TRANSLATION_RECHS 3 |
| #define TRANSLATION_HOST 4 |
| |
| #define EXTTYPE_FLOPPY 0 |
| #define EXTTYPE_HD 1 |
| #define EXTTYPE_CD 2 |
| |
| #define EXTSTART_HD 0x80 |
| #define EXTSTART_CD 0xE0 |
| |
| |
| /**************************************************************** |
| * Function defs |
| ****************************************************************/ |
| |
| // block.c |
| extern u8 FloppyCount, CDCount; |
| extern u8 *bounce_buf_fl; |
| struct drive_s *getDrive(u8 exttype, u8 extdriveoffset); |
| int getDriveId(u8 exttype, struct drive_s *drive); |
| void map_floppy_drive(struct drive_s *drive); |
| void map_hd_drive(struct drive_s *drive); |
| void map_cd_drive(struct drive_s *drive); |
| struct int13dpt_s; |
| int fill_edd(struct segoff_s edd, struct drive_s *drive_fl); |
| void block_setup(void); |
| int default_process_op(struct disk_op_s *op); |
| int process_op(struct disk_op_s *op); |
| int create_bounce_buf(void); |
| |
| #endif // block.h |