Linux 版 (精华区)

发信人: clx (楚留香), 信区: Unix
标  题: Kernel Package中的ide-cd说明(中译)
发信站: 紫 丁 香 (Sat Jun 27 12:55:03 1998), 转信

标  题: Kernel Package中的ide-cd说明(中译)
简体中文版维护:dfbb, fangh@bepc3.ihep.ac.cn

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.

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

---------------------------------------------------------------------------

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.244.16]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.809毫秒