diff options
author | Cem Keylan <cem@ckyln.com> | 2020-10-16 17:41:25 +0300 |
---|---|---|
committer | Cem Keylan <cem@ckyln.com> | 2020-10-16 17:41:25 +0300 |
commit | e2abcdca396661cbe0ae2ddb13d5c2b85682c13a (patch) | |
tree | acf9b5c80b645617f882c45224c6e07251711842 /sys/sys/cdio.h | |
download | otools-e2abcdca396661cbe0ae2ddb13d5c2b85682c13a.tar.gz |
initial commit
Diffstat (limited to 'sys/sys/cdio.h')
-rw-r--r-- | sys/sys/cdio.h | 435 |
1 files changed, 435 insertions, 0 deletions
diff --git a/sys/sys/cdio.h b/sys/sys/cdio.h new file mode 100644 index 0000000..02069c4 --- /dev/null +++ b/sys/sys/cdio.h @@ -0,0 +1,435 @@ +/* $OpenBSD: cdio.h,v 1.17 2017/10/24 09:36:13 jsg Exp $ */ +/* $NetBSD: cdio.h,v 1.11 1996/02/19 18:29:04 scottr Exp $ */ + +#ifndef _SYS_CDIO_H_ +#define _SYS_CDIO_H_ + +#include <sys/types.h> +#include <sys/ioccom.h> + +/* Shared between kernel & process */ + +union msf_lba { + struct { + u_char unused; + u_char minute; + u_char second; + u_char frame; + } msf; + u_int32_t lba; + u_char addr[4]; +}; + +struct cd_toc_entry { + u_char nothing1; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int control:4; + u_int addr_type:4; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int addr_type:4; + u_int control:4; +#endif + u_char track; + u_char nothing2; + union msf_lba addr; +}; + +struct cd_sub_channel_header { + u_char nothing1; + u_char audio_status; +#define CD_AS_AUDIO_INVALID 0x00 +#define CD_AS_PLAY_IN_PROGRESS 0x11 +#define CD_AS_PLAY_PAUSED 0x12 +#define CD_AS_PLAY_COMPLETED 0x13 +#define CD_AS_PLAY_ERROR 0x14 +#define CD_AS_NO_STATUS 0x15 + u_char data_len[2]; +}; + +struct cd_sub_channel_q_data { + u_char data_format; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int control:4; + u_int addr_type:4; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int addr_type:4; + u_int control:4; +#endif + u_char track_number; + u_char index_number; + u_char absaddr[4]; + u_char reladdr[4]; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int :7; + u_int mc_valid:1; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int mc_valid:1; + u_int :7; +#endif + u_char mc_number[15]; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int :7; + u_int ti_valid:1; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int ti_valid:1; + u_int :7; +#endif + u_char ti_number[15]; +}; + +struct cd_sub_channel_position_data { + u_char data_format; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int control:4; + u_int addr_type:4; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int addr_type:4; + u_int control:4; +#endif + u_char track_number; + u_char index_number; + union msf_lba absaddr; + union msf_lba reladdr; +}; + +struct cd_sub_channel_media_catalog { + u_char data_format; + u_char nothing1; + u_char nothing2; + u_char nothing3; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int :7; + u_int mc_valid:1; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int mc_valid:1; + u_int :7; +#endif + u_char mc_number[15]; +}; + +struct cd_sub_channel_track_info { + u_char data_format; + u_char nothing1; + u_char track_number; + u_char nothing2; +#if _BYTE_ORDER == _LITTLE_ENDIAN + u_int :7; + u_int ti_valid:1; +#endif +#if _BYTE_ORDER == _BIG_ENDIAN + u_int ti_valid:1; + u_int :7; +#endif + u_char ti_number[15]; +}; + +struct cd_sub_channel_info { + struct cd_sub_channel_header header; + union { + struct cd_sub_channel_q_data q_data; + struct cd_sub_channel_position_data position; + struct cd_sub_channel_media_catalog media_catalog; + struct cd_sub_channel_track_info track_info; + } what; +}; + +/* + * Ioctls for the CD drive + */ +struct ioc_play_track { + u_char start_track; + u_char start_index; + u_char end_track; + u_char end_index; +}; + +#define CDIOCPLAYTRACKS _IOW('c', 1, struct ioc_play_track) +struct ioc_play_blocks { + int blk; + int len; +}; +#define CDIOCPLAYBLOCKS _IOW('c', 2, struct ioc_play_blocks) + +struct ioc_read_subchannel { + u_char address_format; +#define CD_LBA_FORMAT 1 +#define CD_MSF_FORMAT 2 + u_char data_format; +#define CD_SUBQ_DATA 0 +#define CD_CURRENT_POSITION 1 +#define CD_MEDIA_CATALOG 2 +#define CD_TRACK_INFO 3 + u_char track; + int data_len; + struct cd_sub_channel_info *data; +}; +#define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel) + +struct ioc_toc_header { + u_short len; + u_char starting_track; + u_char ending_track; +}; + +#define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header) + +struct ioc_read_toc_entry { + u_char address_format; + u_char starting_track; +#define CD_TRACK_LEADOUT 0xaa + u_short data_len; + struct cd_toc_entry *data; +}; +#define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry) +#define CDIOREADTOCENTRYS CDIOREADTOCENTRIES + +/* read LBA start of a given session; 0=last, others not yet supported */ +#define CDIOREADMSADDR _IOWR('c', 6, int) + +struct ioc_patch { + u_char patch[4]; /* one for each channel */ +}; +#define CDIOCSETPATCH _IOW('c', 9, struct ioc_patch) + +struct ioc_vol { + u_char vol[4]; /* one for each channel */ +}; +#define CDIOCGETVOL _IOR('c', 10, struct ioc_vol) +#define CDIOCSETVOL _IOW('c', 11, struct ioc_vol) +#define CDIOCSETMONO _IO('c', 12) +#define CDIOCSETSTEREO _IO('c', 13) +#define CDIOCSETMUTE _IO('c', 14) +#define CDIOCSETLEFT _IO('c', 15) +#define CDIOCSETRIGHT _IO('c', 16) +#define CDIOCSETDEBUG _IO('c', 17) +#define CDIOCCLRDEBUG _IO('c', 18) +#define CDIOCPAUSE _IO('c', 19) +#define CDIOCRESUME _IO('c', 20) +#define CDIOCRESET _IO('c', 21) +#define CDIOCSTART _IO('c', 22) +#define CDIOCSTOP _IO('c', 23) +#define CDIOCEJECT _IO('c', 24) +#define CDIOCALLOW _IO('c', 25) +#define CDIOCPREVENT _IO('c', 26) +#define CDIOCCLOSE _IO('c', 27) + +struct ioc_play_msf { + u_char start_m; + u_char start_s; + u_char start_f; + u_char end_m; + u_char end_s; + u_char end_f; +}; +#define CDIOCPLAYMSF _IOW('c', 25, struct ioc_play_msf) + +struct ioc_load_unload { + u_char options; +#define CD_LU_ABORT 0x1 /* NOTE: These are the same as the ATAPI */ +#define CD_LU_UNLOAD 0x2 /* op values for the LOAD_UNLOAD command */ +#define CD_LU_LOAD 0x3 + u_char slot; +}; +#define CDIOCLOADUNLOAD _IOW('c', 26, struct ioc_load_unload) + +/* DVD definitions */ + +/* DVD-ROM Specific ioctls */ +#define DVD_READ_STRUCT _IOWR('d', 0, union dvd_struct) +#define DVD_WRITE_STRUCT _IOWR('d', 1, union dvd_struct) +#define DVD_AUTH _IOWR('d', 2, union dvd_authinfo) + +#define GPCMD_READ_DVD_STRUCTURE 0xad +#define GPCMD_SEND_DVD_STRUCTURE 0xad +#define GPCMD_REPORT_KEY 0xa4 +#define GPCMD_SEND_KEY 0xa3 + +/* DVD struct types */ +#define DVD_STRUCT_PHYSICAL 0x00 +#define DVD_STRUCT_COPYRIGHT 0x01 +#define DVD_STRUCT_DISCKEY 0x02 +#define DVD_STRUCT_BCA 0x03 +#define DVD_STRUCT_MANUFACT 0x04 + +struct dvd_layer { + u_int8_t book_version; + u_int8_t book_type; + u_int8_t min_rate; + u_int8_t disc_size; + u_int8_t layer_type; + u_int8_t track_path; + u_int8_t nlayers; + u_int8_t track_density; + u_int8_t linear_density; + u_int8_t bca; + u_int32_t start_sector; + u_int32_t end_sector; + u_int32_t end_sector_l0; +}; + +struct dvd_physical { + u_int8_t type; + + u_int8_t layer_num; + struct dvd_layer layer[4]; +}; + +struct dvd_copyright { + u_int8_t type; + + u_int8_t layer_num; + u_int8_t cpst; + u_int8_t rmi; +}; + +struct dvd_disckey { + u_int8_t type; + + u_int8_t agid; + u_int8_t value[2048]; +}; + +struct dvd_bca { + u_int8_t type; + + int len; + u_int8_t value[188]; +}; + +struct dvd_manufact { + u_int8_t type; + + u_int8_t layer_num; + int len; + u_int8_t value[2048]; +}; + +union dvd_struct { + u_int8_t type; + + struct dvd_physical physical; + struct dvd_copyright copyright; + struct dvd_disckey disckey; + struct dvd_bca bca; + struct dvd_manufact manufact; +}; + +/* + * DVD authentication ioctl + */ + +/* Authentication states */ +#define DVD_LU_SEND_AGID 0 +#define DVD_HOST_SEND_CHALLENGE 1 +#define DVD_LU_SEND_KEY1 2 +#define DVD_LU_SEND_CHALLENGE 3 +#define DVD_HOST_SEND_KEY2 4 + +/* Termination states */ +#define DVD_AUTH_ESTABLISHED 5 +#define DVD_AUTH_FAILURE 6 + +/* Other functions */ +#define DVD_LU_SEND_TITLE_KEY 7 +#define DVD_LU_SEND_ASF 8 +#define DVD_INVALIDATE_AGID 9 +#define DVD_LU_SEND_RPC_STATE 10 +#define DVD_HOST_SEND_RPC_STATE 11 + +#if 0 +/* State data */ +typedef u_int8_t dvd_key[5]; /* 40-bit value, MSB is first elem. */ +typedef u_int8_t dvd_challenge[10]; /* 80-bit value, MSB is first elem. */ +#endif + +#define DVD_KEY_SIZE 5 +#define DVD_CHALLENGE_SIZE 10 + +struct dvd_lu_send_agid { + u_int8_t type; + + u_int8_t agid; +}; + +struct dvd_host_send_challenge { + u_int8_t type; + + u_int8_t agid; + u_int8_t chal[DVD_CHALLENGE_SIZE]; +}; + +struct dvd_send_key { + u_int8_t type; + + u_int8_t agid; + u_int8_t key[DVD_KEY_SIZE]; +}; + +struct dvd_lu_send_challenge { + u_int8_t type; + + u_int8_t agid; + u_int8_t chal[DVD_CHALLENGE_SIZE]; +}; + +#define DVD_CPM_NO_COPYRIGHT 0 +#define DVD_CPM_COPYRIGHTED 1 + +#define DVD_CP_SEC_NONE 0 +#define DVD_CP_SEC_EXIST 1 + +#define DVD_CGMS_UNRESTRICTED 0 +#define DVD_CGMS_SINGLE 2 +#define DVD_CGMS_RESTRICTED 3 + +struct dvd_lu_send_title_key { + u_int8_t type; + + u_int8_t agid; + u_int8_t title_key[DVD_KEY_SIZE]; + int lba; + u_int8_t cpm; + u_int8_t cp_sec; + u_int8_t cgms; +}; + +struct dvd_lu_send_asf { + u_int8_t type; + + u_int8_t agid; + u_int8_t asf; +}; + +struct dvd_host_send_rpcstate { + u_int8_t type; + u_int8_t pdrc; +}; + +struct dvd_lu_send_rpcstate { + u_int8_t type; + u_int8_t vra; + u_int8_t ucca; + u_int8_t region_mask; + u_int8_t rpc_scheme; + }; + +union dvd_authinfo { + u_int8_t type; + + struct dvd_lu_send_agid lsa; + struct dvd_host_send_challenge hsc; + struct dvd_send_key lsk; + struct dvd_lu_send_challenge lsc; + struct dvd_send_key hsk; + struct dvd_lu_send_title_key lstk; + struct dvd_lu_send_asf lsasf; + struct dvd_host_send_rpcstate hrpcs; + struct dvd_lu_send_rpcstate lrpcs; +}; +#endif /* !_SYS_CDIO_H_ */ |