BBS水木清华站∶精华区

【 原文由 yorkwu@csie.ncu.edu.tw 所发表 】 
        这个应该比CD-ROM HOWTO更加详细才对... 
        不过不晓得那天kernel driver又改版,那麽我可没这麽多时间翻了. 
        不管如何,这对装IDE CDROM应该有些帮助... 
 
        喔! 还有喔! 
        CD-ROM HOWTO中,第二部份的那个CD-ROM操作手册说的话,被我找出来 
        了喔! 那是Panasonic CD-ROM的手册的A-1页之Introduction部份. 
--------------------------------------------------------------------------- 
IDE-CD driver documentation 
19 May 1996 
scott snyder  <snyder@fnald0.fnal.gov> 
 
 
1. 简介 
--------------- 
 
ide-cd驱动程式应该对所有连接到IDE介面的ATAPI 1.2相容的CD-ROM都有作用. 
注意有些厂商(包括Mitsumi,Sony,Creative,Aztech及Goldstar)同时有ATAPI 
相容及专属介面的机器. 如果你的机器是专属介面的,这个驱动程式对它无效. 
(不过会有另一个驱动程式可用) 这个驱动程式亦无法驱动接在平行埠(印表机 
介面)上的ATAPI光碟机. 此外,至少有一种机种(CyCDROM CR520ie)接在IDE界面 
上但却不是ATAPI的,此驱动程式亦无法驱动之. (不过可以试试aztcd驱动程式) 
 
这个驱动程式包函以下特点: 
 
 - 读取资料轨,挂上ISO9660档案系统. 
 
 - 播放音轨. 多数CDROM播放程式应该都能用; 我通常用workman 
 
 - 支援多段录. 
 
 - 直接从音轨读取数位音讯资料,如果机器支援的话. cdda2wav程式可以用於此. 
   然而注意,只有少数机种有支援此功能; 我只有听过一些Sony及Toshiba的 
   成功过. 
 
 - 对符合ATAPI 2.6草案标准的CD-ROM自动换片机种(如NEC CDR-251)初步支援. 
   这不过是在外部程式控制下,加入一个切换换片槽的功能罢了. 这种程式的 
   范例就在本档後面. 三洋的三片换片机(不完全符合标准)现在也支援了. 
   请注意这个驱动程式将第一片CD视为#0. 
 
0. ide-cd依赖ide磁碟驱动程式. 请看Documentation/ide.txt看那程式的最新 
   消息. 
 
1. 确定ide及ide-cd驱动程式编译进你用的核心内. 当设置核心时,对以下的问题 
   回答'yes' 
 
      Enhanced IDE/MFM/RLL disk/cdrom/tape support 
      Include IDE/ATAPI CDROM support 
 
   对以下的回答'no' 
 
      Use old disk-only driver on primary interface 
 
   照你有的IDE介面种类,你也许需要额外的设置参数.请看Documentation/ide.txt 
 
2. 你也应该确定 iso9660 档案系统编译进核心或做成可载入模组. 你可以由 
   cat /proc/filesystems 
   来看某档案系统核心认不认识. 
 
3. CD-ROM应该接到IDE介面上. 每个介面由I/O port位址及IRQ秆醁定义. 
   标准是主要IDE在0x170及14,次级在0x1f0及15.每个介面可接两,可以是 
   硬碟,CD-ROM或磁带机. 介面上的两分别是Master及Slave;通常由机器上 
 
  的跳线盒设定. 
 
   Linux照下面方式取名. 在主要IDE介面上的master及slave设备分别叫做 
   hda及hdb. 在次级的上则叫hdc及hdd.(第三个字会不一样,如果是在别的位 
   置的话,请看Documentation/ide.txt) 
 
   如果你想要驱动程式自动找到CD-ROM的话,你应该确定你的介面用上述的主要 
   或次级位址. 另外,如果该CD-ROM是介面上唯一一光碟机的话,应该设为 
   master. (如果为了些理由你无法这麽设的话,你仍有可能用本驱动程式. 
   你开机时要加入一些额外设定资讯给核心. 看Documentation/ide.txt取得更 
   多资讯.) 
    
 
4. 重开机. 如果你的机器被辨识出来,你应该看到像以下的讯息: 
 
     hdb: NEC CD-ROM DRIVE:260, ATAPI CDROM drive 
 
   如果你没看到,看下面第五节. 
 
5. 你也许想建立指向真正设备的符号连结/dev/cdrom. 可用以下命令: 
 
     ln -s  /dev/hdX  /dev/cdrom 
 
   'X'应该用你的机器装上的设备档的那个字代替. 
 
6. 你应该可用dmesg命令看任何错误讯息. 
 
3. 基本使用 
-------------- 
 
An iso9660 format cdrom can be mounted by putting the disc in the 
drive and typing (as root) 
ISO9660格式的CDROM片子可以放进机器内,以root身份打入 
 
  mount -t iso9660 /dev/cdrom /mnt/cdrom 
 
来挂上. 这假设/dev/cdrom指向真正的设备(上节第五步)而/mnt/cdrom是空目录. 
你应该可在/mnt/cdrom看到片片的目录了. 如果你想换片,你必须先以下列命令 
卸下: 
 
  umount /mnt/cdrom 
 
注意CD唱片不能挂上. 
 
一些散布设定/etc/fstab使开机就挂上CD-ROM,这样做不是必要的. 你若勤於换片, 
这样反而困扰. 你应该会觉得把/etc/fstab的这行去掉,然後手动挂上会更舒服些. 
 
多段录及相片光碟应该不用特别处理就能用了. hpcdtoppm套件(ftp.gwdg.de: 
/pub/linux/hpcdtoppm/)对读相片光碟也许很有用. 
 
想放唱片,你应该先卸下及移走资料片. 然後任何CD播放器(workman,workbone, 
cdplayer等)应该都能用. 要是没别的,你可以用Documentation/cdrom/sbpcd 
中的cdtester程式. 
 
有些机器上你可用cdda2wav程式直接抓音轨. 我只听过Sony及Toshiba的机器有支援. 
如果你在没支援的机器上用,会出现错误讯息. 
 
为支援换片机,你可以用cdload程式(在本档後面)切换CD槽.注意要换槽前要先 
卸下CD-ROM. 这个程式要两个参数: CD-ROM设备档及槽号码.如果槽号给-1, 
就会退出片子. 
 
4. 编译选项 
---------------------- 
 
编译时有一些选项可供设定. 多数人是不必碰他们; 这只是为求完整列出来的. 
可以在ide-cd.c上部加入一行'#define <option> 1'使它有作用. 
 
 
VERBOSE_IDE_CD_ERRORS 
  如果这被设定了,ATAPI错误码会被翻译为文字描述.此外,产生错误的命令会 
  被印出来. 这个预设为不用,以节省错误讯息表的庞大记忆体使用量. 
 
STANDARD_ATAPI 
  如果这个被设定,一些没有适当符合ATAPI标准的机器将无法使用.如果你晓得你 
  的机器和ATAPI够相容的话,设了它会得到较小的核心. 
 
NO_DOOR_LOCKING 
  如果这个被设定,驱动程式不会试著锁定机器的托盘. 
 
TEST 
  这个会启用一个ioctl,使使用者模式的程式可执行一个封包命令. 详情请看 
  原始程式. 放著别动,除非你晓得你在嘛.  
 
5. 常见问题 
------------------ 
 
这节讨论使用本驱动程式的常见问题,以及一些可能的解. 注意如果你碰到问题, 
你也许应该看Documentation/ide.txt得到现在IDE支援码的资讯. 有些只会在较早 
期的驱动程式才会出现,不过为求完整,还是在此列出. 
多数情况下,你也许应该用dmesg来取得错误讯息. 
 
a. 开机时没侦测到. 
 
   - 再看一下上面的设定步骤. 检查你的硬体如何安装的. 
 
   - 如果你的是在IDE介面上唯一一,那应该调成master,如果可能的话. 
 
   - 如果你的不再标准的0x170或0x1f0位址上,你必须用lilo参数明示驱动程式. 
     看Documentation/ide.txt (这特点约在1.3.30的核心加入) 
 
   - 如果自动侦测抓不到,你可以用lilo参数告诉驱动程式(hdX=cdrom) 
     这X代表你的CD-ROM安装到的位置. 如果你看到下面讯息: 
 
       hdX: ATAPI cdrom (?) 
 
     这不表示驱动程式侦测到机器了. 它表示没抓到机器,但是假设那有, 
     因为你告诉他有. 如果你对不存在或无反应的I/O位址做I/O的话, 你可能 
     会得到0xff状态的错误.  
 
   - 有些IDE介面需要非标准的方法驱动,才能正常工作(这种情况通常会给你 
 
    一个MS-DOS驱动程式专供该IDE控制器用)音效卡上的IDE介面经常就是这样. 
 
     对需要额外起始程序的介面支援起於後期的1.3.x核心. 你要打开额外的 
     核心参数才能让他们工作. 参看Documentation/ide.txt 
 
     即使对你的介面还没有支援,你仍可能用下述方法让它能用.首先用MS-DOS开 
     机,载入驱动程式,然後暖开机进Linux(不要关电源)如果这样能用,就可以在MSDOS 
     的autoexec中用loadlin了. 
 
 
b. 超时(timeout)/IRQ错误  
 
  - 如果你老是得到超时的错误,从机器来的中断可能没有传到电脑. 
 
  - IRQ问题也许在开机时会出现讯息'IRQ probe failed(<n>)',如果<n>是0, 
    那就是说驱动程式期待一个中断,但没收到(任何可能的IRQ). 如果<n>是负的, 
    就是说系统收到好几个IRQ线的中断,但只期望一个从机器传来的而已. 
 
  - 再检查硬体设定,确定IDE介面的IRQ号码和驱动程式所期望的相符.(通常是 
    14(在主要(0x170)介面上)及15(在次要(0x1f0)介面上)而且确定你没有其他 
    会和你用的IRQ相突的硬体.也检查BIOS setup; 有些可以单独取消IRQ. 
    我听说有一种系统出来时IRQ 15是关闭的. 
- 注意有很多MS-DOS的驱动程式即使中断设定的硬体有问题,也照用不误. 
    它们显然不使用中断. 
 
c. 当机 
 
  - 如果在存取CD-ROM时当机了,最可能的原因是你的IDE卡太烂,无法好好处理 
    多重介面的同部交易. 最恶名昭张的就是CMD640B晶片. 可在开机时用serialize 
    选项加以解决. 最新的核心应该多半能侦测这个的必要性,但不能保证不出差错. 
    看Documentation/ide.txt取得CMD640B的serialize参数的进一步资讯. 
 
  - 注意很多MS-DOS驱动程式在这种虫虫乱长的硬体上毫无问题, 显然因为 
    它们根本就不试著在其他磁碟活动时,重叠CD-ROM动作. 
 
d. 无法挂上CD-ROM 
 
  - 如果你mount时得到错误,用dmesg检查错误在驱动程式还是档案系统是有帮助的. 
 
  - 确定有片子放在CD-ROM,而且是ISO-9660格式的. 你无法挂上一张唱片. 
 
  - With the cdrom in the drive and unmounted, try something like 
  - 把CD-ROM放进机器中,不要挂载它,试试: 
 
    cat /dev/cdrom | od | more 
 
    如果你得到一堆数字结果,那机器和驱动程式应该没问题,问题在档案系统方面. 
    (如,片子不是ISO-9660或者结构有错误) 
 
  - 如果你看到'not a block device'错误,检查下列设备档定义是否正确. 
    他们应该像下面: 
 
      brw-rw----   1 root     disk       3,   0 Nov 11 18:48 /dev/hda 
      brw-rw----   1 root     disk       3,  64 Nov 11 18:48 /dev/hdb 
      brw-rw----   1 root     disk      22,   0 Nov 11 18:48 /dev/hdc 
      brw-rw----   1 root     disk      22,  64 Nov 11 18:48 /dev/hdd 
 
    早期的Slackware版本定义错误.如果他们是错的,你可用scripts/MAKEDEV.ide 
    更正他们(你也许必须先用chmod让它可执行.) 
 
    如果你有/dev/cdrom,确定它指到正确的设备档. 
 
    如果你听说'hd1a'及'hd1b'设备档,这是旧名称,现在叫做hdc及hdd. 这些名称 
    应该视为过时. 
 
  - 如果mount抱怨没有支援iso9660,但你确定有(检查/proc/filesystems) 
    你也许需要更新mount. 旧板不一定会给有意义的错误讯息. 
 
e. 目录列表被无法预测地切断,而且dmesg显示'buffer botch'错误. 
 
  - 这是1.2.x核心中那版驱动程式核心的虫. 它在1.3.0中修正了. 如果你不能 
    升级, 你在mount时指示blocksize为2048也许能解决.(注意这样你就无法 
    直接在CD-ROM上执行程式了.) 
 
    如果你在1.3.0後的版本仍发现它的话,请报告这虫. 
 
6. cdload.c 
----------- 
 
/* 
 * cdload.c  <device>  <slot> 
 * 
 * Load a cdrom from a specified slot in a changer.  The drive should be 
 * unmounted before executing this. 
 * 
 * Based on code originally from Gerhard Zuber <zuber@berlin.snafu.de>. 
 */ 
 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <linux/cdrom.h> 
 
 
int 
main (int argc, char **argv) 

        char *program; 
        char *device; 
        int x_slot; 
        int fd;           /* file descriptor for CD-ROM device */ 
        int status;       /* return status for system calls */ 
 
        program = argv[0]; 
 
        if (argc != 3) { 
                fprintf (stderr, "usage: %s <device> <slot>\n", program); 
                fprintf (stderr, "usage: %s <device> <slot>\n", program); 
                exit (1); 
        } 
 
        device = argv[1]; 
        x_slot = atoi (argv[2]); 
 
        /* open device */  
        fd = open (device, 0); 
        if (fd < 0) { 
                fprintf (stderr, "%s: open failed for `%s': %s\n", 
                         program, device, strerror (errno)); 
                exit (1); 
        } 
 
        /* load */  
        status = ioctl (fd, CDROMLOADFROMSLOT, x_slot); 
        if (status != 0) { 
                fprintf (stderr, 
                         "%s: CDROMLOADFROMSLOT ioctl failed for `%s': %s\n", 
                         program, device, strerror (errno)); 
                exit (1); 
        } 
  
        /* close device */ 
        status = close (fd); 
        if (status != 0) { 
                fprintf (stderr, "%s: close failed for `%s': %s\n", 
                         program, device, strerror (errno)); 
                exit (1); 
        } 
  
        exit (0); 

 
 
 
 
 
 
 
 
 
 
 
-- 
================================================================ 
ID: dfbb                 NICKNAME:赵无忌     REALNAME:方汉 
---------------------------------------------------------------- 
爱好:GAME,Linux, PC            Email:    fangh@csun01.ihep.ac.cn 
     武侠,古文   Clinux Homepage:http://csun01.ihep.ac.cn/linux/ 
================================================================ 

BBS水木清华站∶精华区