1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
|
.\"
.\" Copyright (C) 1996
.\" interface business GmbH
.\" Tolkewitzer Strasse 49
.\" D-01277 Dresden
.\" F.R. Germany
.\"
.\" All rights reserved.
.\"
.\" Written by Joerg Wunsch <joerg_wunsch@interface-business.de>
.\"
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY
.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
.\" OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
.\" USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
.\" DAMAGE.
.\"
.\" $Id: worm.4,v 1.14 1998/03/12 07:30:19 charnier Exp $
.\" "
.Dd January 27, 1996
.Dt WORM 4
.Os FreeBSD
.Sh NAME
.Nm worm
.Nd write-once (CD-R) disk driver
.Sh SYNOPSIS
.Cd disk worm0 at scbus?
.Cd disk worm0 at scbus 1 target 5 lun 0
.Sh DESCRIPTION
The
.Nm worm
driver provides support for
.Em SCSI
CD-R recording devices. The
driver attempts to abstract the dirty hardware work to a common API as
good as possible. Due to the very special nature of CD-R devices and
their handling requirements, this API applies some more constraints to
the user than those of other disk-like devices.
.Pp
A CD is usually structured into sessions and tracks. Each track can
hold a different type of data, basically either audio information, or
CD-ROM data. In order to record a CD-R, the device must be told which
kind of data is to be recorded, at which speed, etc. Once all tracks
of a session have been written, the medium must finally be
.Em fixated
which basically means that the table of contents will be written, and
the session is marked as usable. Optionally, a new session can be
enabled at this time, or the disk can be entirely closed to prevent
further writing.
.Pp
One particular feature of all existing CD-R recorders is that they
require a constant data stream while the write channel is open. This
usually requires some precautions like using a multiple-buffering
filter to read the data from the disk, and/or running at real-time
priority.
.Pp
There is no official standard for CD-R devices, so every vendor seems
to implement his own set of controlling commands. Some vendors use
rather similar command sets, while other devices behave entirely
different. The driver has builtin knowledge about the odds and ends
of some devices, which must then be selected first at run-time in
order to make the driver operational at all. This builtin knowledge
will be replaced by a loadable module scenario in the future.
.Pp
Due to the requirement of adjusting several parameters before actually
being able to write some data to the CD-R, and due to the tight timing
requirements when writing data, the driver distinguishes two different
operation modes. When opening a file descriptor for a device belonging
to the
.Nm
driver with
.Dv O_NONBLOCK
being set
.Pq see Xr open 2 ,
the driver does not enforce the tight timing that is needed to write
data to the CD-R, but it allows for sending
.Xr ioctl 2
commands to adjust parameters. Any number of ioctls can be performed
on the device as long as the required sequence of actions is being
maintained. The first thing that must be done is to select a set of
quirks for the actual device. Then, the per-session parameters must
be specified. Each track requires a set of per-track parameters
finally.
.Pp
Once all preparations have been done, the device can be opened with
write intent, at which point the driver starts to activate the
time-critical handling, and is expecting any number of
.Xr write 2
system calls that is required in order to transfer all the data to the
device. Failure in providing these data in a timely fashion will render
the current medium unusable. The device-specific sequence for telling
that the current track is finally complete will be issued to the device
when calling
.Xr close 2
on the file descriptor that has been used to write the data.
.Pp
After this happened, things are no longer time-critical. Any number of
further tracks can be written to the device. Finally, the session must
be fixated by another ioctl.
.Pp
Opening a read-only file descriptor on a
.Nm worm
device can be used in order to read a normal CD-ROM medium. No special
preparations are required in this case.
.Sh IOCTLS
The following
.Xr ioctl 2
calls apply to CD-R devices. Their declaration can be found in the
header file
.Pa <sys/wormio.h> .
.Bl -tag -width WORMIOFINISHTRACK
.It Dv WORMIOCPREPDISK
This command selects several session-wide parameters in the driver.
The argument structure,
.Dv struct wormio_prepare_disk
takes two integer values,
.Dv dummy ,
and
.Dv speed .
By setting
.Dv dummy
to 1, the drive will be told to simulate all actions, without actually
turning on the laser. It is mainly used to test the environment
whether it could cope with the timing constraints, without risking a
damaged medium. The parameter
.Dv speed
is device-dependent, where a speed value of one generally applies to
audio disks, and a speed value of 2 (or more) is used for recording
data.
.It Dv WORMIOCPREPTRACK
This command selects several options for writing the next track.
The argument structure,
.Dv struct wormio_prepare_track
is as follows:
.Bd -literal -offset indent
struct wormio_prepare_track {
int audio;
int preemp;
int track_type;
int copy_bits;
int track_number;
char ISRC_country[2];
char ISRC_owner[3];
int ISRC_year;
char ISRC_serial[5];
};
.Ed
.Dv audio
should be set to 1 if you are recording an audio track.
If
.Dv preemp
is also set to 1, the audio data are assumed to be recorded with
preemphasis.
.Dv track_type
defines both the the specific data fields in a user data block and
its size. Currently available types are
.Bl -tag -width BLOCK_MODE_2_FORM_2b
.It Dv BLOCK_RAW
2352 bytes, raw data.
.It Dv BLOCK_RAWPQ
2368 bytes, raw data with P and Q subchannels.
.It Dv BLOCK_RAWPW
2448 bytes, raw data with P-W subchannel appended.
.It Dv BLOCK_MODE_1
2048 bytes, mode 1 (ISO/IEC 10149).
.It Dv BLOCK_MODE_2
2336 bytes, mode 2 (ISO/IEC 10149).
.It Dv BLOCK_MODE_2_FORM_1
2048 bytes, CD-ROM XA form 1.
.It Dv BLOCK_MODE_2_FORM_1b
2056 bytes, CD-ROM XA form 1.
.It Dv BLOCK_MODE_2_FORM_2
2324 bytes, CD-ROM XA form 2.
.It Dv BLOCK_MODE_2_FORM_2b
2332 bytes, CD-ROM XA form 2.
.El
.Pp
Note that not all track types are supported for a given drive.
.Pp
.Dv copy_bits
define the permissions for copying the track. Available values are
.Bl -tag -width COPY_PERMITTED
.It Dv COPY_INHIBIT
No copy is allowed.
.It Dv COPY_PERMITTED
The track can be copied.
.It Dv COPY_SCMS
The track can be copied once.
.El
.Dv track_number :
if the track number is zero, a new track will be created with a track
number one higher than the previous track. If the track number is not
zero, then this track number must point to a reserved track, unless it
is an empty disc which will start with the given track number.
.Dv ISRC_country :
two characters in the range [0-9A-Z] defining the country code.
.Dv ISRC_owner :
three characters in the range [0-9A-Z] defining the owner code.
.Dv ISRC_year :
the year of recording.
.Dv ISRC_serial :
a serial number, composed of 5 digits.
.Pp
For writing an audio track, setting
.Dv audio
to 1,
.Dv preemp
to 0 or 1 and all the other field to 0 will do the job. For writing a
data track, you can just set
.Dv track_type
to
.Dv BLOCK_MODE_1 .
.It Dv WORMIOCREADSESSIONINFO
This command returns the information needed for writing a complete
session at once. The argument structure,
.Dv struct wormio_session_info ,
is as follows:
.Bd -literal -offset indent
struct wormio_session_info {
u_short lead_in;
u_short lead_out;
};
.Ed
.Dv lead_in
gives the length (in blocks) of the lead-in area.
.Dv lead_out
gives the length (in blocks) of the lead-out area.
.It WORMIOCWRITESESSION
This command enables to write a session without interruption. You must
then supply raw data blocks for the lead-in, the program area
(including pregaps) and the lead-out. The session is closed with a
.Dv WORMIOCFINISHTRACK
command. The argument structure,
.Dv wormio_write_session ,
is as follows:
.Bd -literal -offset indent
struct wormio_write_session {
int toc_type;
int onp;
int lofp;
int length;
char catalog[13];
u_char *track_desc;
};
.Ed
.Dv toc_type
determines what type of table of contents will be recorded in the
lead-in. Possible values are:
.Bl -tag -width XXX
.It Dv 0
CD-DA
.It Dv 1
CD_ROM
.It Dv 2
CD-ROM XA with first track in mode 1
.It Dv 3
CD-ROM XA with first track in mode 2
.It Dv 4
CDI
.El
.Dv onp ,
if set to 1 requests a new program area to be opened. This implies
that the start time of the new program area is included in the lead-in
of the current session.
.Dv lofp
is a parameter only valid when
.Dv toc_type
is equal to 1 and specifies whether the lead-out must be written in
mode 1 or mode 2. The mode of the lead-out must be equal to the mode
of the last track of the session.
.Dv length
specifies the length of the track descriptor.
.Dv catalog
can be used to set the catalog number information and is composed of
13 digits. If this array is composed of null bytes, no catalog will be
written.
.Dv track_desc
is a pointer to the array containing the encoding of the table of
contents.
.It Dv WORMIOCFINISHTRACK
Will terminate the track. It takes no argument. Note that closing the
device will also terminate the track.
.It Dv WORMIOCFIXATION
This closes the current session. The argument is a pointer to
.Dv struct wormio_fixation ,
with the elements
.Dv toc_type ,
an integer between 0 and 4, describing the table-of-contents type. See
.Xr wormcontrol 8
for a list of useful values. Optionally, setting the field
.Dv onp
to 1 will cause the next session being opened, so further recording
can be performed into the remaining space. If
.Dv onp
is 0, the disk will be closed once and for all.
.It Dv WORMIOCFIRSTWRITABLEADDR
This command will return the next logical writable address for the
write command. The argument is a pointer to
.Dv struct wormio_first_writable_addr ,
with the elements
.Dv track ,
the track for which the write address will be returned,
.Dv mode ,
which can take the values 1 or 2,
.Dv raw ,
which must be set to 1 if the pregap must not be taken in account,
.Dv audio ,
which must be set to 1 for an audio track (in this case, mode
indicates if there is preemphasis) and
.Dv addr .
addr will be the address corresponding to the next write command.
.It Dv WORMIOERROR
This call may be used to get additional information when a I/O error
occured or to check if the last command ended with a recovered
error or a warning. The argument is a pointer to an integer. The
returned value can be:
.Bl -tag -width WORM_
.It Dv WORM_SEQUENCE_ERROR
Occurs if a write is performed when the track has not been prepared or
if
.Dv WORMCPREPTRACK
is done without a prior
.Dv WORMIOCPREPDISK .
.It Dv WORM_BUFFER_UNDERRUN
Indicates that the write action stopped because the cache buffer emptied.
.It Dv WORM_DUMMY_BLOCKS_ADDED
This a warning which may occur when the track is closed. Indicates
that during writing dummy blocks are added to meet the disc
specification (minimum of 300 blocks for a track).
.It Dv WORM_CALIBRATION_AREA_ALMOST_FULL
This is warning which indicates that a few Optimum Power Calibration
areas are left. It is recommended to fixate after the tracks are written.
.It Dv WORM_CALIBRATION_AREA_FULL
Indicates that the Calibration area is full. This means that no further
writes can be performed on this disc.
.It Dv WORM_ABSORPTION_CONTROL_ERROR
Indicates that an error might have occurred in the recorded data that
was written, caused by laser power clipping. This is a warning.
.It Dv WORM_END_OF_MEDIUM
Indicates that during writing the end of medium is detected or the
amount of track reached the limit of 99.
.It Dv WORM_OPTIMUM_POWER_CALIBRATION_ERROR
Indicates that power calibration failed. This could indicate: Wrong WO
medium installed, laser failure or drive failure.
.Pp
.El
If an unknown error occured, the returned value will be -1.
.El
Specifying wrong argument values to the above ioctl command will cause
the driver to return an error condition with
.Va errno
set to
.Er EINVAL .
.Pp
In addition, the
.Xr scsi 4
general ioctls may be used with the
.Nm
driver, but only against the control device.
.Sh BUGS
The driver is considered beta quality. There's still a lot of
polishing required.
.Pp
Preparing the driver for a CD-R from another vendor will require you
to understand the source code, be used to the SCSI-2 specification,
hold a copy of the vendor's SCSI reference manual on your desk, and
have a lot of patience and CD-R's.
.Pp
The driver should include all the functionality of the
.Xr cd 4
driver. No strategy for implementing this kind of interaction has
been designed yet, altough it's now finally possible to at least
read CD-ROM media through it.
.Pp
The first
.Em Unit Attention
conditition after a media change is often not yet caught, although
the driver was designed to catch it. This can royally screw a user
of the driver, thus make sure to manually catch it before actually
starting a burn. This can be done for example with a dummy
.Em Test Unit Ready
command:
.Bd -literal
scsi -f /dev/rworm0.ctl -c "0 0 0 0 0 0" >/dev/null 2>&1
.Ed
.Sh FILES
.Bl -tag -width /dev/rworm[0-9].ctl -compact
.It Pa /dev/rworm[0-9]
device for ioctl's and to write a CD-R
.It Pa /dev/rworm[0-9].ctl
the control device, as being used by
.Xr scsi 8
.It Pa /dev/worm[0-9]
the buffered devices that can be used to mount a CD-ROM.
.El
.Sh DIAGNOSTICS
See above.
.Sh SEE ALSO
.Xr close 2 ,
.Xr ioctl 2 ,
.Xr open 2 ,
.Xr write 2 ,
.Xr cd 4 ,
.Xr scsi 4 ,
.Xr scsi 8 ,
.Xr wormcontrol 8
.Sh AUTHORS
The first skeleton for a
.Nm
driver has been written by
.An Peter Dufault
in May, 1995. The driver has
then been improved and made actually usable at all by
.ie t J\(:org Wunsch
.el Joerg Wunsch
in January, 1996.
.Sh HISTORY
The
.Nm
driver appeared in
.Fx 2.1 .
|