]>
Commit | Line | Data |
---|---|---|
b2f9b8e5 AM |
1 | --- cdrtools-2.01/cdrecord/drv_mmc.c.dvd 2004-05-25 00:36:01.000000000 +0200 |
2 | +++ cdrtools-2.01/cdrecord/drv_mmc.c 2004-10-18 14:40:10.329455353 +0200 | |
3 | @@ -84,8 +84,11 @@ | |
4 | EXPORT char *hasdrvopt __PR((char *optstr, char *optname)); | |
5 | LOCAL cdr_t *identify_mmc __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *)); | |
6 | LOCAL int attach_mmc __PR((SCSI *scgp, cdr_t *)); | |
7 | +LOCAL int attach_mdvd __PR((SCSI *scgp, cdr_t *)); | |
8 | EXPORT int check_writemodes_mmc __PR((SCSI *scgp, cdr_t *dp)); | |
9 | +LOCAL int check_writemodes_mdvd __PR((SCSI *scgp, cdr_t *dp)); | |
10 | LOCAL int deflt_writemodes_mmc __PR((SCSI *scgp, BOOL reset_dummy)); | |
11 | +LOCAL int deflt_writemodes_mdvd __PR((SCSI *scgp, BOOL reset_dummy)); | |
12 | LOCAL int get_diskinfo __PR((SCSI *scgp, struct disk_info *dip)); | |
13 | LOCAL void di_to_dstat __PR((struct disk_info *dip, dstat_t *dsp)); | |
14 | LOCAL int get_atip __PR((SCSI *scgp, struct atipinfo *atp)); | |
15 | @@ -94,18 +97,27 @@ | |
16 | #endif | |
17 | LOCAL int init_mmc __PR((SCSI *scgp, cdr_t *dp)); | |
18 | LOCAL int getdisktype_mmc __PR((SCSI *scgp, cdr_t *dp)); | |
19 | +LOCAL int getdisktype_mdvd __PR((SCSI *scgp, cdr_t *dp)); | |
20 | LOCAL int speed_select_mmc __PR((SCSI *scgp, cdr_t *dp, int *speedp)); | |
21 | +LOCAL int speed_select_mdvd __PR((SCSI *scgp, cdr_t *dp, int *speedp)); | |
22 | LOCAL int mmc_set_speed __PR((SCSI *scgp, int readspeed, int writespeed, int rotctl)); | |
23 | LOCAL int next_wr_addr_mmc __PR((SCSI *scgp, track_t *trackp, long *ap)); | |
24 | +LOCAL int next_wr_addr_mdvd __PR((SCSI *scgp, track_t *trackp, long *ap)); | |
25 | LOCAL int write_leadin_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
26 | LOCAL int open_track_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
27 | +LOCAL int open_track_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
28 | LOCAL int close_track_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
29 | +LOCAL int close_track_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
30 | LOCAL int open_session_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
31 | +LOCAL int open_session_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
32 | LOCAL int waitfix_mmc __PR((SCSI *scgp, int secs)); | |
33 | LOCAL int fixate_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
34 | +LOCAL int fixate_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); | |
35 | LOCAL int blank_mmc __PR((SCSI *scgp, cdr_t *dp, long addr, int blanktype)); | |
36 | +LOCAL int format_mdvd __PR((SCSI *scgp, cdr_t *dp, int formattype)); | |
37 | LOCAL int send_opc_mmc __PR((SCSI *scgp, caddr_t, int cnt, int doopc)); | |
38 | LOCAL int opt1_mmc __PR((SCSI *scgp, cdr_t *dp)); | |
39 | +LOCAL int opt1_mdvd __PR((SCSI *scgp, cdr_t *dp)); | |
40 | LOCAL int opt2_mmc __PR((SCSI *scgp, cdr_t *dp)); | |
41 | LOCAL int scsi_sony_write __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast)); | |
42 | LOCAL int gen_cue_mmc __PR((track_t *trackp, void *vcuep, BOOL needgap)); | |
515b0c3b | 43 | @@ -197,6 +209,47 @@ |
b2f9b8e5 AM |
44 | opt2_mmc, |
45 | }; | |
46 | ||
47 | +cdr_t cdr_mdvd = { | |
48 | + 0, 0, | |
49 | + CDR_SWABAUDIO, | |
515b0c3b | 50 | + CDR_CDRW_ALL, |
b2f9b8e5 AM |
51 | + 370,370, |
52 | + "mmc_mdvd", | |
53 | + "generic SCSI-3/mmc DVD-R(W) driver", | |
54 | + 0, | |
55 | + (dstat_t *)0, | |
56 | + identify_mmc, | |
57 | + attach_mdvd, | |
58 | + init_mmc, | |
59 | + getdisktype_mdvd, | |
60 | + scsi_load, | |
61 | + scsi_unload, | |
62 | + read_buff_cap, | |
63 | + cmd_dummy, /* recovery_needed */ | |
64 | + (int(*)__PR((SCSI *, int)))cmd_dummy, /* recover */ | |
65 | + speed_select_mdvd, | |
66 | + select_secsize, | |
67 | + next_wr_addr_mdvd, | |
68 | + (int(*)__PR((SCSI *, Ulong)))cmd_ill, /* reserve_track */ | |
69 | + scsi_cdr_write, | |
70 | + (int(*)__PR((SCSI *scgp, int, track_t *)))cmd_dummy, /* gen_cue */ | |
71 | + (int(*)__PR((SCSI *scgp, cdr_t *, track_t *)))cmd_dummy, /* send_cue */ | |
72 | + write_leadin_mmc, | |
73 | + open_track_mdvd, | |
74 | + close_track_mdvd, | |
75 | + open_session_mdvd, | |
76 | + cmd_dummy, | |
77 | + cmd_dummy, /* abort */ | |
78 | + read_session_offset, | |
79 | + fixate_mdvd, | |
80 | + stats_mmc, | |
81 | + blank_mmc, | |
82 | + format_mdvd, | |
83 | + send_opc_mmc, | |
84 | + opt1_mdvd, | |
85 | + opt2_mmc, | |
86 | +}; | |
87 | + | |
88 | /* | |
89 | * Sony MMC CD-writer | |
90 | */ | |
91 | @@ -556,7 +608,21 @@ | |
92 | if (profile >= 0) { | |
93 | if (lverbose) | |
94 | print_profiles(scgp); | |
95 | - if (profile == 0 || profile == 0x12 || profile > 0x19) { | |
96 | + if (profile == 0 || profile >= 0x10 && profile <= 0x15 || profile > 0x19) { | |
97 | + /* | |
98 | + * 10h DVD-ROM | |
99 | + * 11h DVD-R | |
100 | + * 12h DVD-RAM | |
101 | + * 13h DVD-RW (Restricted overwrite) | |
102 | + * 14h DVD-RW (Sequential recording) | |
103 | + * 1Ah DVD+RW | |
104 | + * 1Bh DVD+R | |
105 | + * | |
106 | + */ | |
107 | + if (profile == 0x11 || profile == 0x13 || profile == 0x14 || profile == 0x1A || profile == 0x1B) { | |
108 | + is_dvd = TRUE; | |
109 | + dp = &cdr_mdvd; | |
110 | + } else { | |
111 | is_dvd = FALSE; | |
112 | dp = &cdr_cd; | |
113 | ||
114 | @@ -578,23 +644,8 @@ | |
115 | errmsgno(EX_BAD, | |
116 | "Found unsupported DVD-RAM media.\n"); | |
117 | return (dp); | |
118 | - } else { /* DVD+RW DVD+R */ | |
119 | - errmsgno(EX_BAD, | |
120 | - "Found DVD+ media but DVD+R/DVD+RW support code is missing.\n"); | |
121 | - errmsgno(EX_BAD, | |
122 | - "If you need DVD+R/DVD+RW support, ask the Author for cdrecord-ProDVD.\n"); | |
123 | - errmsgno(EX_BAD, | |
124 | - "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n"); | |
125 | - return (dp); | |
126 | } | |
127 | - } else if (profile >= 0x10 && profile < 0x18) { | |
128 | - errmsgno(EX_BAD, | |
129 | - "Found DVD media but DVD-R/DVD-RW support code is missing.\n"); | |
130 | - errmsgno(EX_BAD, | |
131 | - "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n"); | |
132 | - errmsgno(EX_BAD, | |
133 | - "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n"); | |
134 | - return (dp); | |
135 | + } | |
136 | } | |
137 | } else { | |
138 | if (xdebug) | |
139 | @@ -661,13 +712,12 @@ | |
140 | #endif | |
141 | } | |
142 | if (is_dvd) { | |
143 | - errmsgno(EX_BAD, | |
144 | - "Found DVD media but DVD-R/DVD-RW support code is missing.\n"); | |
145 | - errmsgno(EX_BAD, | |
146 | - "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n"); | |
147 | - errmsgno(EX_BAD, | |
148 | - "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n"); | |
149 | + errmsgno(EX_BAD, | |
150 | + "Found DVD media: using cdr_mdvd.\n"); | |
151 | + dp = &cdr_mdvd; | |
152 | } | |
153 | + dp->profile = profile; | |
154 | + dp->is_dvd = is_dvd; | |
155 | return (dp); | |
156 | } | |
157 | ||
158 | @@ -856,6 +906,42 @@ | |
159 | return (0); | |
160 | } | |
161 | ||
162 | +LOCAL int | |
163 | +attach_mdvd(scgp, dp) | |
164 | + SCSI *scgp; | |
165 | + cdr_t *dp; | |
166 | +{ | |
167 | + struct cd_mode_page_2A *mp; | |
168 | + | |
169 | + | |
170 | + allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */ | |
171 | + | |
172 | + scgp->silent++; | |
173 | + mp = mmc_cap(scgp, NULL);/* Get MMC capabilities in allocated mp */ | |
174 | + scgp->silent--; | |
175 | + if (mp == NULL) | |
176 | + return (-1); /* Pre SCSI-3/mmc drive */ | |
177 | + | |
178 | + dp->cdr_cdcap = mp; /* Store MMC cap pointer */ | |
179 | + | |
180 | + if (mp->loading_type == LT_TRAY) | |
181 | + dp->cdr_flags |= CDR_TRAYLOAD; | |
182 | + else if (mp->loading_type == LT_CADDY) | |
183 | + dp->cdr_flags |= CDR_CADDYLOAD; | |
184 | + | |
185 | + if (mp->BUF != 0) | |
186 | + dp->cdr_flags |= CDR_BURNFREE; | |
187 | + | |
188 | + check_writemodes_mdvd(scgp, dp); | |
189 | + | |
190 | + if (driveropts != NULL) { | |
191 | + if (strcmp(driveropts, "help") == 0) { | |
192 | + mmc_opthelp(dp, 0); | |
193 | + } | |
194 | + } | |
195 | + | |
196 | + return (0); | |
197 | +} | |
198 | ||
199 | EXPORT int | |
200 | check_writemodes_mmc(scgp, dp) | |
201 | @@ -1007,6 +1093,77 @@ | |
202 | } | |
203 | ||
204 | LOCAL int | |
205 | +check_writemodes_mdvd(scgp, dp) | |
206 | + SCSI *scgp; | |
207 | + cdr_t *dp; | |
208 | +{ | |
209 | + Uchar mode[0x100]; | |
210 | + int len; | |
211 | + struct cd_mode_page_05 *mp; | |
212 | + | |
213 | + if (xdebug) | |
214 | + printf("Checking possible write modes: "); | |
215 | + | |
216 | + deflt_writemodes_mdvd(scgp, FALSE); | |
217 | + | |
218 | + fillbytes((caddr_t)mode, sizeof(mode), '\0'); | |
219 | + | |
220 | + scgp->silent++; | |
221 | + if (!get_mode_params(scgp, 0x05, "CD write parameter", | |
222 | + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { | |
223 | + scgp->silent--; | |
224 | + return (-1); | |
225 | + } | |
226 | + if (len == 0) { | |
227 | + scgp->silent--; | |
228 | + return (-1); | |
229 | + } | |
230 | + | |
231 | + mp = (struct cd_mode_page_05 *) | |
232 | + (mode + sizeof(struct scsi_mode_header) + | |
233 | + ((struct scsi_mode_header *)mode)->blockdesc_len); | |
234 | + | |
235 | + mp->test_write = 0; | |
236 | + | |
237 | + /*We only check for PACKET and SAO since these are the only supported modes for DVD */ | |
238 | + /*XXX these checks are irrelevant because they are not medium sensitive. ie the device returns | |
239 | + error only when it does not support a given mode for ALL mediums. It should check using | |
240 | + GET CONFIGURATION command.*/ | |
241 | + | |
242 | + mp->write_type = WT_PACKET; | |
243 | + mp->fp = 0; | |
244 | + i_to_4_byte(mp->packet_size, 0); | |
245 | + | |
246 | + if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) { | |
247 | + dp->cdr_flags |= CDR_PACKET; | |
248 | + if (xdebug) | |
249 | + printf("PACKET "); | |
250 | + } else | |
251 | + dp->cdr_flags &= ~CDR_PACKET; | |
252 | + mp->fp = 0; | |
253 | + i_to_4_byte(mp->packet_size, 0); | |
254 | + mp->track_mode = TM_DATA; | |
255 | + | |
256 | + | |
257 | + mp->write_type = WT_SAO; | |
258 | + | |
259 | + if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) { | |
260 | + dp->cdr_flags |= CDR_SAO; | |
261 | + if (xdebug) | |
262 | + printf("SAO "); | |
263 | + } else | |
264 | + dp->cdr_flags &= ~CDR_SAO; | |
265 | + | |
266 | + | |
267 | + if (xdebug) | |
268 | + printf("\n"); | |
269 | + | |
270 | + deflt_writemodes_mdvd(scgp, TRUE); | |
271 | + scgp->silent--; | |
272 | + return (0); | |
273 | +} | |
274 | + | |
275 | +LOCAL int | |
276 | deflt_writemodes_mmc(scgp, reset_dummy) | |
277 | SCSI *scgp; | |
278 | BOOL reset_dummy; | |
279 | @@ -1080,6 +1237,61 @@ | |
280 | return (0); | |
281 | } | |
282 | ||
283 | +LOCAL int | |
284 | +deflt_writemodes_mdvd(scgp, reset_dummy) | |
285 | + SCSI *scgp; | |
286 | + BOOL reset_dummy; | |
287 | +{ | |
288 | + Uchar mode[0x100]; | |
289 | + int len; | |
290 | + struct cd_mode_page_05 *mp; | |
291 | + | |
292 | + fillbytes((caddr_t)mode, sizeof(mode), '\0'); | |
293 | + | |
294 | + scgp->silent++; | |
295 | + if (!get_mode_params(scgp, 0x05, "DVD write parameter", | |
296 | + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { | |
297 | + scgp->silent--; | |
298 | + return (-1); | |
299 | + } | |
300 | + if (len == 0) { | |
301 | + scgp->silent--; | |
302 | + return (-1); | |
303 | + } | |
304 | + | |
305 | + mp = (struct cd_mode_page_05 *) | |
306 | + (mode + sizeof(struct scsi_mode_header) + | |
307 | + ((struct scsi_mode_header *)mode)->blockdesc_len); | |
308 | + | |
309 | + mp->test_write = 0; | |
310 | + /* | |
311 | + * This is the only place where we reset mp->test_write (-dummy) | |
312 | + */ | |
313 | + if (reset_dummy) | |
314 | + mp->test_write = 0; | |
315 | + | |
316 | + | |
317 | + /* | |
318 | + * Set default values: | |
319 | + * Write type = 02 (session at once) | |
320 | + * | |
321 | + * XXX Note: the same code appears in check_writemodes_mmc() and | |
322 | + * XXX in speed_select_mmc(). | |
323 | + */ | |
324 | + mp->write_type = WT_SAO; | |
325 | + mp->track_mode = TM_DATA; | |
326 | + mp->dbtype = DB_ROM_MODE1; | |
327 | + mp->session_format = SES_DA_ROM; | |
328 | + | |
329 | + | |
330 | + if (set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1) < 0) { | |
331 | + scgp->silent--; | |
332 | + return (-1); | |
333 | + } | |
334 | + scgp->silent--; | |
335 | + return (0); | |
336 | +} | |
337 | + | |
338 | #ifdef PRINT_ATIP | |
339 | LOCAL void print_di __PR((struct disk_info *dip)); | |
340 | LOCAL void atip_printspeed __PR((char *fmt, int speedindex, char speedtab[])); | |
341 | @@ -1149,6 +1361,9 @@ | |
342 | ||
343 | if (dsp->ds_last_leadout == 0 && dsp->ds_maxblocks >= 0) | |
344 | dsp->ds_last_leadout = dsp->ds_maxblocks; | |
345 | + dsp->ds_trfirst=dip->first_track; | |
346 | + dsp->ds_trlast=dip->last_track_ls; | |
347 | + dsp->ds_trfirst_ls=dip->first_track_ls; | |
348 | } | |
349 | ||
350 | LOCAL int | |
351 | @@ -1259,6 +1474,30 @@ | |
352 | } | |
353 | ||
354 | LOCAL int | |
355 | +getdisktype_mdvd(scgp, dp) | |
356 | + SCSI *scgp; | |
357 | + cdr_t *dp; | |
358 | +{ | |
359 | + int ret=0; | |
360 | + dstat_t *dsp = dp->cdr_dstat; | |
361 | + | |
362 | + struct track_info track_info; | |
363 | + if(getdisktype_mmc(scgp, dp)<0) | |
364 | + return -1; | |
365 | + | |
366 | + /* read rzone info to get the space left on disk */ | |
367 | + /*ds_trlast is the last rzone on disk, can be invisible */ | |
368 | + if(read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info))>=0) | |
369 | + dsp->ds_maxblocks=a_to_u_4_byte(track_info.free_blocks)+a_to_4_byte(track_info.next_writable_addr); | |
370 | + | |
371 | + dsp->ds_disktype&= ~DT_CD; | |
372 | + dsp->ds_disktype|= DT_DVD; | |
373 | + | |
374 | + return (ret); | |
375 | + | |
376 | +} | |
377 | + | |
378 | +LOCAL int | |
379 | getdisktype_mmc(scgp, dp) | |
380 | SCSI *scgp; | |
381 | cdr_t *dp; | |
382 | @@ -1688,6 +1927,7 @@ | |
383 | * But the standard is rounding the wrong way. | |
384 | * Furtunately rounding down is guaranteed. | |
385 | */ | |
386 | + //val = curspeed*177; | |
387 | val = curspeed*177; | |
388 | if (val > 0xFFFF) | |
389 | val = 0xFFFF; | |
390 | @@ -1700,6 +1940,7 @@ | |
391 | ||
392 | if (scsi_get_speed(scgp, 0, &val) >= 0) { | |
393 | if (val > 0) { | |
394 | + printf("Speed set to %d KB/s\n", val); | |
395 | curspeed = val / 176; | |
396 | *speedp = curspeed; | |
397 | } | |
398 | @@ -1762,6 +2003,68 @@ | |
399 | } | |
400 | ||
401 | LOCAL int | |
402 | +speed_select_mdvd(scgp, dp, speedp) | |
403 | + SCSI *scgp; | |
404 | + cdr_t *dp; | |
405 | + int *speedp; | |
406 | +{ | |
407 | + int retcode; | |
408 | + unsigned char perf_desc[28]; | |
409 | + int write_speed = *speedp * 1385; | |
410 | + int val = 0, val2 = 0; | |
411 | + int i; | |
412 | + | |
413 | + /* For the moment we just divide the CD speed by 7*/ | |
414 | + | |
415 | + if(speedp!=NULL) | |
416 | + (*speedp)=(*speedp)*8; | |
417 | + | |
418 | + memset(perf_desc, 0, sizeof(perf_desc)); | |
419 | + | |
420 | + /* Write Rotation Control = ROTCTL_CLV | |
421 | + * | Restore Logical Unit Defaults = 0 | |
422 | + * | Exact = 0 | |
423 | + * | Random Access = 0) | |
424 | + */ | |
425 | + perf_desc[0]= ROTCTL_CLV << 3 | 0 << 2 | 0 << 1 | 0; | |
426 | + /* Start LBA to 0 */ | |
427 | + perf_desc[4] = 0; | |
428 | + perf_desc[5] = 0; | |
429 | + perf_desc[6] = 0; | |
430 | + perf_desc[7] = 0; | |
431 | + /* End LBA set to 0 (setting to 0xffffffff failed on my LG burner | |
432 | + */ | |
433 | + perf_desc[8] = 0; | |
434 | + perf_desc[9] = 0; | |
435 | + perf_desc[10] = 0; | |
436 | + perf_desc[11] = 0; | |
437 | + /* Read Speed = 0xFFFF */ | |
438 | + perf_desc[12] = 0; | |
439 | + perf_desc[13] = 0; | |
440 | + perf_desc[14] = 0xFF; | |
441 | + perf_desc[15] = 0xFF; | |
442 | + /* Read Time = 1s */ | |
443 | + perf_desc[18] = 1000 >> 8; | |
444 | + perf_desc[19] = 1000 & 0xFF; | |
445 | + /* Write Speed */ | |
446 | + perf_desc[20] = write_speed >> 24; | |
447 | + perf_desc[21] = write_speed >> 16 & 0xFF; | |
448 | + perf_desc[22] = write_speed >> 8 & 0xFF; | |
449 | + perf_desc[23] = write_speed & 0xFF; | |
450 | + /* Write Time = 1s */ | |
451 | + perf_desc[26] = 1000 >> 8; | |
452 | + perf_desc[27] = 1000 & 0xFF; | |
453 | + | |
454 | + //retcode = scsi_set_streaming(scgp, NULL, 0); | |
455 | + retcode = scsi_set_streaming(scgp, &perf_desc, sizeof(perf_desc)); | |
456 | + if (retcode == -1) return retcode; | |
457 | + retcode = speed_select_mmc(scgp, dp, speedp); | |
458 | + if(speedp!=NULL) | |
459 | + (*speedp)=(*speedp)/7; | |
460 | + return retcode; | |
461 | +} | |
462 | + | |
463 | +LOCAL int | |
464 | next_wr_addr_mmc(scgp, trackp, ap) | |
465 | SCSI *scgp; | |
466 | track_t *trackp; | |
467 | @@ -1898,6 +2201,48 @@ | |
468 | }; | |
469 | ||
470 | LOCAL int | |
471 | +next_wr_addr_mdvd(scgp, trackp, ap) | |
472 | + SCSI *scgp; | |
473 | + track_t *trackp; | |
474 | + long *ap; | |
475 | +{ | |
476 | + int track; | |
477 | + struct track_info track_info; | |
478 | + long next_addr; | |
479 | + int result = -1; | |
480 | + struct disk_info disk_info; | |
481 | + if (trackp){ | |
482 | + track = trackp->trackno; | |
483 | + } | |
484 | + | |
485 | + if (trackp != 0 && track > 0 && is_packet(trackp)) { | |
486 | + scgp->silent++; | |
487 | + result = read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)); | |
488 | + scgp->silent--; | |
489 | + if (scsi_in_progress(scgp)){ | |
490 | + return -1; | |
491 | + } | |
492 | + | |
493 | + } | |
494 | + | |
495 | + if (result < 0) { | |
496 | + /* Get the last rzone*/ | |
497 | + if(read_disk_info(scgp,(caddr_t)&disk_info,8)<0) | |
498 | + return (-1); | |
499 | + | |
500 | + if (read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)) < 0) | |
501 | + return (-1); | |
502 | + } | |
503 | + if (scgp->verbose) | |
504 | + scg_prbytes("track info:", (Uchar *)&track_info, | |
505 | + sizeof(track_info)-scg_getresid(scgp)); | |
506 | + next_addr = a_to_4_byte(track_info.next_writable_addr); | |
507 | + if (ap) | |
508 | + *ap = next_addr; | |
509 | + return (0); | |
510 | +} | |
511 | + | |
512 | +LOCAL int | |
513 | open_track_mmc(scgp, dp, trackp) | |
514 | SCSI *scgp; | |
515 | cdr_t *dp; | |
516 | @@ -1978,6 +2323,45 @@ | |
517 | } | |
518 | ||
519 | LOCAL int | |
520 | +open_track_mdvd(scgp, dp, trackp) | |
521 | + SCSI *scgp; | |
522 | + cdr_t *dp; | |
523 | + track_t *trackp; | |
524 | +{ | |
525 | + Uchar mode[0x100]; | |
526 | + int len; | |
527 | + struct cd_mode_page_05 *mp; | |
528 | + | |
529 | + if (is_packet(trackp)) { | |
530 | + fillbytes((caddr_t)mode, sizeof(mode), '\0'); | |
531 | + | |
532 | + if (!get_mode_params(scgp, 0x05, "DVD write parameter", | |
533 | + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) | |
534 | + return (-1); | |
535 | + if (len == 0) | |
536 | + return (-1); | |
537 | + | |
538 | + mp = (struct cd_mode_page_05 *) | |
539 | + (mode + sizeof(struct scsi_mode_header) + | |
540 | + ((struct scsi_mode_header *)mode)->blockdesc_len); | |
541 | + | |
542 | + mp->write_type = WT_PACKET; | |
543 | + mp->LS_V = 1; | |
544 | + /*For now we set the link size to 0x10(32k) because Pioneer-A03 only support this */ | |
545 | + mp->link_size=0x10; | |
546 | + mp->fp = 1; | |
547 | + i_to_4_byte(mp->packet_size, trackp->pktsize); | |
548 | + } else { | |
549 | + return 0; | |
550 | + } | |
551 | + | |
552 | + if (!set_mode_params(scgp, "CD write parameter", mode, len, 0, trackp->secsize)) | |
553 | + return (-1); | |
554 | + | |
555 | + return (0); | |
556 | +} | |
557 | + | |
558 | +LOCAL int | |
559 | close_track_mmc(scgp, dp, trackp) | |
560 | SCSI *scgp; | |
561 | cdr_t *dp; | |
562 | @@ -2003,6 +2387,30 @@ | |
563 | return (0); | |
564 | } | |
565 | ||
566 | +LOCAL int | |
567 | +close_track_mdvd(scgp, dp, trackp) | |
568 | + SCSI *scgp; | |
569 | + cdr_t *dp; | |
570 | + track_t *trackp; | |
571 | +{ | |
572 | + int ret; | |
573 | + if (!is_packet(trackp)) | |
574 | + return (0); | |
575 | + | |
576 | + if (scsi_flush_cache(scgp, (dp->cdr_cmdflags&F_IMMED) != 0) < 0) { | |
577 | + printf("Trouble flushing the cache\n"); | |
578 | + return -1; | |
579 | + } | |
580 | + wait_unit_ready(scgp, 300); /* XXX Wait for ATAPI */ | |
581 | + if (is_packet(trackp) && !is_noclose(trackp)) { | |
582 | + /* close the incomplete track */ | |
583 | + ret = scsi_close_tr_session(scgp, 1, 0xFF, (dp->cdr_cmdflags&F_IMMED) != 0); | |
584 | + wait_unit_ready(scgp, 300); /* XXX Wait for ATAPI */ | |
585 | + return (ret); | |
586 | + } | |
587 | + return (0); | |
588 | +} | |
589 | + | |
590 | int toc2sess[] = { | |
591 | SES_DA_ROM, /* CD-DA */ | |
592 | SES_DA_ROM, /* CD-ROM */ | |
593 | @@ -2086,6 +2494,82 @@ | |
594 | } | |
595 | ||
596 | LOCAL int | |
597 | +open_session_mdvd(scgp, dp, trackp) | |
598 | + SCSI *scgp; | |
599 | + cdr_t *dp; | |
600 | + track_t *trackp; | |
601 | +{ | |
602 | + Uchar mode[0x100]; | |
603 | + int tracks = trackp->tracks; | |
604 | + | |
605 | + int len; | |
606 | + struct cd_mode_page_05 *mp; | |
607 | + Ulong totalsize; | |
608 | + int i; | |
609 | + struct track_info track_info; | |
610 | + int profile; | |
611 | + | |
612 | + fillbytes((caddr_t)mode, sizeof(mode), '\0'); | |
613 | + | |
614 | + if (!get_mode_params(scgp, 0x05, "DVD write parameter", | |
615 | + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) | |
616 | + return (-1); | |
617 | + if (len == 0) | |
618 | + return (-1); | |
619 | + | |
620 | + mp = (struct cd_mode_page_05 *) | |
621 | + (mode + sizeof(struct scsi_mode_header) + | |
622 | + ((struct scsi_mode_header *)mode)->blockdesc_len); | |
623 | + if(is_packet(trackp)){ | |
624 | + mp->write_type=WT_PACKET; | |
625 | + mp->multi_session = (track_base(trackp)->tracktype & TOCF_MULTI) ? MS_MULTI : MS_NONE; | |
626 | + mp->fp=0; | |
627 | + mp->BUFE=1; | |
628 | + mp->track_mode=1; | |
629 | + }else{ | |
630 | + mp->write_type = WT_SAO; | |
631 | + } | |
632 | + | |
633 | + | |
634 | + if (lverbose && dp->cdr_cdcap->BUF != 0) | |
635 | + printf("BURN-Free is %s.\n", mp->BUFE?"ON":"OFF"); | |
636 | + if (driveropts != NULL) { | |
637 | + if ((strcmp(driveropts, "burnproof") == 0 || | |
638 | + strcmp(driveropts, "burnfree") == 0) && dp->cdr_cdcap->BUF != 0) { | |
639 | + errmsgno(EX_BAD, "Turning BURN-Free on\n"); | |
640 | + mp->BUFE = 1; | |
641 | + } else if ((strcmp(driveropts, "noburnproof") == 0 || | |
642 | + strcmp(driveropts, "noburnfree") == 0)) { | |
643 | + errmsgno(EX_BAD, "Turning BURN-Free off\n"); | |
644 | + mp->BUFE = 0; | |
645 | + } else if (strcmp(driveropts, "help") == 0) { | |
646 | + mmc_opthelp(dp, 0); | |
647 | + } else { | |
648 | + errmsgno(EX_BAD, "Bad driver opts '%s'.\n", driveropts); | |
649 | + mmc_opthelp(dp, EX_BAD); | |
650 | + } | |
651 | + } | |
652 | + | |
653 | + | |
654 | + if (!set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1)) | |
655 | + return (-1); | |
656 | + | |
657 | + | |
658 | + totalsize=0; | |
659 | + for(i=1;i<=tracks;i++) { | |
660 | + totalsize+=trackp[i].tracksecs; | |
661 | + } | |
662 | + | |
663 | + profile = get_curprofile(scgp); | |
664 | + if(!is_packet(trackp) && profile != 0x1A){ | |
665 | + /* in DAO mode we need to reserve space for the track*/ | |
666 | + if(reserve_track(scgp, totalsize)<0) | |
667 | + return (-1); | |
668 | + } | |
669 | + return (0); | |
670 | +} | |
671 | + | |
672 | +LOCAL int | |
673 | waitfix_mmc(scgp, secs) | |
674 | SCSI *scgp; | |
675 | int secs; | |
676 | @@ -2215,6 +2699,25 @@ | |
677 | return (ret); | |
678 | } | |
679 | ||
680 | +LOCAL int | |
681 | +fixate_mdvd(scgp, dp, trackp) | |
682 | + SCSI *scgp; | |
683 | + cdr_t *dp; | |
684 | + track_t *trackp; | |
685 | +{ | |
686 | + /*set a really BIG timeout and call fixate_mmc | |
687 | + The BIG timeout is needed in case there was a very short rzone to write at the | |
688 | + beginning of the disk, because lead-out needs to be at some distance. | |
689 | + */ | |
690 | + scg_settimeout(scgp, 1000); | |
691 | + if(is_packet(trackp)){ | |
692 | + scsi_close_tr_session(scgp, 2, 0, FALSE); | |
693 | + } | |
694 | + fixate_mmc(scgp, dp, trackp); | |
695 | + scg_settimeout(scgp, 200); | |
696 | + | |
697 | +} | |
698 | + | |
699 | char *blank_types[] = { | |
700 | "entire disk", | |
701 | "PMA, TOC, pregap", | |
702 | @@ -2226,6 +2729,12 @@ | |
703 | "reserved blanking type", | |
704 | }; | |
705 | ||
706 | +char *format_types[] = { | |
707 | + "full format", | |
708 | + "background format", | |
709 | + "forced format", | |
710 | +}; | |
711 | + | |
712 | LOCAL int | |
713 | blank_mmc(scgp, dp, addr, blanktype) | |
714 | SCSI *scgp; | |
715 | @@ -2238,11 +2747,17 @@ | |
716 | BOOL cdrrw = FALSE; /* Read CD-RW */ | |
717 | BOOL cdwrw = FALSE; /* Write CD-RW */ | |
718 | int ret; | |
719 | + int profile; | |
720 | ||
721 | mmc_check(scgp, &cdrr, &cdwr, &cdrrw, &cdwrw, NULL, NULL); | |
722 | if (!cdwrw) | |
723 | return (blank_dummy(scgp, dp, addr, blanktype)); | |
724 | ||
725 | + profile = get_curprofile(scgp); | |
726 | + if (profile == 0x1A) { | |
727 | + printf("Error: this media does not support blanking, ignoring.\n"); | |
728 | + return (blank_dummy(scgp, dp, addr, blanktype)); | |
729 | + } | |
730 | if (lverbose) { | |
731 | printf("Blanking %s\n", blank_types[blanktype & 0x07]); | |
732 | flush(); | |
733 | @@ -2258,6 +2773,80 @@ | |
734 | } | |
735 | ||
736 | LOCAL int | |
737 | +format_mdvd(scgp, dp, formattype) | |
738 | + SCSI *scgp; | |
739 | + cdr_t *dp; | |
740 | + int formattype; | |
741 | +{ | |
742 | +extern char *buf; | |
743 | + BOOL dvdwr = FALSE; /* Write DVD */ | |
744 | + int ret; | |
745 | + int profile; | |
746 | + char addr[12]; | |
747 | + struct disk_info *dip; | |
748 | + | |
749 | + printf("format_mdvd\n"); | |
750 | + mmc_check(scgp, NULL, NULL, NULL, NULL, NULL, &dvdwr); | |
751 | + if (!dvdwr) | |
752 | + return (format_dummy(scgp, dp, formattype)); | |
753 | + | |
754 | + printf("format_mdvd: drive is a dvd burner.\n"); | |
755 | + profile = get_curprofile(scgp); | |
756 | + if (profile != 0x1A) { | |
757 | + printf("Error: only support DVD+RW formating, ignoring.\n"); | |
758 | + return (format_dummy(scgp, dp, formattype)); | |
759 | + } | |
760 | + printf("format_mdvd: media is a DVD+RW.\n"); | |
761 | + dip = (struct disk_info *)buf; | |
762 | + if (get_diskinfo(scgp, dip) < 0) | |
763 | + return ret; | |
764 | + | |
765 | + if (dip->disk_status & 3 && formattype != FORCE_FORMAT) { | |
766 | + printf("Error: disk already formated, ignoring.\n"); | |
767 | + return ret; | |
768 | + } | |
769 | + addr[0] = 0; // "Reserved" | |
770 | + addr[1] = 2; // "IMMED" flag | |
771 | + addr[2] = 0; // "Descriptor Length" (MSB) | |
772 | + addr[3] = 8; // "Descriptor Length" (LSB) | |
773 | + addr[4+0] = 0xff; | |
774 | + addr[4+1] = 0xff; | |
775 | + addr[4+2] = 0xff; | |
776 | + addr[4+3] = 0xff; | |
777 | + addr[4+4] = 0x26<<2; | |
778 | + addr[4+5] = 0; | |
779 | + addr[4+6] = 0; | |
780 | + addr[4+7] = 0; | |
781 | + if (formattype == FORCE_FORMAT) { | |
782 | + printf("format_mdvd: forcing reformat.\n"); | |
783 | + formattype = FULL_FORMAT; | |
784 | + addr[4+0] = 0; | |
785 | + addr[4+1] = 0; | |
786 | + addr[4+2] = 0; | |
787 | + addr[4+3] = 0; | |
788 | + addr[4+7] = 1; | |
789 | + } else { | |
790 | + printf("format_mdvd: media is unformated.\n"); | |
791 | + } | |
792 | + | |
793 | + if (lverbose) { | |
794 | + printf("Formating %s\n", format_types[formattype & 0x07]); | |
795 | + flush(); | |
796 | + } | |
797 | + if (formattype == FULL_FORMAT) { | |
798 | + ret = scsi_format(scgp, &addr, sizeof(addr), FALSE); | |
799 | + } else { | |
800 | + ret = scsi_format(scgp, &addr, sizeof(addr), TRUE); | |
801 | + } | |
802 | + if (ret < 0) | |
803 | + return (ret); | |
804 | + | |
805 | + wait_unit_ready(scgp, 90*60/curspeed); /* XXX Wait for ATAPI */ | |
806 | + waitfix_mmc(scgp, 90*60/curspeed); /* XXX Wait for ATAPI */ | |
807 | + return (ret); | |
808 | +} | |
809 | + | |
810 | +LOCAL int | |
811 | send_opc_mmc(scgp, bp, cnt, doopc) | |
812 | SCSI *scgp; | |
813 | caddr_t bp; | |
814 | @@ -2453,6 +3042,42 @@ | |
815 | } | |
816 | ||
817 | LOCAL int | |
818 | +opt1_mdvd(scgp, dp) | |
819 | + SCSI *scgp; | |
820 | + cdr_t *dp; | |
821 | +{ | |
822 | + int oflags = dp->cdr_dstat->ds_cdrflags; | |
823 | + | |
824 | + if ((dp->cdr_dstat->ds_cdrflags & RF_AUDIOMASTER) != 0) { | |
825 | + printf("Turning Audio Master Q. R. on\n"); | |
826 | + if (set_audiomaster_yamaha(scgp, dp, TRUE) < 0) | |
827 | + return (-1); | |
828 | + if (!debug && lverbose <= 1) | |
829 | + dp->cdr_dstat->ds_cdrflags &= ~RF_PRATIP; | |
830 | + if (getdisktype_mdvd(scgp, dp) < 0) { | |
831 | + dp->cdr_dstat->ds_cdrflags = oflags; | |
832 | + return (-1); | |
833 | + } | |
834 | + dp->cdr_dstat->ds_cdrflags = oflags; | |
835 | + if (oflags & RF_PRATIP) { | |
836 | + msf_t msf; | |
837 | + lba_to_msf(dp->cdr_dstat->ds_first_leadin, &msf); | |
838 | + printf("New start of lead in: %ld (%02d:%02d/%02d)\n", | |
839 | + (long)dp->cdr_dstat->ds_first_leadin, | |
840 | + msf.msf_min, | |
841 | + msf.msf_sec, | |
842 | + msf.msf_frame); | |
843 | + lba_to_msf(dp->cdr_dstat->ds_maxblocks, &msf); | |
844 | + printf("New start of lead out: %ld (%02d:%02d/%02d)\n", | |
845 | + (long)dp->cdr_dstat->ds_maxblocks, | |
846 | + msf.msf_min, | |
847 | + msf.msf_sec, | |
848 | + msf.msf_frame); | |
849 | + } | |
850 | + } | |
851 | + return (0); | |
852 | +} | |
853 | +LOCAL int | |
854 | scsi_sony_write(scgp, bp, sectaddr, size, blocks, islast) | |
855 | SCSI *scgp; | |
856 | caddr_t bp; /* address of buffer */ | |
857 | --- cdrtools-2.01/cdrecord/cdr_drv.c.dvd 2004-03-02 02:06:26.000000000 +0100 | |
858 | +++ cdrtools-2.01/cdrecord/cdr_drv.c 2004-10-18 14:37:32.427251472 +0200 | |
859 | @@ -42,6 +42,7 @@ | |
860 | extern cdr_t cdr_oldcd; | |
861 | extern cdr_t cdr_cd; | |
862 | extern cdr_t cdr_mmc; | |
863 | +extern cdr_t cdr_mdvd; | |
864 | extern cdr_t cdr_mmc_sony; | |
865 | extern cdr_t cdr_cd_dvd; | |
866 | extern cdr_t cdr_philips_cdd521O; | |
867 | @@ -80,6 +81,7 @@ | |
868 | cdr_t *drivers[] = { | |
869 | &cdr_cd_dvd, | |
870 | &cdr_mmc, | |
871 | + &cdr_mdvd, | |
872 | &cdr_mmc_sony, | |
873 | &cdr_cd, | |
874 | &cdr_oldcd, | |
875 | --- cdrtools-2.01/cdrecord/cdrecord.h.dvd 2004-05-25 00:36:01.000000000 +0200 | |
876 | +++ cdrtools-2.01/cdrecord/cdrecord.h 2004-10-18 14:37:32.428251328 +0200 | |
877 | @@ -460,6 +460,13 @@ | |
878 | #define BLANK_SESSION 0x06 /* Erase the last session */ | |
879 | ||
880 | /* | |
881 | + * Defines for formating DVD (custom values) | |
882 | + */ | |
883 | +#define FULL_FORMAT 0x00 /* Interactive format */ | |
884 | +#define BACKGROUND_FORMAT 0x01 /* Background format */ | |
885 | +#define FORCE_FORMAT 0x02 /* Force reformat */ | |
886 | + | |
887 | +/* | |
888 | * Useful definitions for audio tracks | |
889 | */ | |
890 | #define msample (44100 * 2) /* one 16bit audio sample */ | |
891 | @@ -570,6 +577,12 @@ | |
892 | #define DSF_NEED_FORMAT 0x0800 /* Disk needs to be formatted */ | |
893 | ||
894 | /* | |
895 | + * Definitions for disktype flags | |
896 | + */ | |
897 | +#define DT_CD 0x001 /*is a CD */ | |
898 | +#define DT_DVD 0x002 /*is a DVD */ | |
899 | + | |
900 | +/* | |
901 | * Definitions for disk_status disk type | |
902 | * used in "ds_type". | |
903 | */ | |
904 | @@ -709,6 +722,8 @@ | |
905 | int (*cdr_opc) __PR((SCSI *scgp, caddr_t bp, int cnt, int doopc)); /* Do OPC */ | |
906 | int (*cdr_opt1) __PR((SCSI *scgp, cdr_t *)); /* do early option processing*/ | |
907 | int (*cdr_opt2) __PR((SCSI *scgp, cdr_t *)); /* do late option processing */ | |
908 | + int profile; | |
909 | + BOOL is_dvd; | |
910 | }; | |
911 | #endif | |
912 | ||
913 | --- cdrtools-2.01/cdrecord/cdrecord.c.dvd 2004-09-08 19:26:35.000000000 +0200 | |
914 | +++ cdrtools-2.01/cdrecord/cdrecord.c 2004-10-18 14:37:32.436250174 +0200 | |
915 | @@ -180,6 +180,7 @@ | |
916 | LOCAL void susage __PR((int)); | |
917 | LOCAL void usage __PR((int)); | |
918 | LOCAL void blusage __PR((int)); | |
919 | +LOCAL void formattypeusage __PR((int)); | |
920 | LOCAL void intr __PR((int sig)); | |
921 | LOCAL void catchsig __PR((int sig)); | |
922 | LOCAL int scsi_cb __PR((void *arg)); | |
923 | @@ -216,9 +217,9 @@ | |
924 | LOCAL BOOL checkdsize __PR((SCSI *scgp, cdr_t *dp, | |
925 | long tsize, int flags)); | |
926 | LOCAL void raise_fdlim __PR((void)); | |
927 | -LOCAL void gargs __PR((int, char **, int *, track_t *, char **, | |
928 | +LOCAL int gargs __PR((int, char **, int *, track_t *, char **, | |
929 | int *, cdr_t **, | |
930 | - int *, long *, int *)); | |
931 | + int *, long *, int *, int *)); | |
932 | LOCAL void set_trsizes __PR((cdr_t *, int, track_t *)); | |
933 | EXPORT void load_media __PR((SCSI *scgp, cdr_t *, BOOL)); | |
934 | EXPORT void unload_media __PR((SCSI *scgp, cdr_t *, int)); | |
935 | @@ -238,6 +239,7 @@ | |
936 | LOCAL void wait_input __PR((void)); | |
937 | LOCAL void checkgui __PR((void)); | |
938 | LOCAL int getbltype __PR((char *optstr, long *typep)); | |
939 | +LOCAL int getformattype __PR((char *optstr, long *typep)); | |
940 | LOCAL void print_drflags __PR((cdr_t *dp)); | |
941 | LOCAL void print_wrmodes __PR((cdr_t *dp)); | |
942 | LOCAL BOOL check_wrmode __PR((cdr_t *dp, int wmode, int tflags)); | |
943 | @@ -262,6 +264,7 @@ | |
944 | int speed = -1; | |
945 | long flags = 0L; | |
946 | int blanktype = 0; | |
947 | + int formattype = 0; | |
948 | int i; | |
949 | int tracks = 0; | |
950 | int trackno; | |
951 | @@ -273,6 +276,9 @@ | |
952 | SCSI *scgp = NULL; | |
953 | char errstr[80]; | |
954 | BOOL gracedone = FALSE; | |
955 | + int ispacket; | |
956 | + BOOL is_cdwr = FALSE; | |
957 | + BOOL is_dvdwr = FALSE; | |
958 | ||
959 | #ifdef __EMX__ | |
960 | /* This gives wildcard expansion with Non-Posix shells with EMX */ | |
961 | @@ -287,8 +293,8 @@ | |
962 | track[i].track = track[i].trackno = i; | |
963 | track[0].tracktype = TOC_MASK; | |
964 | raise_fdlim(); | |
965 | - gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags, | |
966 | - &blanktype); | |
967 | + ispacket = gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags, | |
968 | + &blanktype, &formattype); | |
969 | if ((track[0].tracktype & TOC_MASK) == TOC_MASK) | |
970 | comerrno(EX_BAD, "Internal error: Bad TOC type.\n"); | |
971 | ||
972 | @@ -349,11 +355,15 @@ | |
973 | # define CLONE_TITLE "" | |
974 | #endif | |
975 | if ((flags & F_MSINFO) == 0 || lverbose || flags & F_VERSION) { | |
0d6b8e98 AM |
976 |