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)
页面执行时间:3.626毫秒