当前位置:Linux教程 - Linux - Kernel Package中的ide-cd说明

Kernel Package中的ide-cd说明



        

    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.

    2. 安装
    ---------------
    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後的版本仍发现它的话,请报告这个BUG.

    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 <[email protected]>.
    */

    #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);
    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);
    }

    发布人:netbull 来自:诺金软件电脑网络