1 /* $OpenBSD: cdio.h,v 1.17 2017/10/24 09:36:13 jsg Exp $ */ 2 /* $NetBSD: cdio.h,v 1.11 1996/02/19 18:29:04 scottr Exp $ */ 3 4 #ifndef _SYS_CDIO_H_ 5 #define _SYS_CDIO_H_ 6 7 #include <sys/types.h> 8 #include <sys/ioccom.h> 9 10 /* Shared between kernel & process */ 11 12 union msf_lba { 13 struct { 14 u_char unused; 15 u_char minute; 16 u_char second; 17 u_char frame; 18 } msf; 19 u_int32_t lba; 20 u_char addr[4]; 21 }; 22 23 struct cd_toc_entry { 24 u_char nothing1; 25 #if _BYTE_ORDER == _LITTLE_ENDIAN 26 u_int control:4; 27 u_int addr_type:4; 28 #endif 29 #if _BYTE_ORDER == _BIG_ENDIAN 30 u_int addr_type:4; 31 u_int control:4; 32 #endif 33 u_char track; 34 u_char nothing2; 35 union msf_lba addr; 36 }; 37 38 struct cd_sub_channel_header { 39 u_char nothing1; 40 u_char audio_status; 41 #define CD_AS_AUDIO_INVALID 0x00 42 #define CD_AS_PLAY_IN_PROGRESS 0x11 43 #define CD_AS_PLAY_PAUSED 0x12 44 #define CD_AS_PLAY_COMPLETED 0x13 45 #define CD_AS_PLAY_ERROR 0x14 46 #define CD_AS_NO_STATUS 0x15 47 u_char data_len[2]; 48 }; 49 50 struct cd_sub_channel_q_data { 51 u_char data_format; 52 #if _BYTE_ORDER == _LITTLE_ENDIAN 53 u_int control:4; 54 u_int addr_type:4; 55 #endif 56 #if _BYTE_ORDER == _BIG_ENDIAN 57 u_int addr_type:4; 58 u_int control:4; 59 #endif 60 u_char track_number; 61 u_char index_number; 62 u_char absaddr[4]; 63 u_char reladdr[4]; 64 #if _BYTE_ORDER == _LITTLE_ENDIAN 65 u_int :7; 66 u_int mc_valid:1; 67 #endif 68 #if _BYTE_ORDER == _BIG_ENDIAN 69 u_int mc_valid:1; 70 u_int :7; 71 #endif 72 u_char mc_number[15]; 73 #if _BYTE_ORDER == _LITTLE_ENDIAN 74 u_int :7; 75 u_int ti_valid:1; 76 #endif 77 #if _BYTE_ORDER == _BIG_ENDIAN 78 u_int ti_valid:1; 79 u_int :7; 80 #endif 81 u_char ti_number[15]; 82 }; 83 84 struct cd_sub_channel_position_data { 85 u_char data_format; 86 #if _BYTE_ORDER == _LITTLE_ENDIAN 87 u_int control:4; 88 u_int addr_type:4; 89 #endif 90 #if _BYTE_ORDER == _BIG_ENDIAN 91 u_int addr_type:4; 92 u_int control:4; 93 #endif 94 u_char track_number; 95 u_char index_number; 96 union msf_lba absaddr; 97 union msf_lba reladdr; 98 }; 99 100 struct cd_sub_channel_media_catalog { 101 u_char data_format; 102 u_char nothing1; 103 u_char nothing2; 104 u_char nothing3; 105 #if _BYTE_ORDER == _LITTLE_ENDIAN 106 u_int :7; 107 u_int mc_valid:1; 108 #endif 109 #if _BYTE_ORDER == _BIG_ENDIAN 110 u_int mc_valid:1; 111 u_int :7; 112 #endif 113 u_char mc_number[15]; 114 }; 115 116 struct cd_sub_channel_track_info { 117 u_char data_format; 118 u_char nothing1; 119 u_char track_number; 120 u_char nothing2; 121 #if _BYTE_ORDER == _LITTLE_ENDIAN 122 u_int :7; 123 u_int ti_valid:1; 124 #endif 125 #if _BYTE_ORDER == _BIG_ENDIAN 126 u_int ti_valid:1; 127 u_int :7; 128 #endif 129 u_char ti_number[15]; 130 }; 131 132 struct cd_sub_channel_info { 133 struct cd_sub_channel_header header; 134 union { 135 struct cd_sub_channel_q_data q_data; 136 struct cd_sub_channel_position_data position; 137 struct cd_sub_channel_media_catalog media_catalog; 138 struct cd_sub_channel_track_info track_info; 139 } what; 140 }; 141 142 /* 143 * Ioctls for the CD drive 144 */ 145 struct ioc_play_track { 146 u_char start_track; 147 u_char start_index; 148 u_char end_track; 149 u_char end_index; 150 }; 151 152 #define CDIOCPLAYTRACKS _IOW('c', 1, struct ioc_play_track) 153 struct ioc_play_blocks { 154 int blk; 155 int len; 156 }; 157 #define CDIOCPLAYBLOCKS _IOW('c', 2, struct ioc_play_blocks) 158 159 struct ioc_read_subchannel { 160 u_char address_format; 161 #define CD_LBA_FORMAT 1 162 #define CD_MSF_FORMAT 2 163 u_char data_format; 164 #define CD_SUBQ_DATA 0 165 #define CD_CURRENT_POSITION 1 166 #define CD_MEDIA_CATALOG 2 167 #define CD_TRACK_INFO 3 168 u_char track; 169 int data_len; 170 struct cd_sub_channel_info *data; 171 }; 172 #define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel) 173 174 struct ioc_toc_header { 175 u_short len; 176 u_char starting_track; 177 u_char ending_track; 178 }; 179 180 #define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header) 181 182 struct ioc_read_toc_entry { 183 u_char address_format; 184 u_char starting_track; 185 #define CD_TRACK_LEADOUT 0xaa 186 u_short data_len; 187 struct cd_toc_entry *data; 188 }; 189 #define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry) 190 #define CDIOREADTOCENTRYS CDIOREADTOCENTRIES 191 192 /* read LBA start of a given session; 0=last, others not yet supported */ 193 #define CDIOREADMSADDR _IOWR('c', 6, int) 194 195 struct ioc_patch { 196 u_char patch[4]; /* one for each channel */ 197 }; 198 #define CDIOCSETPATCH _IOW('c', 9, struct ioc_patch) 199 200 struct ioc_vol { 201 u_char vol[4]; /* one for each channel */ 202 }; 203 #define CDIOCGETVOL _IOR('c', 10, struct ioc_vol) 204 #define CDIOCSETVOL _IOW('c', 11, struct ioc_vol) 205 #define CDIOCSETMONO _IO('c', 12) 206 #define CDIOCSETSTEREO _IO('c', 13) 207 #define CDIOCSETMUTE _IO('c', 14) 208 #define CDIOCSETLEFT _IO('c', 15) 209 #define CDIOCSETRIGHT _IO('c', 16) 210 #define CDIOCSETDEBUG _IO('c', 17) 211 #define CDIOCCLRDEBUG _IO('c', 18) 212 #define CDIOCPAUSE _IO('c', 19) 213 #define CDIOCRESUME _IO('c', 20) 214 #define CDIOCRESET _IO('c', 21) 215 #define CDIOCSTART _IO('c', 22) 216 #define CDIOCSTOP _IO('c', 23) 217 #define CDIOCEJECT _IO('c', 24) 218 #define CDIOCALLOW _IO('c', 25) 219 #define CDIOCPREVENT _IO('c', 26) 220 #define CDIOCCLOSE _IO('c', 27) 221 222 struct ioc_play_msf { 223 u_char start_m; 224 u_char start_s; 225 u_char start_f; 226 u_char end_m; 227 u_char end_s; 228 u_char end_f; 229 }; 230 #define CDIOCPLAYMSF _IOW('c', 25, struct ioc_play_msf) 231 232 struct ioc_load_unload { 233 u_char options; 234 #define CD_LU_ABORT 0x1 /* NOTE: These are the same as the ATAPI */ 235 #define CD_LU_UNLOAD 0x2 /* op values for the LOAD_UNLOAD command */ 236 #define CD_LU_LOAD 0x3 237 u_char slot; 238 }; 239 #define CDIOCLOADUNLOAD _IOW('c', 26, struct ioc_load_unload) 240 241 /* DVD definitions */ 242 243 /* DVD-ROM Specific ioctls */ 244 #define DVD_READ_STRUCT _IOWR('d', 0, union dvd_struct) 245 #define DVD_WRITE_STRUCT _IOWR('d', 1, union dvd_struct) 246 #define DVD_AUTH _IOWR('d', 2, union dvd_authinfo) 247 248 #define GPCMD_READ_DVD_STRUCTURE 0xad 249 #define GPCMD_SEND_DVD_STRUCTURE 0xad 250 #define GPCMD_REPORT_KEY 0xa4 251 #define GPCMD_SEND_KEY 0xa3 252 253 /* DVD struct types */ 254 #define DVD_STRUCT_PHYSICAL 0x00 255 #define DVD_STRUCT_COPYRIGHT 0x01 256 #define DVD_STRUCT_DISCKEY 0x02 257 #define DVD_STRUCT_BCA 0x03 258 #define DVD_STRUCT_MANUFACT 0x04 259 260 struct dvd_layer { 261 u_int8_t book_version; 262 u_int8_t book_type; 263 u_int8_t min_rate; 264 u_int8_t disc_size; 265 u_int8_t layer_type; 266 u_int8_t track_path; 267 u_int8_t nlayers; 268 u_int8_t track_density; 269 u_int8_t linear_density; 270 u_int8_t bca; 271 u_int32_t start_sector; 272 u_int32_t end_sector; 273 u_int32_t end_sector_l0; 274 }; 275 276 struct dvd_physical { 277 u_int8_t type; 278 279 u_int8_t layer_num; 280 struct dvd_layer layer[4]; 281 }; 282 283 struct dvd_copyright { 284 u_int8_t type; 285 286 u_int8_t layer_num; 287 u_int8_t cpst; 288 u_int8_t rmi; 289 }; 290 291 struct dvd_disckey { 292 u_int8_t type; 293 294 u_int8_t agid; 295 u_int8_t value[2048]; 296 }; 297 298 struct dvd_bca { 299 u_int8_t type; 300 301 int len; 302 u_int8_t value[188]; 303 }; 304 305 struct dvd_manufact { 306 u_int8_t type; 307 308 u_int8_t layer_num; 309 int len; 310 u_int8_t value[2048]; 311 }; 312 313 union dvd_struct { 314 u_int8_t type; 315 316 struct dvd_physical physical; 317 struct dvd_copyright copyright; 318 struct dvd_disckey disckey; 319 struct dvd_bca bca; 320 struct dvd_manufact manufact; 321 }; 322 323 /* 324 * DVD authentication ioctl 325 */ 326 327 /* Authentication states */ 328 #define DVD_LU_SEND_AGID 0 329 #define DVD_HOST_SEND_CHALLENGE 1 330 #define DVD_LU_SEND_KEY1 2 331 #define DVD_LU_SEND_CHALLENGE 3 332 #define DVD_HOST_SEND_KEY2 4 333 334 /* Termination states */ 335 #define DVD_AUTH_ESTABLISHED 5 336 #define DVD_AUTH_FAILURE 6 337 338 /* Other functions */ 339 #define DVD_LU_SEND_TITLE_KEY 7 340 #define DVD_LU_SEND_ASF 8 341 #define DVD_INVALIDATE_AGID 9 342 #define DVD_LU_SEND_RPC_STATE 10 343 #define DVD_HOST_SEND_RPC_STATE 11 344 345 #if 0 346 /* State data */ 347 typedef u_int8_t dvd_key[5]; /* 40-bit value, MSB is first elem. */ 348 typedef u_int8_t dvd_challenge[10]; /* 80-bit value, MSB is first elem. */ 349 #endif 350 351 #define DVD_KEY_SIZE 5 352 #define DVD_CHALLENGE_SIZE 10 353 354 struct dvd_lu_send_agid { 355 u_int8_t type; 356 357 u_int8_t agid; 358 }; 359 360 struct dvd_host_send_challenge { 361 u_int8_t type; 362 363 u_int8_t agid; 364 u_int8_t chal[DVD_CHALLENGE_SIZE]; 365 }; 366 367 struct dvd_send_key { 368 u_int8_t type; 369 370 u_int8_t agid; 371 u_int8_t key[DVD_KEY_SIZE]; 372 }; 373 374 struct dvd_lu_send_challenge { 375 u_int8_t type; 376 377 u_int8_t agid; 378 u_int8_t chal[DVD_CHALLENGE_SIZE]; 379 }; 380 381 #define DVD_CPM_NO_COPYRIGHT 0 382 #define DVD_CPM_COPYRIGHTED 1 383 384 #define DVD_CP_SEC_NONE 0 385 #define DVD_CP_SEC_EXIST 1 386 387 #define DVD_CGMS_UNRESTRICTED 0 388 #define DVD_CGMS_SINGLE 2 389 #define DVD_CGMS_RESTRICTED 3 390 391 struct dvd_lu_send_title_key { 392 u_int8_t type; 393 394 u_int8_t agid; 395 u_int8_t title_key[DVD_KEY_SIZE]; 396 int lba; 397 u_int8_t cpm; 398 u_int8_t cp_sec; 399 u_int8_t cgms; 400 }; 401 402 struct dvd_lu_send_asf { 403 u_int8_t type; 404 405 u_int8_t agid; 406 u_int8_t asf; 407 }; 408 409 struct dvd_host_send_rpcstate { 410 u_int8_t type; 411 u_int8_t pdrc; 412 }; 413 414 struct dvd_lu_send_rpcstate { 415 u_int8_t type; 416 u_int8_t vra; 417 u_int8_t ucca; 418 u_int8_t region_mask; 419 u_int8_t rpc_scheme; 420 }; 421 422 union dvd_authinfo { 423 u_int8_t type; 424 425 struct dvd_lu_send_agid lsa; 426 struct dvd_host_send_challenge hsc; 427 struct dvd_send_key lsk; 428 struct dvd_lu_send_challenge lsc; 429 struct dvd_send_key hsk; 430 struct dvd_lu_send_title_key lstk; 431 struct dvd_lu_send_asf lsasf; 432 struct dvd_host_send_rpcstate hrpcs; 433 struct dvd_lu_send_rpcstate lrpcs; 434 }; 435 #endif /* !_SYS_CDIO_H_ */ 436