Develop and Download Open Source Software

Browse CVS Repository

Contents of /enbanfukusyaya/EnbanFukusyaYa/DriveAccess/cmd.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.24 - (show annotations) (download) (as text)
Mon Nov 1 14:34:11 2010 UTC (13 years, 5 months ago) by bananajinn
Branch: MAIN
CVS Tags: HEAD
Changes since 1.23: +16 -16 lines
File MIME type: text/x-csrc
*** empty log message ***

1 /**
2 * @file cmd.c
3 * @brief コマンド発行関連
4 * @author BananaJinn
5 * @version $Id: cmd.c,v 1.23 2010/09/05 16:15:22 bananajinn Exp $
6 * 円盤複写屋
7 * Copyright (C) 2004-2006 BananaJinn<banana@mxh.mesh.ne.jp>.
8 */
9
10 #include <stdio.h>
11 #include <string.h>
12 #if !defined(WIN32)
13 # include <unistd.h>
14 #endif
15 #include "struct.h"
16 #include "cmd.h"
17 #include "cmdlog.h"
18 #include "ui.h"
19 #include "text.h"
20 #include "ebstring.h"
21
22 WORD Get2bytes(BYTE *buf)
23 {
24 return (WORD)buf[0]<<8 | buf[1];
25 }
26
27 DWORD Get3bytes(BYTE *buf)
28 {
29 return (DWORD)buf[0]<<16 | (DWORD)buf[1]<<8 | buf[2];
30 }
31
32 DWORD Get4bytes(BYTE *buf)
33 {
34 return (DWORD)buf[0]<<24 | (DWORD)buf[1]<<16 | (DWORD)buf[2]<<8 | buf[3];
35 }
36
37 void Set2bytes(BYTE *buf, WORD value)
38 {
39 buf[0] = (BYTE)(value>>8);
40 buf[1] = (BYTE)value;
41 }
42
43 void Set3bytes(BYTE *buf, DWORD value)
44 {
45 buf[0] = (BYTE)(value>>16);
46 buf[1] = (BYTE)(value>>8);
47 buf[2] = (BYTE)value;
48 }
49
50 void Set4bytes(BYTE *buf, DWORD value)
51 {
52 buf[0] = (BYTE)(value>>24);
53 buf[1] = (BYTE)(value>>16);
54 buf[2] = (BYTE)(value>>8);
55 buf[3] = (BYTE)value;
56 }
57
58 WORD Get2bytesLE(BYTE *buf)
59 {
60 return (WORD)buf[1]<<8 | buf[0];
61 }
62
63 DWORD Get3bytesLE(BYTE *buf)
64 {
65 return (DWORD)buf[2]<<16 | (DWORD)buf[1]<<8 | buf[0];
66 }
67
68 DWORD Get4bytesLE(BYTE *buf)
69 {
70 return (DWORD)buf[3]<<24 | (DWORD)buf[2]<<16 | (DWORD)buf[1]<<8 | buf[0];
71 }
72
73 void Set2bytesLE(BYTE *buf, WORD value)
74 {
75 buf[1] = (BYTE)(value>>8);
76 buf[0] = (BYTE)value;
77 }
78
79 void Set3bytesLE(BYTE *buf, DWORD value)
80 {
81 buf[2] = (BYTE)(value>>16);
82 buf[1] = (BYTE)(value>>8);
83 buf[0] = (BYTE)value;
84 }
85
86 void Set4bytesLE(BYTE *buf, DWORD value)
87 {
88 buf[3] = (BYTE)(value>>24);
89 buf[2] = (BYTE)(value>>16);
90 buf[1] = (BYTE)(value>>8);
91 buf[0] = (BYTE)value;
92 }
93
94
95 DWORD MSF2LBA(BYTE min, BYTE sec, BYTE frame, BOOL force_positive)
96 {
97 DWORD ret = min*60 + sec;
98 ret *= 75;
99 ret += frame;
100 if(min < 90 || force_positive)
101 ret -= 150;
102 else
103 ret -= 450150;
104 return ret;
105 }
106
107 BOOL LBA2MSF(DWORD lba, BYTE *min, BYTE *sec, BYTE *frame)
108 {
109 BYTE m, s, f;
110
111 if(lba >= (DWORD)-150 || lba < 405000){
112 m = (BYTE)((lba+150)/60/75);
113 s = (BYTE)((lba+150 - m*60*75)/75);
114 f = (BYTE)(lba+150 - m*60*75 - s*75);
115 }
116 else if(lba>=(DWORD)-45150 && lba<=(DWORD)-151){
117 m = (BYTE)((lba+450150)/60/75);
118 s = (BYTE)((lba+450150 - m*60*75)/75);
119 f = (BYTE)(lba+450150 - m*60*75 - s*75);
120 }
121 else{
122 *min = 0xff;
123 *sec = 0xff;
124 *frame = 0xff;
125 return FALSE;
126 }
127
128 *min = m;
129 *sec = s;
130 *frame = f;
131
132 if(lba>404849)
133 return FALSE;
134 return TRUE;
135 }
136
137
138
139 int SendTestUnitReady(CMDDRIVE *drive)
140 {
141 BYTE cdb[12];
142
143 memset(cdb, 0, sizeof(cdb));
144 return SendCmd(drive, cdb, 0, REQ_NODATA);
145 }
146
147 int SendStartStop(CMDDRIVE *drive, BYTE immed, BYTE load_eject, BYTE start_or_load)
148 {
149 BYTE cdb[12];
150
151 memset(cdb, 0, sizeof(cdb));
152 cdb[0] = CMD_START_STOP;
153 cdb[1] = (BYTE)(immed ? 1:0);
154 cdb[4] = (BYTE)((load_eject ? 2:0)|(start_or_load ? 1:0));
155 return SendCmd(drive, cdb, 0, REQ_NODATA);
156 }
157
158 int SendPreventAllow(CMDDRIVE *drive, BYTE prevent)
159 {
160 BYTE cdb[12];
161
162 memset(cdb, 0, sizeof(cdb));
163 cdb[0] = CMD_PREVENT_ALLOW;
164 cdb[4] = (BYTE)(prevent ? 1:0);
165 return SendCmd(drive, cdb, 0, REQ_NODATA);
166 }
167
168 int SendModeSense(CMDDRIVE *drive, BYTE page_control, BYTE page_code)
169 {
170 BYTE cdb[12];
171 WORD len;
172 int ret;
173
174 len = drive->cmd_type==CMDDRVCTYPE_ATAPI ? 8:16;
175
176 memset(cdb, 0, sizeof(cdb));
177 cdb[0] = CMD_MODE_SENSE10;
178 cdb[2] = (BYTE)(page_control<<6 | page_code);
179 Set2bytes(cdb+7, len);
180 ret = SendCmd(drive, cdb, len, REQ_DATAIN);
181 if(ret!=RET_OK){
182 return ret;
183 }
184 len = Get2bytes(drive->data_buf) + 2;
185 Set2bytes(cdb+7, len);
186 return SendCmd(drive, cdb, len, REQ_DATAIN);
187 }
188
189 int SendModeSelect(CMDDRIVE *drive, BYTE pf)
190 {
191 BYTE cdb[12];
192 WORD len;
193 struct _MODEPAGE_HEADER *mph;
194
195 mph = (struct _MODEPAGE_HEADER *)
196 (drive->data_buf+(drive->cmd_type==CMDDRVCTYPE_ATAPI ? 8:16));
197 len = mph->p_len + (drive->cmd_type==CMDDRVCTYPE_ATAPI ? 8:16) + 2;
198 memset(drive->data_buf, 0, drive->cmd_type==CMDDRVCTYPE_ATAPI ? 8:16);
199
200 memset(cdb, 0, sizeof(cdb));
201 cdb[0] = CMD_MODE_SELECT10;
202 cdb[1] = (BYTE)(pf ? 0x10:0);
203 Set2bytes(cdb+7, len);
204 return SendCmd(drive, cdb, len, REQ_DATAOUT);
205 }
206
207 int SendReadToc(CMDDRIVE *drive, WORD track_sess_num, BYTE msf, BYTE format)
208 {
209 BYTE cdb[12];
210 WORD len = 4;
211 int ret;
212
213 memset(cdb, 0, sizeof(cdb));
214 cdb[0] = CMD_READ_TOC;
215 cdb[1] = (BYTE)(msf ? 2:0);
216 cdb[2] = (BYTE)(format & 0x0f);
217 cdb[6] = (BYTE)(track_sess_num);
218 Set2bytes(cdb+7, len);
219 ret = SendCmd(drive, cdb, len, REQ_DATAIN);
220 if(ret!=RET_OK){
221 return ret;
222 }
223 len = Get2bytes(drive->data_buf);
224 len += 2;
225 Set2bytes(cdb+7, len);
226 return SendCmd(drive, cdb, len, REQ_DATAIN);
227 }
228
229
230 int SendReadDiscInfo(CMDDRIVE *drive)
231 {
232 BYTE cdb[12];
233 WORD len;
234 int ret;
235
236 memset(cdb, 0, sizeof(cdb));
237 cdb[0] = CMD_READ_DISC_INFO;
238 Set2bytes(cdb+7, 2);
239 ret = SendCmd(drive, cdb, 2, REQ_DATAIN);
240 if(ret!=RET_OK){
241 return ret;
242 }
243 len = Get2bytes(drive->data_buf) + 2;
244 Set2bytes(cdb+7, len);
245 memset(drive->data_buf, 0, sizeof(struct _DISCINFO));
246 return SendCmd(drive, cdb, len, REQ_DATAIN);
247 }
248
249
250 int SendReadTrackInfo(CMDDRIVE *drive, WORD track_num)
251 {
252 BYTE cdb[12];
253 WORD len = sizeof(struct _TRACKINFO);
254
255 memset(cdb, 0, sizeof(cdb));
256 cdb[0] = CMD_READ_TRACK_INFO;
257 cdb[1] = 0x01;
258 Set2bytes(cdb+4, track_num);
259 Set2bytes(cdb+7, len);
260 return SendCmd(drive, cdb, len, REQ_DATAIN);
261 }
262
263
264 int SendCloseTrackSession(CMDDRIVE *drive, BYTE immed, BYTE type, WORD track_num)
265 {
266 BYTE cdb[12];
267
268 memset(cdb, 0, sizeof(cdb));
269 cdb[0] = CMD_CLOSE_TRACK_SESSION;
270 cdb[1] = (BYTE)(immed ? 1:0);
271 cdb[2] = (BYTE)(type & 7);
272 Set2bytes(cdb+4, track_num);
273 return SendCmd(drive, cdb, 0, REQ_NODATA);
274 }
275
276 int SendReadSubchannel(CMDDRIVE *drive, BYTE track_num, BYTE msf, BYTE subq, BYTE format)
277 {
278 BYTE cdb[12];
279 WORD len=4;
280 int ret;
281
282 memset(cdb, 0, sizeof(cdb));
283 cdb[0] = CMD_READ_SUBCHANNEL;
284 cdb[1] = (BYTE)(msf ? 2:0);
285 cdb[2] = (BYTE)(subq ? 0x40:0);
286 cdb[3] = format;
287 cdb[6] = track_num;
288 Set2bytes(cdb+7, len);
289 ret = SendCmd(drive, cdb, len, REQ_DATAIN);
290 if(ret!=RET_OK)
291 return ret;
292 len = Get2bytes(drive->data_buf+2) + 4;
293 Set2bytes(cdb+7, len);
294 return SendCmd(drive, cdb, len, REQ_DATAIN);
295 }
296
297 int SendReadCD(CMDDRIVE *drive, DWORD addr, DWORD len)
298 {
299 BYTE cdb[12];
300
301 memset(cdb, 0, sizeof(cdb));
302 cdb[0] = CMD_READ_CD;
303 Set4bytes(cdb+2, addr);
304 Set3bytes(cdb+6, len);
305 cdb[9] = 0xf8;
306 return SendCmd(drive, cdb, len*2352, REQ_DATAIN);
307 }
308
309 int SendReadFormatCapacities(CMDDRIVE *drive)
310 {
311 BYTE cdb[12];
312 WORD len=4;
313 int ret;
314
315 memset(cdb, 0, sizeof(cdb));
316 cdb[0] = CMD_READ_FORMAT_CAPACITIES;
317 Set2bytes(cdb+7, len);
318 ret = SendCmd(drive, cdb, len, REQ_DATAIN);
319 if(ret!=RET_OK)
320 return ret;
321 len = drive->data_buf[3] + sizeof(struct _FORMATCAPA_HEADER) +
322 sizeof(struct _FORMATCURMAXDESC);
323 Set2bytes(cdb+7, len);
324 return SendCmd(drive, cdb, len, REQ_DATAIN);
325 }
326
327
328
329 int SendFormatUnit(CMDDRIVE *drive, BYTE fmtdata, BYTE cmplist, BYTE format_code, WORD len)
330 {
331 BYTE cdb[12];
332
333 memset(cdb, 0, sizeof(cdb));
334 cdb[0] = CMD_FORMAT_UNIT;
335 cdb[1] = (BYTE)((fmtdata ? 0x10:0)|(cmplist ? 8:0)|(format_code & 7));
336 return SendCmd(drive, cdb, len, REQ_DATAOUT);
337 }
338
339 int SendSetCdSpeed(CMDDRIVE *drive, WORD read_speed, WORD write_speed, BYTE rotctl)
340 {
341 BYTE cdb[12];
342
343 memset(cdb, 0, sizeof(cdb));
344 cdb[0] = CMD_SET_CD_SPEED;
345 cdb[1] = (BYTE)(rotctl & 3);
346 Set2bytes(cdb+2, read_speed);
347 Set2bytes(cdb+4, write_speed);
348 return SendCmd(drive, cdb, 0, REQ_NODATA);
349 }
350
351 int SendSetStreaming(CMDDRIVE *drive)
352 {
353 BYTE cdb[12];
354 WORD len = sizeof(struct _PERFORMANCEDESC);
355
356 memset(cdb, 0, sizeof(cdb));
357 cdb[0] = CMD_SET_STREAMING;
358 Set2bytes(cdb+9, len);
359 return SendCmd(drive, cdb, len, REQ_DATAOUT);
360 }
361
362
363 int SendSynchronizeCache(CMDDRIVE *drive, BYTE immed)
364 {
365 BYTE cdb[12];
366
367 memset(cdb, 0, sizeof(cdb));
368 cdb[0] = CMD_SYNCHRONIZE_CACHE;
369 cdb[1] = (BYTE)(immed ? 2:0);
370 return SendCmd(drive, cdb, 0, REQ_NODATA);
371 }
372
373 int SendReserveTrack(CMDDRIVE *drive, DWORD size)
374 {
375 BYTE cdb[12];
376
377 memset(cdb, 0, sizeof(cdb));
378 cdb[0] = CMD_RESERVE_TRACK;
379 Set4bytes(cdb+5, size);
380 return SendCmd(drive, cdb, 0, REQ_NODATA);
381 }
382
383 int SendRead10(CMDDRIVE *drive, DWORD lba, WORD len, DWORD buflen)
384 {
385 BYTE cdb[12];
386
387 memset(cdb, 0, sizeof(cdb));
388 cdb[0] = CMD_READ10;
389 Set4bytes(cdb+2, lba);
390 Set2bytes(cdb+7, len);
391 return SendCmd(drive, cdb, buflen, REQ_DATAIN);
392 }
393
394 int SendWrite10(CMDDRIVE *drive, DWORD lba, WORD len, DWORD buflen,
395 BOOL retry)
396 {
397 BYTE cdb[12];
398 int ret;
399
400 memset(cdb, 0, sizeof(cdb));
401 cdb[0] = CMD_WRITE10;
402 Set4bytes(cdb+2, lba);
403 Set2bytes(cdb+7, len);
404 if(retry){
405 while(TRUE){
406 ret = SendCmd(drive, cdb, buflen, REQ_DATAOUT);
407 if(ret!=RET_CMDERR)
408 break;
409 if(!(SD_ASC(drive)==0x04 && SD_ASCQ(drive)==0x08))
410 break;
411 }
412 return ret;
413 }
414 else{
415 return SendCmd(drive, cdb, buflen, REQ_DATAOUT);
416 }
417 }
418
419 int SendSeek10(CMDDRIVE *drive, DWORD lba)
420 {
421 BYTE cdb[12];
422
423 memset(cdb, 0, sizeof(cdb));
424 cdb[0] = CMD_SEEK10;
425 Set4bytes(cdb+2, lba);
426 return SendCmd(drive, cdb, 0, REQ_NODATA);
427 }
428
429 int SendSendCueSheet(CMDDRIVE *drive, void *cuesheet, DWORD len)
430 {
431 BYTE cdb[12];
432
433 if(len >= (DWORD)drive->bufsize)
434 return RET_NG;
435
436 if(cuesheet!=NULL)
437 memcpy(drive->data_buf, cuesheet, len);
438
439 memset(cdb, 0, sizeof(cdb));
440 cdb[0] = CMD_SEND_CUE_SHEET;
441 Set3bytes(cdb+6, len);
442 return SendCmd(drive, cdb, len, REQ_DATAOUT);
443 }
444
445 int SendReadBufferCapacity(CMDDRIVE *drive, BYTE block)
446 {
447 BYTE cdb[12];
448
449 memset(cdb, 0, sizeof(cdb));
450 cdb[0] = CMD_READ_BUFFER_CAPACITY;
451 cdb[1] = (BYTE)(block ? 1:0);
452 Set2bytes(cdb+7, 12);
453 return SendCmd(drive, cdb, 12, REQ_DATAIN);
454 }
455
456
457 int SendLongRead12(CMDDRIVE *drive, DWORD lba, DWORD len, DWORD buflen,
458 DWORD total_blocks)
459 {
460 BYTE cdb[12];
461
462 memset(cdb, 0, sizeof(cdb));
463 cdb[0] = CMD_READ12;
464 Set4bytes(cdb+2, lba);
465 Set4bytes(cdb+6, len);
466 return SendCmdLongRead(drive, cdb, buflen, REQ_DATAIN, total_blocks);
467 }
468
469 int SendLongReadCD(CMDDRIVE *drive, DWORD addr, DWORD len,
470 DWORD total_blocks)
471 {
472 BYTE cdb[12];
473
474 memset(cdb, 0, sizeof(cdb));
475 cdb[0] = CMD_READ_CD;
476 Set4bytes(cdb+2, addr);
477 Set3bytes(cdb+6, len);
478 cdb[9] = 0xf8;
479 return SendCmdLongRead(drive, cdb, len*2352, REQ_DATAIN, total_blocks);
480 }
481
482
483
484 int OpenTray(CMDDRIVE *drive)
485 {
486 if(drive->type == CMDDRVTYPE_NET){
487 /* ネットワーク先装置のトレイ操作は行わない */
488 return RET_OK;
489 }
490
491 SendPreventAllow(drive, 0);
492 return SendStartStop(drive, 0, 1, 0);
493 }
494
495 int OpenTrayImmediate(CMDDRIVE *drive)
496 {
497 if(drive->type == CMDDRVTYPE_NET){
498 /* ネットワーク先装置のトレイ操作は行わない */
499 return RET_OK;
500 }
501
502 SendPreventAllow(drive, 0);
503 return SendStartStop(drive, 1, 1, 0);
504 }
505
506 int CloseTray(CMDDRIVE *drive)
507 {
508 if(drive->type == CMDDRVTYPE_NET){
509 /* ネットワーク先装置のトレイ操作は行わない */
510 return RET_OK;
511 }
512 return SendStartStop(drive, 0, 1, 1);
513 }
514
515
516 int GetDiscType(CMDDRIVE *drive, int *disc_type_ret, BOOL bWaitDisc)
517 {
518 BYTE cdb[12];
519 int ret;
520 struct _FEATURE_HEADER *fh;
521 struct _DISCINFO *di;
522 int disc_type;
523
524 *disc_type_ret = DT_UNKNOWN;
525
526 ret = CheckReady(drive, bWaitDisc);
527 if(ret!=RET_OK){
528 return ret;
529 }
530
531 memset(cdb, 0, sizeof(cdb));
532 cdb[0] = CMD_GET_CONFIGURATION;
533 cdb[8] = 8;
534 ret = SendCmd(drive, cdb, 8, REQ_DATAIN);
535 if(ret==RET_OK){
536 fh = (struct _FEATURE_HEADER *)drive->data_buf;
537 disc_type = Get2bytes(fh->cur_profile);
538 *disc_type_ret = disc_type;
539 return RET_OK;
540 }
541 if(SD_SENSEKEY(drive)==5 && SD_ASC(drive)==0x20){
542 /* GET CONFIG コマンド未サポート */
543 ret = SendReadDiscInfo(drive);
544 if(ret!=RET_OK){
545 return ret;
546 }
547 di = (struct _DISCINFO *)drive->data_buf;
548 *disc_type_ret = di->erasable ? DT_CDRW : DT_CDR;
549 return RET_OK;
550 }
551
552 return ret;
553 }
554
555 int CheckReady(CMDDRIVE *drive, BOOL bWaitDisc)
556 {
557 int ret;
558 BOOL bGood=FALSE;
559 BOOL bEjected=FALSE;
560
561 while(bGood==FALSE){
562 if(UICheckAbort()){
563 return RET_ABORT;
564 }
565 ret = SendTestUnitReady(drive);
566 if(ret==RET_OK){
567 bGood=TRUE;
568 }
569 else{
570 if(SD_SENSEKEY(drive)==0x02 &&
571 SD_ASC(drive)==0x04 &&
572 SD_ASCQ(drive)==0x01){
573 UIDispInfo(MSG_WAITING_READY /*"準備ができるのを待っています"*/);
574 /* becoming ready */
575 }
576 else if(SD_SENSEKEY(drive)==0x06 &&
577 SD_ASC(drive)==0x28 &&
578 SD_ASCQ(drive)==0x00){
579 /* medium change */
580 }
581 else if(SD_SENSEKEY(drive)==0x06 &&
582 SD_ASC(drive)==0x29 &&
583 SD_ASCQ(drive)==0x00){
584 /* power on, reset */
585 }
586 #if 0
587 else if(SD_SENSEKEY(drive)==0x02 &&
588 SD_ASC(drive)==0x3a &&
589 SD_ASCQ(drive)==0x00){
590 /* medium not present */
591 }
592 #endif
593 else{
594 if(bWaitDisc){
595 /* Ejectする */
596 if(bEjected==FALSE){
597 OpenTrayImmediate(drive);
598 bEjected=TRUE;
599 UIDispInfo(MSG_INSERT_DISC /*"ディスクを挿入してください"*/);
600 }
601 }
602 else{
603 return RET_NG;
604 }
605 }
606 #ifdef WIN32
607 Sleep(1000);
608 #else
609 sleep(1);
610 #endif
611 }
612 }
613
614 return RET_OK;
615 }
616
617 int BlankDisc(CMDDRIVE *drive, BYTE type)
618 {
619 BYTE cdb[12];
620 int ret;
621
622 memset(cdb, 0, sizeof(cdb));
623 cdb[0] = CMD_BLANK;
624 cdb[1] = (BYTE)(0x10|type);
625 ret = SendCmd(drive, cdb, 0, REQ_NODATA);
626 if(ret!=RET_OK){
627 return ret;
628 }
629
630 ret = WaitProgress(drive, MSG_QUICK_BLANK /*"高速消去"*/, FALSE);
631 return ret;
632 }
633
634
635 int WaitProgress(CMDDRIVE *drive, const char *message, BOOL meter1)
636 {
637 WORD indicator=0;
638 BOOL bGood=FALSE;
639 int ret;
640
641 if(message!=NULL){
642 if(meter1)
643 UIMeter1Initialize(message);
644 else
645 UIMeter2Initialize(message);
646 }
647
648 while(bGood==FALSE){
649 if(UICheckAbort()){
650 return RET_ABORT;
651 }
652 //ret = SendTestUnitReady(drive);
653 ret = SendReadDiscInfo(drive);
654 if(ret==RET_OK){
655 bGood=TRUE;
656 }
657 else{
658 if(SD_SENSEKEY(drive)!=0x02){
659 return RET_CMDERR;
660 }
661 /* 消去中 */
662 if(drive->sense_data[15] & 0x80){
663 indicator = Get2bytes(drive->sense_data+16);
664 if(message!=NULL){
665 if(meter1)
666 UIMeter1Update((float)(indicator*100+0x7fff)/0xffff);
667 else
668 UIMeter2Update((float)(indicator*100+0x7fff)/0xffff);
669 }
670 }
671 #if defined(WIN32)
672 Sleep(100);
673 #else
674 usleep(100*1000);
675 #endif
676 }
677 }
678 if(meter1)
679 UIMeter1Update(100.0);
680 else
681 UIMeter2Update(100.0);
682
683 return RET_OK;
684 }
685
686 void DispCommandError(CMDDRIVE *drive)
687 {
688 char *buf;
689
690 if(SD_SENSEKEY(drive)!=0){
691 buf = EbStringNewWithFormat(MSG_COMMAND_ERROR
692 /*"コマンド実行エラー(%02Xh : %X/%02X/%02X)"*/,
693 drive->cmdcode,
694 SD_SENSEKEY(drive),
695 SD_ASC(drive), SD_ASCQ(drive));
696 UIDispMessage(buf, UIDMT_ERROR);
697 EbStringFree(buf);
698 }
699 }
700
701 /*
702 * READ CD コマンドで SUB-Q データを取得
703 */
704 int GetSubQ(CMDDRIVE *drive, DWORD lba, DWORD len)
705 {
706 BYTE cdb[12];
707
708 memset(cdb, 0, sizeof(cdb));
709 cdb[0] = CMD_READ_CD;
710 Set4bytes(cdb+2, lba);
711 Set3bytes(cdb+6, len);
712 cdb[10] = 2;
713 return SendCmd(drive, cdb, len*16, REQ_DATAIN);
714 }
715
716 int SetSpeed(CMDDRIVE *drive, int read_speed, int write_speed)
717 {
718 int ret;
719 WORD read_kbps, write_kbps;
720 struct _PERFORMANCEDESC *pd;
721
722 if(!REALDRIVE(drive))
723 return RET_OK;
724
725 if(DT_CD_FAMILY(drive->disc_type)){
726 read_kbps = read_speed ? (WORD)(read_speed*176.4) : 0xffff;
727 write_kbps = write_speed ? (WORD)(write_speed*176.4) : 0xffff;
728 ret = SendSetCdSpeed(drive, read_kbps, write_kbps, 0);
729 if(ret!=RET_OK){
730 DispCommandError(drive);
731 return ret;
732 }
733 }
734 else{
735 pd = (struct _PERFORMANCEDESC *)drive->data_buf;
736 memset(pd, 0, sizeof(struct _PERFORMANCEDESC));
737 pd->rdd = (read_speed==0 && write_speed==0) ? 1:0;
738 Set4bytes(pd->read_size, (DWORD)(read_speed*1385));
739 Set4bytes(pd->read_time, 1000);
740 Set4bytes(pd->write_size, (DWORD)(write_speed*1385));
741 Set4bytes(pd->write_time, 1000);
742
743 ret = SendSetStreaming(drive);
744 #if 0 /* エラーになっても継続させる為、無効化 */
745 if(ret!=RET_OK){
746 DispCommandError(drive);
747 return ret;
748 }
749 #endif
750 }
751
752 return RET_OK;
753 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26