OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [Documentation/] [cdrom/] [cdrom-standard.tex] - Blame information for rev 1777

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1625 jcastillo
\documentclass{article}
2
\def\version{$Id: cdrom-standard.tex,v 1.1 2005-12-20 10:05:54 jcastillo Exp $}
3
 
4
\evensidemargin=0pt
5
\oddsidemargin=0pt
6
\topmargin=-\headheight \advance\topmargin by -\headsep
7
\textwidth=15.99cm \textheight=24.62cm % normal A4, 1'' margin
8
 
9
\def\linux{{\sc Linux}}
10
\def\cdrom{{\sc CDrom}}
11
\def\cdromc{{\tt cdrom.c}}
12
\def\cdromh{{\tt cdrom.h}}
13
\def\ucdrom{{\tt ucdrom.h}}
14
\def\fo{\sl}
15
 
16
\everymath{\it} \everydisplay{\it}
17
\catcode `\_=\active \def_{\_\penalty100 }
18
\catcode`\<=\active \def<#1>{{\langle\hbox{\rm#1}\rangle}}
19
 
20
\begin{document}
21
\title{A \linux\ \cdrom\ standard}
22
\author{David van Leeuwen\\{\normalsize\tt david@tm.tno.nl}}
23
 
24
\maketitle
25
 
26
\section{Introduction}
27
 
28
\linux\ is probably the Unix-like operating system that supports the widest
29
variety of hardware devices. The reasons for this are presumably
30
\begin{itemize}
31
\item The large list of different hardware devices available for the popular
32
IBM PC-architecture,
33
\item The open design of the operating system, such that everybody can
34
write a driver for Linux (source code examples).
35
\end{itemize}
36
The vast choice and openness has lead not only to a wide support of
37
hardware devices, but also to a certain divergence in behavior.
38
Especially for \cdrom\ devices, the way a particular drive reacts to a
39
`standard' $ioctl()$ call varies a lot from one brand to another;
40
however, the \linux\ \cdrom\ driver writers kept away from wilderness
41
by the practice of evolving a new driver by copying, understanding and
42
changing an existing one.
43
 
44
Since the beginning of the \cdrom, many different interfaces
45
developed.  Some of them had their own proprietary design (Sony,
46
Mitsumi, Panasonic, Philips), other manufacturers adopted an existing
47
electrical interface and changed the functionality
48
(CreativeLabs/SoundBlaster, Teac, Funai) or simply adapted their
49
drives to one or more of the already existing electrical interfaces
50
(Aztech, Sanyo, Funai, Vertos, Longshine, Optics Storage and most of
51
the `NoName' manufacturers).  In cases where a new drive really
52
brought his own interface or used his own command set and flow control
53
scheme, either a separate driver had to be written, or an existing
54
driver had to get enhanced.
55
 
56
Nowadays, almost all new \cdrom\ types are either ATAPI/IDE or SCSI;
57
it is very unlikely that any manufacturer still will create a new
58
interface, and new drives for the existing proprietary interfaces are
59
getting rare.  But history has delivered us \cdrom\ support for many
60
different interfaces.
61
 
62
When (in the 1.3.70's) I looked at the existing interface which is
63
expressed through \cdromh\ it appeared to be a rather wild set of
64
commands and data formats.\footnote{I cannot recollect what kernel
65
  version I looked at, then, presumably 1.2.13 and 1.3.34---the latest
66
  kernel that I was indirectly involved in.} It seemed that many
67
features of the interface have been added to include certain specific
68
capabilities of certain drives, in an {\fo ad hoc\/} manner. More
69
importantly, it appeared that actual execution of the commands is
70
different for most of the different drivers: e.g., some drivers close
71
the tray if an $open()$ call occurs while the tray is unloaded, while
72
others do not. Some drivers lock the door upon opening the device, to
73
prevent an incoherent file system, but others don't, to allow software
74
ejection.  Undoubtedly, the capabilities of the different drives vary,
75
but even when two drives have the same capability the driver behavior
76
may be different.
77
 
78
I decided to start a discussion on how to improve uniformity,
79
addressing all \cdrom-driver developers found in the various driver
80
files. The reactions encouraged me to write a uniform (compatible)
81
software level \cdromc\ to which this document is the documentation.
82
In the mean time, the data structure definitions in \cdromh\ had been
83
cleaned up a lot---which was very helpful for the new code.
84
 
85
\begin{quote}
86
\small
87
[Apparently, not all \cdrom\ developers support this initiative.
88
They---mainly those who used the already existing drivers not only as
89
a coding example, but also as a `user interface' reference during
90
their own development---have taken care that \cdromh\ reflects a
91
software interface to `user programs' which is unique between all
92
drivers as much as possible; these driver writers will continue to
93
refine the existing \cdromh\ where it seems necessary, and they tend
94
to look if any newly requested functionality isn't already there
95
before they are ready to define new structures. The {\tt sbpcd} driver
96
gives an example that it is possible to let a robot arm play juke
97
box---either with audio or with data CDs---and that it is possible to
98
let the juke box work on even if a disk has fallen upon the floor and
99
the drive door has closed without having a disk inside; without any
100
new software layer or any structures which are not already present in
101
\cdromh.  This `other' group of \linux\ \cdrom\ driver writers
102
explicitly does {\em not\/} support the idea to define an additional
103
software layer between driver and user program.]\parfillskip=0pt
104
\end{quote}
105
 
106
The effort (\cdromc) of which this is the documentation is {\em not\/}
107
meant to drive a wedge between two groups of driver developers, but
108
rather to enable sharing of `strategic code' among drivers. The code
109
should {\em not\/} be viewed as a new interface to user-level
110
programs, but rather as a new interface between driver code and
111
kernel.
112
 
113
Care is taken that 100\,\% compatibility exists with the data
114
structures and programmer's interface defined in \cdromh, and in order
115
not to interfere with ongoing development in \cdromh, any `new' data
116
structures have been put in a separate header file called \ucdrom.
117
Because the data structures of \cdromh\ are fully supported, this
118
documentation may also be of help to the programmers using the
119
interface defined in \cdromh, but this guide is primarily written to
120
help \cdrom\ driver developers adapt their code to use the `common
121
\cdrom' code in \cdromc.
122
 
123
Personally, I think that the most important hardware interfaces will
124
be the IDE/ATAPI drives and of course the SCSI drives, but as prices
125
of hardware drop continuously, it is not unlikely that people will
126
have more than one \cdrom\ drive, possibly of mixed types. It is
127
important that these drives behave in the same way. (In December 1994,
128
one of the cheapest \cdrom\ drives was a Philips cm206, a double-speed
129
proprietary drive. In the months that I was busy writing a \linux\
130
driver for it, proprietary drives became old-fashioned and IDE/ATAPI
131
drives became standard. At the time of writing (April 1996) the
132
cheapest double speed drive is IDE and at one fifth of the price of
133
its predecessor. Eight speed drives are available now.)
134
 
135
This document defines (in pre-release versions: proposes) the various
136
$ioctl$s, and the way the drivers should implement this.
137
 
138
\section{Standardizing through another software level}
139
\label{cdrom.c}
140
 
141
At the time this document is written, all drivers directly implement
142
the $ioctl()$ calls through their own routines, with the danger of
143
forgetting calls to $verify_area()$ and the risk of divergence in
144
implementation.
145
 
146
For this reason, we\footnote{The writing style is such that `we' is
147
used when (at least part of) the \cdrom-device driver authors support
148
the idea, an `I' is used for personal opinions} propose to define
149
another software-level, that separates the $ioctl()$ and $open()$
150
implementation from the actual hardware implementation. Note that we
151
do not wish to alter the existing application interface defined in
152
\cdromh, but rather want to re-root the hardware-implementation through
153
some common code.
154
 
155
We believe that \cdrom\ drives are specific enough (i.e., different
156
from other block-devices such as floppy or hard disc drives), to
157
define a set of {\em \cdrom\ device operations},
158
$<cdrom-device>_dops$. These are of a different nature than the
159
classical block-device file operations $<block-device>_fops$.
160
 
161
The extra interfacing level routines are implemented in a file
162
\cdromc, and a low-level \cdrom\ driver hands over the interfacing to
163
the kernel by registering the following general $struct\ file_operations$:
164
$$
165
\halign{$#$\ \hfil&$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
166
struct& file_operations\ cdrom_fops = \{\hidewidth\cr
167
        &NULL,                  & lseek \cr
168
        &block_read,            & read---general\ block-dev\ read \cr
169
        &block_write,           & write---general block-dev write \cr
170
        &NULL,                  & readdir \cr
171
        &NULL,                  & select \cr
172
        &cdrom_ioctl,           & ioctl \cr
173
        &NULL,                  & mmap \cr
174
        &cdrom_open,            & open \cr
175
        &cdrom_release,         & release \cr
176
        &NULL,                  & fsync \cr
177
        &NULL,                  & fasync \cr
178
        &cdrom_media_changed,   & media_change \cr
179
        &NULL                   & revalidate \cr
180
\};\cr
181
}
182
$$
183
Every active \cdrom\ device shares this $struct$. The routines declared
184
above are all implemented in \cdromc, and this is the place where the
185
{\em behavior\/} of all \cdrom-devices is defined, and hence
186
standardized. The implementation of the interfacing to the various
187
types of hardware still is done by the various \cdrom-device drivers,
188
but these routines only implement certain {\em capabilities\/} that
189
are typical to \cdrom\ (removable-media) devices.
190
 
191
Registration of the \cdrom\ device driver should now be to the general
192
routines in \cdromc, not to the VFS any more. This is done though the
193
call
194
$$register_cdrom(int\ major, char * name,
195
  struct\ cdrom_device_ops\ device_options)
196
$$
197
 
198
The device operations structure lists the implemented routines for
199
interfacing to the hardware, and some specifications of capabilities
200
of the device, such as the maximum head-transfer rate.  [It is
201
impossible to come up with a complete list of all capabilities of
202
(future) \cdrom\ drives, as the developments in technology follow-up
203
at an incredible rate. Maybe write-operation (WORM devices) will
204
become very popular in the future.]  The list now is:
205
$$
206
\halign{$#$\ \hfil&$#$\ \hfil&\hbox to 10em{$#$\hss}&
207
  $/*$ \rm# $*/$\hfil\cr
208
struct& cdrom_device_ops\ \{ \hidewidth\cr
209
  &int& (* open)(kdev_t, int)\cr
210
  &void& (* release)(kdev_t);\cr
211
  &int& (* open_files)(kdev_t);  \cr
212
  &int& (* drive_status)(kdev_t);\cr
213
  &int& (* disc_status)(kdev_t);\cr
214
  &int& (* media_changed)(kdev_t);\cr
215
  &int& (* tray_move)(kdev_t, int);\cr
216
  &int& (* lock_door)(kdev_t, int);\cr
217
  &int& (* select_speed)(kdev_t, int);\cr
218
  &int& (* select_disc)(kdev_t, int);\cr
219
  &int& (* get_last_session) (kdev_t, struct\ cdrom_multisession *{});\cr
220
  &int& (* get_mcn)(kdev_t, struct\ cdrom_mcn *{});\cr
221
  &int& (* reset)(kdev_t);\cr
222
  &int& (* audio_ioctl)(kdev_t, unsigned\ int, void *{});\cr
223
  &int& (* dev_ioctl)(kdev_t, unsigned\ int, unsigned\ long);\cr
224
\noalign{\medskip}
225
  &\llap{const\ }int& capability;&  capability flags \cr
226
  &int& mask;& mask of capability: disables them \cr
227
  &\llap{$const\ $}int& speed;&  maximum speed for reading data \cr
228
  &\llap{$const\ $}int& minors;& number of supported minor devices \cr
229
  &\llap{$const\ $}int& capacity;& number of discs in jukebox \cr
230
\noalign{\medskip}
231
  &int& options;& options flags \cr
232
  &long& mc_flags;& media-change buffer flags ($2\times16$) \cr
233
\}\cr
234
}
235
$$ The \cdrom-driver should simply implement (some of) these
236
functions, and register the functions to the global \cdrom\ driver,
237
which performs interfacing with the Virtual File System and system
238
$ioctl$s. The flags $capability$ specify the hardware-capabilities on
239
registration of the device, the flags $mask$ can be used to mask some
240
of those capabilities (for one reason or another). The value $minors$
241
should be a positive value indicating the number of minor devices that
242
are supported by the driver, normally~1.  (They are supposed to be
243
numbered from 0 upwards). The value $capacity$ should be the number of
244
discs the drive can hold simultaneously, if it is designed as a
245
juke-box, or otherwise~1.
246
 
247
Two registers contain variables local to the \cdrom\ device. The flags
248
$options$ are used to specify how the general \cdrom\ routines
249
should behave. These various flags registers should provide enough
250
flexibility to adapt to the different user's wishes (and {\em not\/}
251
the `arbitrary' wishes of the author of the low-level device driver,
252
as is the case in the old scheme). The register $mc_flags$ is used to
253
buffer the information from $media_changed()$ to two separate queues.
254
 
255
Note that most functions have fewer parameters than their
256
$blkdev_fops$ counterparts. This is because very little of the
257
information in the structures $inode$ and $file$ are used, the main
258
parameter is the device $dev$, from which the minor-number can be
259
extracted. (Most low-level \cdrom\ drivers don't even look at that value
260
as only one device is supported.)
261
 
262
The intermediate software layer that \cdromc\ forms will performs some
263
additional bookkeeping. The minor number of the device is checked
264
against the maximum registered in $<device>_dops$. The function
265
$cdrom_ioctl()$ will verify the appropriate user-memory regions for
266
read and write, and in case a location on the CD is transferred, it
267
will `sanitize' the format by making requests to the low-level drivers
268
in a standard format, and translating all formats between the
269
user-software and low level drivers. This relieves much of the drivers
270
memory checking and format checking and translation. Also, the
271
necessary structures will be declared on the program stack.
272
 
273
The implementation of the functions should be as defined in the
274
following sections. Three functions {\em must\/} be implemented,
275
namely $open()$, $release()$ and $open_files()$. Other functions may
276
be omitted, their corresponding capability flags will be cleared upon
277
registration. Generally, a function returns zero on success and
278
negative on error. A function call should return only after the
279
command has completed, but of course waiting for the device should not
280
use processor time.
281
 
282
\subsection{$Open(kdev_t\ dev, int\ purpose)$}
283
 
284
$Open()$ should try to open the device for a specific $purpose$, which
285
can be either:
286
\begin{itemize}
287
\item[0] Open for data read, as is used by {\tt mount()} (2), or the
288
user commands {\tt dd} or {\tt cat}.
289
\item[1] Open for $ioctl$ commanding, as is used for audio-CD playing
290
programs mostly.
291
\end{itemize}
292
In this routine, a static counter should be updated, reflecting the
293
number of times the specific device is successfully opened (and in
294
case the driver supports modules, the call $MOD_INC_USE_COUNT$
295
should be performed exactly once, if successful). The return value is
296
negative on error, and zero on success. The open-for-ioctl call can
297
only fail if there is no hardware.
298
 
299
Notice that any strategic code (closing tray upon $open()$, etc.)\ is
300
done by the calling routine in \cdromc, so the low-level routine
301
should only be concerned with proper initialization and device-use
302
count.
303
 
304
\subsection{$Release(kdev_t\ dev)$}
305
 
306
The use-count of the device $dev$ should be decreased by 1, and a
307
single call $MOD_DEC_USE_COUNT$ should be coded here.  Possibly other
308
device-specific actions should be taken such as spinning down the
309
device. However, strategic actions such as ejection of the tray, or
310
unlocking the door, should be left over to the general routine
311
$cdrom_release()$. Also, the invalidation of the allocated buffers in
312
the VFS is taken care of by the routine in \cdromc.
313
 
314
\subsection{$Open_files(kdev_t\ dev)$}
315
 
316
This function should return the internal variable use-count of the
317
device $dev$. The use-count is not implemented in the routines in
318
\cdromc\ itself, because there may be many minor devices connected to
319
a single low-level driver.
320
 
321
\subsection{$Drive_status(kdev_t\ dev)$}
322
\label{drive status}
323
 
324
The function $drive_status$, if implemented, should provide
325
information of the status of the drive (not the status of the disc,
326
which may or may not be in the drive). In \ucdrom\ the possibilities
327
are listed:
328
$$
329
\halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
330
CDS_NO_INFO& no information available\cr
331
CDS_NO_DISC& no disc is inserted, tray is closed\cr
332
CDS_TRAY_OPEN& tray is opened\cr
333
CDS_DRIVE_NOT_READY& something is wrong, tray is moving?\cr
334
CDS_DISC_OK& a disc is loaded and everything is fine\cr
335
}
336
$$
337
 
338
\subsection{$Disc_status(kdev_t\ dev)$}
339
\label{disc status}
340
 
341
As a complement to $drive_status()$, this function can provide the
342
general \cdrom-routines with information about the current disc that is
343
inserted in the drive represented by $dev$. The history of development
344
of the CD's use as a carrier medium for various digital information
345
has lead to many different disc types, hence this function can return:
346
$$
347
\halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
348
CDS_NO_INFO& no information available\cr
349
CDS_NO_DISC& no disc is inserted, or tray is opened\cr
350
CDS_AUDIO& Audio disc (2352 audio bytes/frame)\cr
351
CDS_DATA_1& data disc, mode 1 (2048 user bytes/frame)\cr
352
CDS_DATA_2& data disc, mode 2 (2336 user bytes/frame)\cr
353
CDS_XA_2_1& mixed data (XA), mode 2, form 1 (2048 user bytes)\cr
354
CDS_XA_2_2& mixed data (XA), mode 2, form 1 (2324  user bytes)\cr
355
}
356
$$
357
As far as I know, \cdrom s are always of type $CDS_DATA_1$. For
358
some information concerning frame layout of the various disc types, see
359
a recent version of {\tt cdrom.h}.
360
 
361
\subsection{$Media_changed(dev\_t\ dev)$}
362
 
363
This function is very similar to the original function in $struct\
364
file_operations$. It returns 1 if the medium of the device $dev$ has
365
changed since the last call, and 0 otherwise. Note that by `re-routing'
366
this function through $cdrom_media_changed()$, we can implement
367
separate queues for the VFS and a new $ioctl()$ function that can
368
report device changes to software (e.g., an auto-mounting daemon).
369
 
370
\subsection{$Tray_move(kdev_t\ dev, int\ position)$}
371
 
372
This function, if implemented, should control the tray movement. (No
373
other function should control this.) The parameter $position$ controls
374
the desired direction of movement:
375
\begin{itemize}
376
\item[0] Close tray
377
\item[1] Open tray
378
\end{itemize}
379
This function returns 0 upon success, and a non-zero value upon
380
error. Note that if the tray is already in the desired position, no
381
action need be taken, and the return value should be 0.
382
 
383
\subsection{$Lock_door(kdev_t\ dev, int\ lock)$}
384
 
385
This function (and no other code) controls locking of the door, if the
386
drive allows this. The value of $lock$ controls the desired locking
387
state:
388
\begin{itemize}
389
\item[0] Unlock door, manual opening is allowed
390
\item[1] Lock door, tray cannot be ejected manually
391
\end{itemize}
392
Return values are as for $tray_move()$.
393
 
394
\subsection{$Select_speed(kdev_t\ dev, int\ speed)$}
395
 
396
Although none of the drivers has implemented this function so far,
397
some drives are capable of head-speed selection, and hence this is a
398
capability that should be standardized through a function in the
399
device-operations structure. This function should select the speed at
400
which data is read or audio is played back. The special value `0'
401
means `auto-selection', i.e., maximum data-rate or real-time audio
402
rate. If the drive doesn't have this `auto-selection' capability, the
403
decision should be made on the current disc loaded and the return
404
value should be positive. A negative return value indicates an
405
error. (Although the audio-low-pass filters probably aren't designed
406
for it, more than real-time playback of audio might be used for
407
high-speed copying of audio tracks). Badly pressed \cdrom s may
408
benefit from less-than-maximum head rate.
409
 
410
\subsection{$Select_disc(kdev_t\ dev, int\ number)$}
411
 
412
If the drive can store multiple discs (a juke-box), it is likely that
413
a disc selection can be made by software. This function should perform
414
disc selection. It should return the number of the selected disc on
415
success, a negative value on error. Currently, none of the \linux\
416
\cdrom\ drivers appears to support such functionality, but it is defined
417
here for future purposes.
418
 
419
\subsection{$Get_last_session(kdev_t\ dev, struct\ cdrom_multisession *
420
ms_info)$}
421
 
422
This function should implement the old corresponding $ioctl()$. For
423
device $dev$, the start of the last session of the current disc should
424
be returned in the pointer argument $ms_info$. Note that routines in \cdromc\ have sanitized this argument: its
425
requested format will {\em always\/} be of the type $CDROM_LBA$
426
(linear block addressing mode), whatever the calling software
427
requested. But sanitization goes even further: the low-level
428
implementation may return the requested information in $CDROM_MSF$
429
format if it wishes so (setting the $ms_info\rightarrow addr_format$
430
field appropriately, of course) and the routines in \cdromc\ will make
431
the transform if necessary. The return value is 0 upon success.
432
 
433
\subsection{$Get_mcn(kdev_t\ dev, struct\ cdrom_mcn * mcn)$}
434
 
435
Some discs carry a `Media Catalog Number' (MCN), also called
436
`Universal Product Code' (UPC). This number should reflect the number that
437
is generally found in the bar-code on the product. Unfortunately, the
438
few discs that carry such a number on the disc don't even use the same
439
format. The return argument to this function is a pointer to a
440
pre-declared memory region of type $struct\ cdrom_mcn$. The MCN is
441
expected as a 13-character string, terminated by a null-character.
442
 
443
\subsection{$Reset(kdev_t dev)$}
444
 
445
This call should implement hard-resetting the drive (although in
446
circumstances that a hard-reset is necessary, a drive may very well
447
not listen to commands anymore). Preferably, control is returned to the
448
caller only after the drive has finished resetting.
449
 
450
\subsection{$Audio_ioctl(kdev_t\ dev, unsigned\ int\ cmd, void *
451
arg)$}
452
 
453
Some of the \cdrom-$ioctl$s defined in {\tt cdrom.h} can be
454
implemented by the routines described above, and hence the function
455
$cdrom_ioctl$ will use those. However, most $ioctl$s deal with
456
audio-control. We have decided to leave these accessed through a
457
single function, repeating the arguments $cmd$ and $arg$. Note that
458
the latter is of type $void*{}$, rather than $unsigned\ long\
459
int$. The routine $cdrom_ioctl()$ does do some useful things,
460
though. It sanitizes the address format type to $CDROM_MSF$ (Minutes,
461
Seconds, Frames) for all audio calls. It also verifies the memory
462
location of $arg$, and reserves stack-memory for the argument. This
463
makes implementation of the $audio_ioctl()$ much simpler than in the
464
old driver scheme. For an example you may look up the function
465
$cm206_audio_ioctl()$ in {\tt cm206.c} that should be updated with
466
this documentation.
467
 
468
An unimplemented ioctl should return $-EINVAL$, but a harmless request
469
(e.g., $CDROMSTART$) may be ignored by returning 0 (success). Other
470
errors should be according to the standards, whatever they are. (We
471
may decide to sanitize the return value in $cdrom_ioctl()$, in order
472
to guarantee a uniform interface to the audio-player software.)
473
 
474
\subsection{$Dev_ioctl(kdev_t\ dev, unsigned\ int\ cmd, unsigned\ long\
475
arg)$}
476
 
477
Some $ioctl$s seem to be specific to certain \cdrom\ drives. That is,
478
they are introduced to service some capabilities of certain drives. In
479
fact, there are 6 different $ioctl$s for reading data, either in some
480
particular kind of format, or audio data. Not many drives support
481
reading audio tracks as data, I believe this is because of protection
482
of copyrights of artists. Moreover, I think that if audio-tracks are
483
supported, it should be done through the VFS and not via $ioctl$s. A
484
problem here could be the fact that audio-frames are 2352 bytes long,
485
so either the audio-file-system should ask for 75264 bytes at once
486
(the least common multiple of 512 and 2352), or the drivers should
487
bend their backs to cope with this incoherence (to which I would be
488
opposed). Once this question is resolved, this code should be standardized in
489
\cdromc.
490
 
491
Because there are so many $ioctl$s that seem to be introduced to
492
satisfy certain drivers,\footnote{Is there software around that actually uses
493
these? I'd be interested!} any `non-standard' $ioctl$s are routed through
494
the call $dev_ioctl()$. In principle, `private' $ioctl$s should be
495
numbered after the device's major number, and not the general \cdrom\
496
$ioctl$ number, {\tt 0x53}. Currently the non-supported $ioctl$s are:
497
{\it CDROMREADMODE1, CDROMREADMODE2, CDROMREADAUDIO, CDROMREADRAW,
498
CDROMREADCOOKED, CDROMSEEK, CDROMPLAY\-BLK and CDROMREADALL}.
499
 
500
\subsection{\cdrom\ capabilities}
501
 
502
Instead of just implementing some $ioctl$ calls, the interface in
503
\cdromc\ supplies the possibility to indicate the {\em capabilities\/}
504
of a \cdrom\ drive. This can be done by ORing any number of
505
capability-constants that are defined in \ucdrom\ at the registration
506
phase. Currently, the capabilities are any of:
507
$$
508
\halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
509
CDC_CLOSE_TRAY& can close tray by software control\cr
510
CDC_OPEN_TRAY& can open tray\cr
511
CDC_LOCK& can lock and unlock the door\cr
512
CDC_SELECT_SPEED& can select speed, in units of $\sim$150\,kB/s\cr
513
CDC_SELECT_DISC& drive is juke-box\cr
514
CDC_MULTI_SESSION& can read sessions $>\rm1$\cr
515
CDC_MCN& can read Medium Catalog Number\cr
516
CDC_MEDIA_CHANGED& can report if disc has changed\cr
517
CDC_PLAY_AUDIO& can perform audio-functions (play, pause, etc)\cr
518
}
519
$$
520
The capability flag is declared $const$, to prevent drivers from
521
accidentally tampering with the contents. However, upon registration,
522
some (claimed) capability flags may be cleared if the supporting
523
function has not been implemented (see $register_cdrom()$ in
524
\cdromc).
525
 
526
If you want to disable any of the capabilities, there is a special
527
flag register $<device>_dops.mask$ that may (temporarily) disable
528
certain capabilities. In the file \cdromc\ you will encounter many
529
constructions of the type
530
$$\it
531
if\ (cdo\rightarrow capability \mathrel\& \mathord{\sim} cdo\rightarrow mask
532
   \mathrel{\&} CDC_<capability>) \ldots
533
$$
534
The $mask$ could be set in the low-level driver code to disable
535
certain capabilities for special brands of the device that can't
536
perform the actions.  However, there is not (yet) an $ioctl$ to set
537
the mask\dots The reason is that I think it is better to control the
538
{\em behavior\/} rather than the {\em capabilities}.
539
 
540
\subsection{Options}
541
 
542
A final flag register controls the {\em behavior\/} of the \cdrom\
543
drives, in order to satisfy different users' wishes, hopefully
544
independently of the ideas of the respective author who happened to
545
have made the drive's support available to the \linux\ community. The
546
current behavior options are:
547
$$
548
\halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
549
CDO_AUTO_CLOSE& try to close tray upon device $open()$\cr
550
CDO_AUTO_EJECT& try to open tray on last device $close()$\cr
551
CDO_USE_FFLAGS& use $file_pointer\rightarrow f_flags$ to indicate
552
 purpose for $open()$\cr
553
CDO_LOCK& try to lock door if device is opened\cr
554
CDO_CHECK_TYPE& ensure disc type is data if opened for data\cr
555
}
556
$$
557
 
558
The initial value of this register is $CDO_AUTO_CLOSE \mathrel|
559
CDO_USE_FFLAGS \mathrel| CDO_LOCK$, reflecting my own view on user
560
interface and software standards. Before you protest, there are two
561
new $ioctl$s implemented in \cdromc, that allow you to control the
562
behavior by software. These are:
563
$$
564
\halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
565
CDROM_SET_OPTIONS& set options specified in $(int)\ arg$\cr
566
CDROM_CLEAR_OPTIONS& clear options specified in $(int)\ arg$\cr
567
}
568
$$
569
One option needs some more explanation: $CDO_USE_FFLAGS$. In the next
570
section we explain what the need for this option is.
571
 
572
\section{The need to know the purpose of opening}
573
 
574
Traditionally, Unix devices can be used in two different `modes',
575
either by reading/writing to the device file, or by issuing
576
controlling commands to the device, by the device's $ioctl()$
577
call. The problem with \cdrom\ drives, is that they can be used for
578
two entirely different purposes. One is to mount removable
579
file systems, \cdrom s, the other is to play audio CD's. Audio commands
580
are implemented entirely through $ioctl$s, presumably because the
581
first implementation (SUN?) has been such. In principle there is
582
nothing wrong with this, but a good control of the `CD player' demands
583
that the device can {\em always\/} be opened in order to give the
584
$ioctl$ commands, regardless of the state the drive is in.
585
 
586
On the other hand, when used as a removable-media disc drive (what the
587
original purpose of \cdrom s is) we would like to make sure that the
588
disc drive is ready for operation upon opening the device. In the old
589
scheme, some \cdrom\ drivers don't do any integrity checking, resulting
590
in a number of i/o errors reported by the VFS to the kernel when an
591
attempt for mounting a \cdrom\ on an empty drive occurs. This is not a
592
particularly elegant way to find out that there is no \cdrom\ inserted;
593
it more-or-less looks like the old IBM-PC trying to read an empty floppy
594
drive for a couple of seconds, after which the system complains it
595
can't read from it. Nowadays we can {\em sense\/} the existence of a
596
removable medium in a drive, and we believe we should exploit that
597
fact. An integrity check on opening of the device, that verifies the
598
availability of a \cdrom\ and its correct type (data), would be
599
desirable.
600
 
601
These two ways of using a \cdrom\ drive, principally for data and
602
secondarily for playing audio discs, have different demands for the
603
behavior of the $open()$ call. Audio use simply wants to open the
604
device in order to get a file handle which is needed for issuing
605
$ioctl$ commands, while data use wants to open for correct and
606
reliable data transfer. The only way user programs can indicate what
607
their {\em purpose\/} of opening the device is, is through the $flags$
608
parameter (see {\tt open(2)}). For \cdrom\ devices, these flags aren't
609
implemented (some drivers implement checking for write-related flags,
610
but this is not strictly necessary if the device file has correct
611
permission flags). Most option flags simply don't make sense to
612
\cdrom\ devices: $O_CREAT$, $O_NOCTTY$, $O_TRUNC$, $O_APPEND$, and
613
$O_SYNC$ have no meaning to a \cdrom.
614
 
615
We therefore propose to use the flag $O_NONBLOCK$ to indicate
616
that the device is opened just for issuing $ioctl$
617
commands. Strictly, the meaning of $O_NONBLOCK$ is that opening and
618
subsequent calls to the device don't cause the calling process to
619
wait. We could interpret this as ``don't wait until someone has
620
inserted some valid data-\cdrom.'' Thus, our proposal of the
621
implementation for the $open()$ call for \cdrom s is:
622
\begin{itemize}
623
\item If no other flags are set than $O_RDONLY$, the device is opened
624
for data transfer, and the return value will be 0 only upon successful
625
initialization of the transfer. The call may even induce some actions
626
on the \cdrom, such as closing the tray.
627
\item If the option flag $O_NONBLOCK$ is set, opening will always be
628
successful, unless the whole device doesn't exist. The drive will take
629
no actions whatsoever.
630
\end{itemize}
631
 
632
\subsection{And what about standards?}
633
 
634
You might hesitate to accept this proposal as it comes from the
635
\linux\ community, and not from some standardizing institute. What
636
about SUN, SGI, HP and all those other Unix and hardware vendors?
637
Well, these companies are in the lucky position that they generally
638
control both the hardware and software of their supported products,
639
and are large enough to set their own standard. They do not have to
640
deal with a dozen or more different, competing hardware
641
configurations.\footnote{Personally, I think that SUN's approach to
642
mounting \cdrom s is very good in origin: under Solaris a
643
volume-daemon automatically mounts a newly inserted \cdrom\ under {\tt
644
/cdrom/$<volume-name>$/}. In my opinion they should have pushed this
645
further and have {\em every\/} \cdrom\ on the local area network be
646
mounted at the similar location, i.e., no matter in which particular
647
machine you insert a \cdrom, it will always appear at the same
648
position in the directory tree, on every system. When I wanted to
649
implement such a user-program for \linux, I came across the
650
differences in behavior of the various drivers, and the need for an
651
$ioctl$ informing about media changes.}
652
 
653
We believe that using $O_NONBLOCK$ to indicate that a device is being opened
654
for $ioctl$ commands only can be easily introduced in the \linux\
655
community. All the CD-player authors will have to be informed, we can
656
even send in our own patches to the programs. The use of $O_NONBLOCK$
657
has most likely no influence on the behavior of the CD-players on
658
other operating systems than \linux. Finally, a user can always revert
659
to old behavior by a call to $ioctl(file_descriptor, CDROM_CLEAR_OPTIONS,
660
CDO_USE_FFLAGS)$.
661
 
662
\subsection{The preferred strategy of $open()$}
663
 
664
The routines in \cdromc\ are designed in such a way that a run-time
665
configuration of the behavior of \cdrom\ devices (of {\em any\/} type)
666
can be carried out, by the $CDROM_SET/CLEAR_OPTIONS$ $ioctls$. Thus, various
667
modes of operation can be set:
668
\begin{description}
669
\item[$CDO_AUTO_CLOSE \mathrel| CDO_USE_FFLAGS \mathrel| CDO_LOCK$]
670
This is the default setting. (With $CDO_CHECK_TYPE$ it will be better,
671
in the future.) If the device is not yet opened by any other process,
672
and it is opened for data ($O_NONBLOCK$ is not set) and the tray is
673
found open, an attempt to close the tray is made. Then, it is verified
674
that a disc is in the drive and, if $CDO_CHECK_TYPE$ is set, that its
675
type is `data mode 1.' Only if all tests are passed, the return value
676
is zero. The door is locked to prevent file system corruption. If
677
opened for audio ($O_NONBLOCK$ is set), no actions are taken and a
678
value of 0 will be returned.
679
\item[0] $Open()$ will always be successful, the option flags are
680
ignored. Neither actions are undertaken, nor any integrity checks are
681
made.
682
\item[$CDO_AUTO_CLOSE \mathrel| CDO_AUTO_EJECT \mathrel| CDO_LOCK$]
683
This mimics the behavior of the current sbpcd-driver. The option flags
684
are ignored, the tray is closed on the first open, if
685
necessary. Similarly, the tray is opened on the last release, i.e., if
686
a \cdrom\ is unmounted, it is automatically ejected, such that the
687
user can replace it.
688
\end{description}
689
We hope that these option can convince everybody (both driver
690
maintainers and user program developers) to adapt to the new \cdrom\
691
driver scheme and option flag interpretation.
692
 
693
\section{Description of routines in \cdromc}
694
 
695
Only a few routines in \cdromc\ are exported to the drivers. In this
696
section we will treat these, as well as the functioning of the routines
697
that `take over' the interface to the kernel. The header file
698
belonging to \cdromc\ is called \ucdrom, but may be included in {\tt
699
cdrom.h} in the future.
700
 
701
\subsection{$struct\ file_operations\ cdrom_fops$}
702
 
703
The contents of this structure has been described in
704
section~\ref{cdrom.c}, and this structure should be used in
705
registering the block device to the kernel:
706
$$
707
register_blkdev(major, <name>, \&cdrom_fops);
708
$$
709
 
710
\subsection{$Int\ register_cdrom(int\ major, char * name, struct\
711
cdrom_device_ops\ * cdo)$}
712
 
713
Similar to registering $cdrom_fops$ to the kernel, the device
714
operations structure, as described in section~\ref{cdrom.c}, should be
715
registered to the general \cdrom\ interface:
716
$$
717
register_cdrom(major, <name>, \&<device>_dops);
718
$$
719
This function returns zero upon success, and non-zero upon failure.
720
 
721
\subsection{$Int\ unregister_cdrom(int\ major, char * name)$}
722
 
723
Unregistering device $name$ with major number $major$ disconnects the
724
registered device-operation routines from the \cdrom\ interface.
725
This function returns zero upon success, and non-zero upon failure.
726
 
727
\subsection{$Int\ cdrom_open(struct\ inode * ip, struct\ file * fp)$}
728
 
729
This function is not called directly by the low-level drivers, it is
730
listed in the standard $cdrom_fops$. If the VFS opens a file, this
731
function becomes active. A strategy logic is implemented in this
732
routine, taking care of all capabilities and options that are set in
733
the $cdrom_device_ops$ connected to the device. Then, the program flow is
734
transferred to the device_dependent $open()$ call.
735
 
736
\subsection{$Void\ cdrom_release(struct\ inode *ip, struct\ file
737
*fp)$}
738
 
739
This function implements the reverse-logic of $cdrom_open()$, and then
740
calls the device-dependent $release()$ routine.  When the use-count
741
has reached 0, the allocated buffers in the are flushed by calls to
742
$sync_dev(dev)$ and $invalidate_buffers(dev)$.
743
 
744
 
745
\subsection{$Int\ cdrom_ioctl(struct\ inode *ip, struct\ file *fp,
746
                       unsigned\ int\ cmd, unsigned\ long\ arg)$}
747
\label{cdrom-ioctl}
748
 
749
This function handles all $ioctl$ requests for \cdrom\ devices in a
750
uniform way. The different calls fall into three categories: $ioctl$s
751
that can be directly implemented by device operations, ones that are
752
routed through the call $audio_ioctl()$, and the remaining ones, that
753
are presumable device-dependent. Generally, a negative return value
754
indicates an error.
755
 
756
\subsubsection{Directly implemented $ioctl$s}
757
\label{ioctl-direct}
758
 
759
The following `old' \cdrom-$ioctl$s are implemented by directly
760
calling device-operations in $cdrom_device_ops$, if implemented and
761
not masked:
762
\begin{description}
763
\item[CDROMMULTISESSION] Requests the last session on a \cdrom.
764
\item[CDROMEJECT] Open tray.
765
\item[CDROMCLOSETRAY] Close tray.
766
\item[CDROMEJECT_SW] If $arg\not=0$, set behavior to auto-close (close
767
tray on first open) and auto-eject (eject on last release), otherwise
768
set behavior to non-moving on $open()$ and $release()$ calls.
769
\item[CDROM_GET_MCN or CDROM_GET_UPC] Get the Medium Catalog Number from a CD.
770
\end{description}
771
 
772
\subsubsection{$Ioctl$s rooted through $audio_ioctl()$}
773
\label{ioctl-audio}
774
 
775
The following set of $ioctl$s are all implemented through a call to
776
the $cdrom_fops$ function $audio_ioctl()$. Memory checks and
777
allocation are performed in $cdrom_ioctl()$, and also sanitization of
778
address format ($CDROM_LBA$/$CDROM_MSF$) is done.
779
\begin{description}
780
\item[CDROMSUBCHNL] Get sub-channel data in argument $arg$ of type $struct\
781
cdrom_subchnl *{}$.
782
\item[CDROMREADTOCHDR] Read Table of Contents header, in $arg$ of type
783
$struct\ cdrom_tochdr *{}$.
784
\item[CDROMREADTOCENTRY] Read a Table of Contents entry in $arg$ and
785
specified by $arg$ of type $struct\ cdrom_tocentry *{}$.
786
\item[CDROMPLAYMSF] Play audio fragment specified in Minute, Second,
787
Frame format, delimited by $arg$ of type $struct\ cdrom_msf *{}$.
788
\item[CDROMPLAYTRKIND] Play audio fragment in track-index format
789
delimited by $arg$ of type $struct cdrom_ti *{}$.
790
\item[CDROMVOLCTRL] Set volume specified by $arg$ of type $struct\
791
cdrom_volctrl *{}$.
792
\item[CDROMVOLREAD] Read volume into by $arg$ of type $struct\
793
cdrom_volctrl *{}$.
794
\item[CDROMSTART] Spin up disc.
795
\item[CDROMSTOP] Stop playback of audio fragment.
796
\item[CDROMPAUSE] Pause playback of audio fragment.
797
\item[CDROMRESUME] Resume playing.
798
\end{description}
799
 
800
\subsubsection{New $ioctl$s in \cdromc}
801
 
802
The following $ioctl$s have been introduced to allow user programs to
803
control the behavior of individual \cdrom\ devices. New $ioctl$
804
commands can be identified by the underscores in their names.
805
\begin{description}
806
\item[CDROM_SET_OPTIONS] Set options specified by $arg$. Returns the
807
option flag register after modification. Use  $arg = \rm0$ for reading
808
the current flags.
809
\item[CDROM_CLEAR_OPTIONS] Clear options specified by $arg$. Returns
810
  the option flag register after modification.
811
\item[CDROM_SELECT_SPEED] Select head-rate speed of disc specified as
812
  by $arg$. The value 0 means `auto-select', i.e., play audio discs at
813
  real time and data disc at maximum speed. The value $arg$ is
814
  checked against the maximum head rate of the drive found in
815
  the $cdrom_dops$.
816
\item[CDROM_SELECT_DISC] Select disc numbered $arg$ from a juke-box.
817
  First disc is numbered 0. The number $arg$ is checked against the
818
  maximum number of discs in the juke-box found in the $cdrom_dops$.
819
\item[CDROM_MEDIA_CHANGED] Returns 1 if a disc has been changed since
820
  the last call. Note that calls to $cdrom_media_changed$ by the VFS
821
  are treated by an independent queue, so both mechanisms will detect
822
  a media change once. Currently, \cdromc\ implements maximum 16 minors
823
  per major device.
824
\item[CDROM_DRIVE_STATUS] Returns the status of the drive by a call to
825
  $drive_status()$. Return values are as defined in section~\ref{drive
826
    status}. Note that this call doesn't return information on the
827
  current playing activity of the drive; this can be polled through an
828
  $ioctl$ call to $CDROMSUBCHNL$.
829
\item[CDROM_DISC_STATUS] Returns the type of the disc currently in the
830
  drive by a call to $disc_status()$. Return values are as defined in
831
  section~\ref{disc status}.
832
\end{description}
833
 
834
\subsubsection{Device dependent $ioct$s}
835
 
836
Finally, all other $ioctl$s are passed to the function $dev_ioctl()$,
837
if implemented. No memory allocation or verification is carried out.
838
 
839
\subsection{How to update your driver}
840
 
841
\begin{enumerate}
842
\item Make a backup of your current driver.
843
\item Get hold of the files \cdromc\ and \ucdrom, they should be in
844
the directory tree that came with this documentation.
845
\item Include {\tt \char`\<linux/ucdrom.h>} just after {\tt cdrom.h}.
846
\item Change the 3rd argument of $register_blkdev$ from
847
$\&<your-drive>_fops$ to $\&cdrom_fops$.
848
\item Just after that line, add a line to register to the \cdrom\
849
routines:
850
$$register_cdrom(major, <name>, <your-drive>_dops);$$
851
Similarly, add a call to $unregister_cdrom()$.
852
\item Copy an example of the device-operations $struct$ to your source,
853
e.g., from {\tt cm206.c} $cm206_dops$, and change all entries to names
854
corresponding to your driver, or names you just happen to like. If
855
your driver doesn't support a certain function, make the entry
856
$NULL$. At the entry $capability$ you should list all capabilities
857
your drive could support, in principle. If your drive has a capability
858
that is not listed, please send me a message.
859
\item Implement all functions in your $<device>_dops$ structure,
860
according to prototypes listed in \ucdrom, and specifications given in
861
section~\ref{cdrom.c}. Most likely you have already implemented
862
the code in a large part, and you may just have to adapt the prototype
863
and return values.
864
\item Rename your $<device>_ioctl()$ function to $audio_ioctl$ and
865
change the prototype a little. Remove entries listed in the first part
866
in section~\ref{cdrom-ioctl}, if your code was OK, these are just calls
867
to the routines you adapted in the previous step.
868
\item You may remove all remaining memory checking code in the
869
$audio_ioctl()$ function that deals with audio commands (these are
870
listed in the second part of section~\ref{cdrom-ioctl}). There is no
871
need for memory allocation either, so most $case$s in the $switch$
872
statement look similar to:
873
$$
874
case\ CDROMREADTOCENTRY\colon
875
get_toc_entry\bigl((struct\ cdrom_tocentry *{})\ arg\bigr);
876
$$
877
\item All remaining $ioctl$ cases must be moved to a separate
878
function, $<device>_ioctl$, the device-dependent $ioctl$s. Note that
879
memory checking and allocation must be kept in this code!
880
\item Change the prototypes of $<device>_open()$ and
881
$<device>_release()$, and remove any strategic code (i.e., tray
882
movement, door locking, etc.).
883
\item Try to recompile the drivers. We advice you to use modules, both
884
for {\tt cdrom.o} and your driver, as debugging is much easier this
885
way.
886
\end{enumerate}
887
 
888
\section{Thanks}
889
 
890
Thanks to all the people involved. Thanks to Thomas Quinot, Jon Tombs,
891
Ken Pizzini, Eberhard M\"onkeberg and Andrew Kroll, the \linux\
892
\cdrom\ device driver developers who were kind enough to give
893
suggestions and criticisms during the writing. Finally of course, I
894
want to thank Linus Torvalds for making this possible in the first
895
place.
896
 
897
\end{document}
898
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.