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