1 /* $NetBSD: cdio.h,v 1.34 2015/09/06 06:01:02 dholland Exp $ */ 2 3 #ifndef _SYS_CDIO_H_ 4 #define _SYS_CDIO_H_ 5 6 #include <sys/ioccom.h> 7 8 /* Shared between kernel & process */ 9 10 union msf_lba { 11 struct { 12 u_char unused; 13 u_char minute; 14 u_char second; 15 u_char frame; 16 } msf; 17 uint32_t lba; 18 u_char addr[4]; 19 }; 20 21 struct cd_toc_entry { 22 u_char nothing1; 23 #if BYTE_ORDER == LITTLE_ENDIAN 24 uint32_t control:4; 25 uint32_t addr_type:4; 26 #endif 27 #if BYTE_ORDER == BIG_ENDIAN 28 uint32_t addr_type:4; 29 uint32_t control:4; 30 #endif 31 u_char track; 32 u_char nothing2; 33 union msf_lba addr; 34 }; 35 36 struct cd_sub_channel_header { 37 u_char nothing1; 38 u_char audio_status; 39 #define CD_AS_AUDIO_INVALID 0x00 40 #define CD_AS_PLAY_IN_PROGRESS 0x11 41 #define CD_AS_PLAY_PAUSED 0x12 42 #define CD_AS_PLAY_COMPLETED 0x13 43 #define CD_AS_PLAY_ERROR 0x14 44 #define CD_AS_NO_STATUS 0x15 45 u_char data_len[2]; 46 }; 47 48 struct cd_sub_channel_q_data { 49 u_char data_format; 50 #if BYTE_ORDER == LITTLE_ENDIAN 51 uint32_t control:4; 52 uint32_t addr_type:4; 53 #endif 54 #if BYTE_ORDER == BIG_ENDIAN 55 uint32_t addr_type:4; 56 uint32_t control:4; 57 #endif 58 u_char track_number; 59 u_char index_number; 60 u_char absaddr[4]; 61 u_char reladdr[4]; 62 #if BYTE_ORDER == LITTLE_ENDIAN 63 uint32_t :7; 64 uint32_t mc_valid:1; 65 #endif 66 #if BYTE_ORDER == BIG_ENDIAN 67 uint32_t mc_valid:1; 68 uint32_t :7; 69 #endif 70 u_char mc_number[15]; 71 #if BYTE_ORDER == LITTLE_ENDIAN 72 uint32_t :7; 73 uint32_t ti_valid:1; 74 #endif 75 #if BYTE_ORDER == BIG_ENDIAN 76 uint32_t ti_valid:1; 77 uint32_t :7; 78 #endif 79 u_char ti_number[15]; 80 }; 81 82 struct cd_sub_channel_position_data { 83 u_char data_format; 84 #if BYTE_ORDER == LITTLE_ENDIAN 85 uint32_t control:4; 86 uint32_t addr_type:4; 87 #endif 88 #if BYTE_ORDER == BIG_ENDIAN 89 uint32_t addr_type:4; 90 uint32_t control:4; 91 #endif 92 u_char track_number; 93 u_char index_number; 94 union msf_lba absaddr; 95 union msf_lba reladdr; 96 }; 97 98 struct cd_sub_channel_media_catalog { 99 u_char data_format; 100 u_char nothing1; 101 u_char nothing2; 102 u_char nothing3; 103 #if BYTE_ORDER == LITTLE_ENDIAN 104 uint32_t :7; 105 uint32_t mc_valid:1; 106 #endif 107 #if BYTE_ORDER == BIG_ENDIAN 108 uint32_t mc_valid:1; 109 uint32_t :7; 110 #endif 111 u_char mc_number[15]; 112 }; 113 114 struct cd_sub_channel_track_info { 115 u_char data_format; 116 u_char nothing1; 117 u_char track_number; 118 u_char nothing2; 119 #if BYTE_ORDER == LITTLE_ENDIAN 120 uint32_t :7; 121 uint32_t ti_valid:1; 122 #endif 123 #if BYTE_ORDER == BIG_ENDIAN 124 uint32_t ti_valid:1; 125 uint32_t :7; 126 #endif 127 u_char ti_number[15]; 128 }; 129 130 struct cd_sub_channel_info { 131 struct cd_sub_channel_header header; 132 union { 133 struct cd_sub_channel_q_data q_data; 134 struct cd_sub_channel_position_data position; 135 struct cd_sub_channel_media_catalog media_catalog; 136 struct cd_sub_channel_track_info track_info; 137 } what; 138 }; 139 140 /* 141 * Ioctls for the CD drive 142 */ 143 struct ioc_play_track { 144 u_char start_track; 145 u_char start_index; 146 u_char end_track; 147 u_char end_index; 148 }; 149 150 #define CDIOCPLAYTRACKS _IOW('c', 1, struct ioc_play_track) 151 struct ioc_play_blocks { 152 int blk; 153 int len; 154 }; 155 #define CDIOCPLAYBLOCKS _IOW('c', 2, struct ioc_play_blocks) 156 157 struct ioc_read_subchannel { 158 u_char address_format; 159 #define CD_LBA_FORMAT 1 160 #define CD_MSF_FORMAT 2 161 u_char data_format; 162 #define CD_SUBQ_DATA 0 163 #define CD_CURRENT_POSITION 1 164 #define CD_MEDIA_CATALOG 2 165 #define CD_TRACK_INFO 3 166 u_char track; 167 int data_len; 168 struct cd_sub_channel_info *data; 169 }; 170 #define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel ) 171 172 #ifdef _KERNEL 173 /* As above, but with the buffer following the request for in-kernel users. */ 174 struct ioc_read_subchannel_buf { 175 struct ioc_read_subchannel req; 176 struct cd_sub_channel_info info; 177 }; 178 #define CDIOCREADSUBCHANNEL_BUF _IOWR('c', 3, struct ioc_read_subchannel_buf) 179 #endif 180 181 struct ioc_toc_header { 182 u_short len; 183 u_char starting_track; 184 u_char ending_track; 185 }; 186 187 #define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header) 188 189 struct ioc_read_toc_entry { 190 u_char address_format; 191 u_char starting_track; 192 u_short data_len; 193 struct cd_toc_entry *data; 194 }; 195 #define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry) 196 #define CDIOREADTOCENTRYS CDIOREADTOCENTRIES 197 198 #ifdef _KERNEL 199 /* As above, but with the buffer following the request for in-kernel users. */ 200 struct ioc_read_toc_entry_buf { 201 struct ioc_read_toc_entry req; 202 struct cd_toc_entry entry[100]; /* NB: 8 bytes each */ 203 }; 204 #define CDIOREADTOCENTRIES_BUF _IOWR('c', 5, struct ioc_read_toc_entry_buf) 205 #endif 206 207 /* read LBA start of a given session; 0=last, others not yet supported */ 208 #define CDIOREADMSADDR _IOWR('c', 6, int) 209 210 struct ioc_patch { 211 u_char patch[4]; /* one for each channel */ 212 }; 213 #define CDIOCSETPATCH _IOW('c', 9, struct ioc_patch) 214 215 struct ioc_vol { 216 u_char vol[4]; /* one for each channel */ 217 }; 218 #define CDIOCGETVOL _IOR('c', 10, struct ioc_vol) 219 #define CDIOCSETVOL _IOW('c', 11, struct ioc_vol) 220 #define CDIOCSETMONO _IO('c', 12) 221 #define CDIOCSETSTEREO _IO('c', 13) 222 #define CDIOCSETMUTE _IO('c', 14) 223 #define CDIOCSETLEFT _IO('c', 15) 224 #define CDIOCSETRIGHT _IO('c', 16) 225 #define CDIOCSETDEBUG _IO('c', 17) 226 #define CDIOCCLRDEBUG _IO('c', 18) 227 #define CDIOCPAUSE _IO('c', 19) 228 #define CDIOCRESUME _IO('c', 20) 229 #define CDIOCRESET _IO('c', 21) 230 #define CDIOCSTART _IO('c', 22) 231 #define CDIOCSTOP _IO('c', 23) 232 #define CDIOCEJECT _IO('c', 24) 233 #define CDIOCALLOW _IO('c', 25) 234 #define CDIOCPREVENT _IO('c', 26) 235 #define CDIOCCLOSE _IO('c', 27) 236 237 struct ioc_play_msf { 238 u_char start_m; 239 u_char start_s; 240 u_char start_f; 241 u_char end_m; 242 u_char end_s; 243 u_char end_f; 244 }; 245 #define CDIOCPLAYMSF _IOW('c', 25, struct ioc_play_msf) 246 247 struct ioc_load_unload { 248 u_char options; 249 #define CD_LU_ABORT 0x1 /* NOTE: These are the same as the ATAPI */ 250 #define CD_LU_UNLOAD 0x2 /* op values for the LOAD_UNLOAD command */ 251 #define CD_LU_LOAD 0x3 252 u_char slot; 253 }; 254 #define CDIOCLOADUNLOAD _IOW('c', 26, struct ioc_load_unload) 255 256 257 #if defined(_KERNEL) || defined(_EXPOSE_MMC) 258 /* not exposed to userland yet until its completely mature */ 259 /* 260 * MMC device abstraction interface. 261 * 262 * It gathers information from GET_CONFIGURATION, READ_DISCINFO, 263 * READ_TRACKINFO, READ_TOC2, READ_CD_CAPACITY and GET_CONFIGURATION 264 * SCSI/ATAPI calls regardless if its a legacy CD-ROM/DVD-ROM device or a MMC 265 * standard recordable device. 266 */ 267 struct mmc_discinfo { 268 uint16_t mmc_profile; 269 uint16_t mmc_class; 270 271 uint8_t disc_state; 272 uint8_t last_session_state; 273 uint8_t bg_format_state; 274 uint8_t link_block_penalty; /* in sectors */ 275 276 uint64_t mmc_cur; /* current MMC_CAPs */ 277 uint64_t mmc_cap; /* possible MMC_CAPs */ 278 279 uint32_t disc_flags; /* misc flags */ 280 281 uint32_t disc_id; 282 uint64_t disc_barcode; 283 uint8_t application_code; /* 8 bit really */ 284 285 uint8_t unused1[3]; /* padding */ 286 287 uint32_t last_possible_lba; /* last leadout start adr. */ 288 uint32_t sector_size; 289 290 uint16_t num_sessions; 291 uint16_t num_tracks; /* derived */ 292 293 uint16_t first_track; 294 uint16_t first_track_last_session; 295 uint16_t last_track_last_session; 296 297 uint16_t unused2; /* padding/misc info resv. */ 298 299 uint16_t reserved1[4]; /* MMC-5 track resources */ 300 uint32_t reserved2[3]; /* MMC-5 POW resources */ 301 302 uint32_t reserved3[8]; /* MMC-5+ */ 303 }; 304 #define MMCGETDISCINFO _IOR('c', 28, struct mmc_discinfo) 305 306 #define MMC_CLASS_UNKN 0 307 #define MMC_CLASS_DISC 1 308 #define MMC_CLASS_CD 2 309 #define MMC_CLASS_DVD 3 310 #define MMC_CLASS_MO 4 311 #define MMC_CLASS_BD 5 312 #define MMC_CLASS_FILE 0xffff /* emulation mode */ 313 314 #define MMC_DFLAGS_BARCODEVALID (1 << 0) /* barcode is present and valid */ 315 #define MMC_DFLAGS_DISCIDVALID (1 << 1) /* discid is present and valid */ 316 #define MMC_DFLAGS_APPCODEVALID (1 << 2) /* application code valid */ 317 #define MMC_DFLAGS_UNRESTRICTED (1 << 3) /* restricted, then set app. code */ 318 319 #define MMC_DFLAGS_FLAGBITS \ 320 "\10\1BARCODEVALID\2DISCIDVALID\3APPCODEVALID\4UNRESTRICTED" 321 322 #define MMC_CAP_SEQUENTIAL (1 << 0) /* sequential writable only */ 323 #define MMC_CAP_RECORDABLE (1 << 1) /* record-able; i.e. not static */ 324 #define MMC_CAP_ERASABLE (1 << 2) /* drive can erase sectors */ 325 #define MMC_CAP_BLANKABLE (1 << 3) /* media can be blanked */ 326 #define MMC_CAP_FORMATTABLE (1 << 4) /* media can be formatted */ 327 #define MMC_CAP_REWRITABLE (1 << 5) /* media can be rewritten */ 328 #define MMC_CAP_MRW (1 << 6) /* Mount Rainier formatted */ 329 #define MMC_CAP_PACKET (1 << 7) /* using packet recording */ 330 #define MMC_CAP_STRICTOVERWRITE (1 << 8) /* only writes a packet at a time */ 331 #define MMC_CAP_PSEUDOOVERWRITE (1 << 9) /* overwrite through replacement */ 332 #define MMC_CAP_ZEROLINKBLK (1 << 10) /* zero link block length capable */ 333 #define MMC_CAP_HW_DEFECTFREE (1 << 11) /* hardware defect management */ 334 335 #define MMC_CAP_FLAGBITS \ 336 "\10\1SEQUENTIAL\2RECORDABLE\3ERASABLE\4BLANKABLE\5FORMATTABLE" \ 337 "\6REWRITABLE\7MRW\10PACKET\11STRICTOVERWRITE\12PSEUDOOVERWRITE" \ 338 "\13ZEROLINKBLK\14HW_DEFECTFREE" 339 340 #define MMC_STATE_EMPTY 0 341 #define MMC_STATE_INCOMPLETE 1 342 #define MMC_STATE_FULL 2 343 #define MMC_STATE_CLOSED 3 344 345 #define MMC_BGFSTATE_UNFORM 0 346 #define MMC_BGFSTATE_STOPPED 1 347 #define MMC_BGFSTATE_RUNNING 2 348 #define MMC_BGFSTATE_COMPLETED 3 349 350 351 struct mmc_trackinfo { 352 uint16_t tracknr; /* IN/OUT */ 353 uint16_t sessionnr; 354 355 uint8_t track_mode; 356 uint8_t data_mode; 357 358 uint16_t flags; 359 360 uint32_t track_start; 361 uint32_t next_writable; 362 uint32_t free_blocks; 363 uint32_t packet_size; 364 uint32_t track_size; 365 uint32_t last_recorded; 366 }; 367 #define MMCGETTRACKINFO _IOWR('c', 29, struct mmc_trackinfo) 368 369 #define MMC_TRACKINFO_COPY (1 << 0) 370 #define MMC_TRACKINFO_DAMAGED (1 << 1) 371 #define MMC_TRACKINFO_FIXED_PACKET (1 << 2) 372 #define MMC_TRACKINFO_INCREMENTAL (1 << 3) 373 #define MMC_TRACKINFO_BLANK (1 << 4) 374 #define MMC_TRACKINFO_RESERVED (1 << 5) 375 #define MMC_TRACKINFO_NWA_VALID (1 << 6) 376 #define MMC_TRACKINFO_LRA_VALID (1 << 7) 377 #define MMC_TRACKINFO_DATA (1 << 8) 378 #define MMC_TRACKINFO_AUDIO (1 << 9) 379 #define MMC_TRACKINFO_AUDIO_4CHAN (1 << 10) 380 #define MMC_TRACKINFO_PRE_EMPH (1 << 11) 381 382 #define MMC_TRACKINFO_FLAGBITS \ 383 "\10\1COPY\2DAMAGED\3FIXEDPACKET\4INCREMENTAL\5BLANK" \ 384 "\6RESERVED\7NWA_VALID\10LRA_VALID\11DATA\12AUDIO" \ 385 "\13AUDIO_4CHAN\14PRE_EMPH" 386 387 struct mmc_op { 388 uint16_t operation; /* IN */ 389 uint16_t mmc_profile; /* IN */ 390 391 /* parameters to operation */ 392 uint16_t tracknr; /* IN */ 393 uint16_t sessionnr; /* IN */ 394 uint32_t extent; /* IN */ 395 396 uint32_t reserved[4]; 397 }; 398 #define MMCOP _IOWR('c', 30, struct mmc_op) 399 400 #define MMC_OP_SYNCHRONISECACHE 1 401 #define MMC_OP_CLOSETRACK 2 402 #define MMC_OP_CLOSESESSION 3 403 #define MMC_OP_FINALISEDISC 4 404 #define MMC_OP_RESERVETRACK 5 405 #define MMC_OP_RESERVETRACK_NWA 6 406 #define MMC_OP_UNRESERVETRACK 7 407 #define MMC_OP_REPAIRTRACK 8 408 #define MMC_OP_UNCLOSELASTSESSION 9 409 #define MMC_OP_MAX 9 410 411 struct mmc_writeparams { 412 uint16_t tracknr; /* IN */ 413 uint16_t mmc_class; /* IN */ 414 uint32_t mmc_cur; /* IN */ 415 uint32_t blockingnr; /* IN */ 416 417 /* when tracknr == 0 */ 418 uint8_t track_mode; /* IN; normally 5 */ 419 uint8_t data_mode; /* IN; normally 2 */ 420 }; 421 #define MMC_TRACKMODE_DEFAULT 5 /* data, incremental recording */ 422 #define MMC_DATAMODE_DEFAULT 2 /* CDROM XA disc */ 423 #define MMCSETUPWRITEPARAMS _IOW('c', 31, struct mmc_writeparams) 424 425 #endif /* _KERNEL || _EXPOSE_MMC */ 426 427 #endif /* !_SYS_CDIO_H_ */ 428