1 #ifndef __IDE_ATAPI__ 2 #define __IDE_ATAPI__ 3 4 #include "scsi.h" 5 6 /*ATAPI stuff*/ 7 typedef struct ATAPI 8 { 9 int (*ready)(void); 10 int (*medium_changed)(void); 11 int (*readtoc)(uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single); 12 int (*readtoc_session)(uint8_t *b, int msf, int maxlen); 13 int (*readtoc_raw)(uint8_t *b, int maxlen); 14 uint8_t (*getcurrentsubchannel)(uint8_t *b, int msf); 15 int (*readsector)(uint8_t *b, int sector, int count); 16 void (*readsector_raw)(uint8_t *b, int sector); 17 void (*playaudio)(uint32_t pos, uint32_t len, int ismsf); 18 void (*seek)(uint32_t pos); 19 void (*load)(void); 20 void (*eject)(void); 21 void (*pause)(void); 22 void (*resume)(void); 23 uint32_t (*size)(void); 24 int (*status)(void); 25 int (*is_track_audio)(uint32_t pos, int ismsf); 26 void (*stop)(void); 27 void (*exit)(void); 28 } ATAPI; 29 30 extern ATAPI *atapi; 31 32 void atapi_discchanged(); 33 34 typedef struct atapi_device_t 35 { 36 scsi_bus_t bus; 37 38 uint8_t command[12]; 39 int command_pos; 40 41 int state; 42 43 int max_transfer_len; 44 45 uint8_t data[65536]; 46 int data_read_pos, data_write_pos; 47 48 int bus_state; 49 50 struct IDE *ide; 51 52 int board; 53 uint8_t *atastat; 54 uint8_t *error; 55 int *cylinder; 56 57 int use_dma; 58 } atapi_device_t; 59 60 void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val); 61 uint16_t atapi_data_read(atapi_device_t *atapi_dev); 62 void atapi_command_start(atapi_device_t *atapi, uint8_t features); 63 uint8_t atapi_read_iir(atapi_device_t *atapi_dev); 64 uint8_t atapi_read_drq(atapi_device_t *atapi_dev); 65 void atapi_process_packet(atapi_device_t *atapi_dev); 66 void atapi_set_transfer_granularity(atapi_device_t *atapi_dev, int size); 67 68 #endif 69