PeterYang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2002-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1594回复:7

CDROM 问题求助

楼主#
更多 发布于:2002-05-13 22:26
各位高手

    我在写一个光盘驱动程序,无OS和BIOS,只有BOOTLOAD.
现在问题是 :取出TOC(Table of Contents)数据如下:
1A00h0201h1600h0001h0000h0002h1500h0002h0000h3E08h1500h00AAh3A00h482Ch

依照atapi7.2说法 仿佛包含三个区域
Leadin(1600h0001h0000h0002h),
userdata(1500h0002h0000h3E08h),
Leadout(1500h00AAh3A00h482Ch)
请问它们的具体意义?


另外,如要访问光盘上的某一文件该如何做? ISO9660只提到格式如何
并未提到如何获得\"The Primary Valume Descriptor\"?

我现在想通过TOC给出的磁道和地址分别读上述三各区域的内容,以期
能够获得类似DOS FAT表的光盘文件表,可不可以?

Thanks for spead you time for review my question.

Best Regards,
Yours Peter

最新喜欢:

zxzdqdkfwzxzdqd... flyfoxflyfox
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-14 20:02
你的toc是什么方式下读出来的?

根据参数不同,独到的内容是完全不同的。
比如toc 还是last session, lba格式还是msf格式。


lead in, lead out 是光盘的物理存储方式,toc里没有的。
toc本身是q-channel组成的东西。是逻辑概念。(除非你处理得比scsi或者atapi极还要低)。

CDROM_TOC toc;
DWORD dwToc[CDROM_TOC_SIZE]={0x1A00,0x020,0x1600,0x0001,0x0000,0x0002,0x1500,0x0002,0x0000,0x3E08,0x1500,0x00AA,0x3A00,0x482C,};
memcpy(&toc,dwToc, min(sizeof(toc), sizeof(dwToc)));

可以看到结果。表明当前的cd只有一个session,这个session只有一个track. The Primary Valume Descriptor在这个track的第16各sector.

不没有os,可以猜测你大概是做boot cd关系的东西吧。

PeterYang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2002-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-14 22:27
Dear zdhe:

我是通过对atapi controller发command packet:
CmdPkt.Opcode = ATAPI_PACKET_CMD_READ_TOC;
CmdPkt.Byte_1 = 0x02;     // Use MSF Address Format
CmdPkt.Byte_7=(BYTE)((sizeof(CDROM_TOC)>> 8) &0x0FF);//3
CmdPkt.Byte_8=(BYTE)(sizeof(CDROM_TOC) &0x0FF); // 24

然后直读I/O

代码中的CDROM_TOC如下:
typedef struct _TRACK_DATA {
    UCHAR Reserved;
    UCHAR Control : 4;
    UCHAR Adr : 4;
    UCHAR TrackNumber;
    UCHAR Reserved1;
    UCHAR Address[4];
} TRACK_DATA, *PTRACK_DATA;

typedef struct _CDROM_TOC {
    // Header
    UCHAR Length[2];
    UCHAR FirstTrack;
    UCHAR LastTrack;
    // Track data
    TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
} CDROM_TOC, *PCDROM_TOC;

因此我不认为0x1600为Primary Valume Descriptor

Dear zdhe: 请再帮我分析一下。

另外我分别从0x00000002,0x00003e08,0x3a00482c 读2048 bytes
的内容,但实在找不出它们的含义。

不错,我做从CD上下载OS image 文件给DOC或RAM,然后boot

我不知道如何才能找到此文件,难道还要建立 File System and
Fat Table.没有BIOS and OS,不是要我的小命吗?

Tanks for read

Best Regards,
Peter
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-14 23:39
放心,生命没有任何问题. CDFS是我知道的文件系统中最简单的一种.象DREAMCAST 那样的东西才神妙.

你可以直接和我EMAIL. 联系,只要是ISO9660 FROM1 格式,SOUCE有现成的.

关于的ATAPI PACKAGE 的命令,文档资料上有不准确的地方.(或者说你用的那个HW有不匹配的地方)








[编辑 -  5/14/02 by  zdhe]
PeterYang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2002-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-15 10:54
Dear zdhe:

    Please wait a memont, I am now reading IS09660 and
cdterm files.

    I think I shall first know about some base concepts
before discuss with you.

Best Regards,
yours Peter
PeterYang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2002-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-16 11:48
Hello zdhe:
    看了一些规格后我认为要读cdrom or cd-r上的某一文件
要进行如下步骤:

1.确定 single-session,multi-session.估计我这是single-session.
2.读primary volume Descriptor,规格上讲它在逻辑轨道1的第16扇区
(\"Atime\" 00:02:16)开始的几个扇区里,其standard identifier =\"CD001\".

  我不知道相应的LBA为何值?  可不可以用channel Q 来读?

3.根据上述的Descriptor,寻找 path table, root directory,直到所需文件。

给你发了两封mail,不知收到没有?

Hope happy everyday.

Best Regards,
Peter
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-05-16 12:37
EMAIL没有收到. 我从不接受hotmail,你去看密语我给了你我的真实mail address.


.确定 single-session,multi-session.估计我这是single-session.

如果不是,primary volume Descriptor在last session的第一个TRACE里。

2.读primary volume Descriptor,规格上讲它在逻辑轨道1的第16扇区
(\"Atime\" 00:02:16)开始的几个扇区里,其standard identifier =\"CD001\".

只要isso9660 form1 和 form2(中的一部分)如此。
其它形式也有的。
你用OP_SCSI_READ_CD读数据,能看到CD001,如果使用OP_SCSI_READ6,OP_SCSI_READ10,OP_SCSI_READ12的话,可以不考虑多余的 2352 -2048 BYTES /PER SECTOR.

---------------------
我不知道相应的LBA为何值? 可不可以用channel Q 来读?
msf格式的 2秒16frame就是lba的16. (0开始)

3.根据上述的Descriptor,寻找 path table, root directory,直到所需文件。

找文件的话,完全正确。但是大多数的cdrom boot bios规范不用这种方式。 :D

bios参照first session, LBA=15的数据确认cdrom MEDIA 可否boot,如果可以BOOT,数据直接从first session的Descriptor开始找。

给你发了两封mail,不知收到没有?

Hope happy everyday.

Best Regards,
Peter


PeterYang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2002-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-16 22:24
I had read the coding about IDE menthod for WINCE bootloader:

first,init FAT
1. searching active partition using IDE_RDSECT_CMD.
2. find root directory
3. confirm FAT(first)
4. confirm DATA AREA
5. fill clust parameter.

second ,file open

1.from root directory LBA, compare file name characters
2.fill file info structure, especially current clusts
3. build clust list, but I don\'t understand.

last, file read(from current clusts )
1. sector read
2. remain bytes read.
 
游客

返回顶部