阅读:1594回复:7
CDROM 问题求助
各位高手
我在写一个光盘驱动程序,无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 |
|
沙发#
发布于: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关系的东西吧。 |
|
板凳#
发布于: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 |
|
地板#
发布于:2002-05-14 23:39
放心,生命没有任何问题. CDFS是我知道的文件系统中最简单的一种.象DREAMCAST 那样的东西才神妙.
你可以直接和我EMAIL. 联系,只要是ISO9660 FROM1 格式,SOUCE有现成的. 关于的ATAPI PACKAGE 的命令,文档资料上有不准确的地方.(或者说你用的那个HW有不匹配的地方) [编辑 - 5/14/02 by zdhe] |
|
地下室#
发布于: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 |
|
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 |
|
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 |
|
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. |
|