From: strobe a. <ana...@ma...> - 2001-08-03 14:38:58
|
Hey, I'm interested in porting cdrdao to Darwin but there aren't many clues as= to how exactly it works (looking at the 1.1.5 archive I decompressed).= There is some mention that it uses the same 'SCSI library' as cdrecord, but= to my knowledge that hasn't been ported either. Do I need to have intimate= knowledge of cdrecord before I can port cdrdao? I only have two CD-Rs. A working Ricoh MP7083A (ATA drive) and a= coaster-making JVC XR-W2026 crapmatic (SCSI). I'm mostly interested in= getting RAW DAO to work. I can already burn various kinds of CDs on this OS using closed-source= programs, but they don't support RAW DAO. I'm somewhat knowledgeable in how= Darwin functions, but not at all with how cdrdao does. Is there a detailed= description of how cdrdao communicates with the drive? How this process= differs between OSs would probably help too. This is basically what I know so far about the inner workings in OS X= (without going through ridiculous detail). OS X (or Darwin, same thing in= this context) has a well organized object-oriented driver architecture= called IOKit or "I/O Kit". It also has a registry which is a vast hierarchy= encompassing all hardware and drivers detected. In OS X my CD-R burner is= recognized as an atapi device type. The atapi 'protocol transport' appears= to manage the atapi protocol. Then, curiously, it's registered as a SCSI= peripheral (I've read that cdrecord does something similar, but I'm not= familiar with the reasoning or history behind this. Other ATA devices like= hard drives are registered as ATA block devices, but the CDRW burner is= registered as a SCSI peripheral.). It's then registered as a SCSI= peripheral "Type05" which I speculate means a CD/DVD device. This is then= used by a CD block storage driver and a SCSI 'task' 'initer' or "CDIniter"= driver which I suppose notifies the system when something is inserted. At this point there is no CD and no BSD character device etc. When you= insert a CD a media device called "CD-R/RW RW7083A" (my Ricoh drive) is= created which has BSD related info like the character device name, major,= minor, block size, etc. and a device shows up on /dev/. A bunch of other= objects are created like a CD partition scheme and a bunch of partitions= (this CD had 9). The "Type" was also a "CD-ROM". However if I inserted a= blank CD some of these values change like the "Type" becomes a "CD-R". I have looked at the Darwin source code and everything corresponds. All= this is within the scope of the public source. This means when I insert a= blank CD with nothing but a console running (no graphical CD burning crap)= I should get that (non-writable) BSD character device along with the= IOMedia device (abstract media object). Unfortunately this doesn't appear= to allow me to write blocks never mind subchannel data via RAW DAO mode.= The way one commercial CD burning app works is to connect to a Type05 SCSI= peripheral device nub instead of the compact disk services Thus if I'm= burning a CD image I don't think the BSD device is ever created. The way= another *cough* 1st party *cough* disk burning program works is to connect= to the relatively lower-level SCSI peripheral device nub which has a= specific Vendor, Product, Revision, etc. instead of merely a Type05, thus= (I think) taking place of the higher-level Type05 device family. Both= closed-source programs connect to a SCSI peripheral nub (both of which are= open source) regardless if the drive is SCSI, ATA, USB, or FireWire. Now if I know exactly how cdrdao works what I may be able to do is author a= program or library which connects to the SCSI peripheral nub of the CD-R= using that device exclusively (done using a higher probe score). Keep in= mind I don't know much about the SCSI protocol despite using it constantly= since 1986. I also don't know much about the RAW DAO protocol, but I do= know a little about how CD formats work (sector areas are sync, header,= subheader, user, auxiliary, errorflags, subchannel. CDDA uses 2352byte= user, 294 errorflags, 96 subchannel, etc. etc.). I hope somebody on this= list can help in those areas in which I'm clueless so I can get this thing= to work. The only other thing I'll mention is I could install LinuxPPC on this= machine if that's of any help. Perhaps somebody knows cdrdao works well in= LinuxPPC so I can test the burner (MP7083A isn't listed on your web pages).= I guess I could also install the burner in one of my PCs, although it= wouldn't be convenient. Thanks for any assistance. =46YI: IOService hierarchy (ignore pipes and irrelevant data like power management)= : +-o Root <class IORegistryEntry> +-o PowerMac3,1 <class IOPlatformExpertDevice> +-o Core99PE <class Core99PE> | +-o pci@f2000000 <class IOPlatformDevice> | | +-o AppleMacRiscPCI <class AppleMacRiscPCI> | | +-o pci-bridge@D <class IOPCIDevice> | | +-o IOPCI2PCIBridge <class IOPCI2PCIBridge> | | +-o mac-io@7 <class IOPCIDevice> | | | +-o KeyLargo <class KeyLargo> | | | +-o ata-3@20000 <class AppleMacIODevice> | | | | +-o KeyLargoATA <class KeyLargoATA> | | | | +-o ATADeviceNub <class ATADeviceNub> | | | | +-o IOATAPIProtocolTransport <class IOATAPIProtocol= Transport> | | | | +-o IOSCSIPeripheralDeviceNub <class IOSCSIPeriph= eralDeviceNub> | | | | +-o IOSCSIPeripheralDeviceType05 <class IOSCSIP= eripheralDeviceType05> | | | | +-o IOCompactDiscServices <class IOCompactDis= cServices> | | | | +-o IOCDBlockStorageDriver <class IOCDBlock= StorageDriver> | | | | +-o SCSITaskUserClientIniter <class SCSITas= kUserClientIniter> | | | | +-o SCSITaskUserClient <class SCSITaskUserC= lient> Some details about interesting objects when inserting blank CD: | | | | +-o ATADeviceNub <class ATADeviceNub> | | | | | { | | | | | "unit number" =3D 0 | | | | | "socket type" =3D "internal" | | | | | "ata device type" =3D "atapi" | | | | | "device serial" =3D " " | | | | | "device revision" =3D "1.20 " | | | | | "device model" =3D " CD-R/RW RW7083A = " | | | | | "IOUnit" =3D 0 | | | | | } | | | | | | | | | +-o IOATAPIProtocolTransport <class IOATAPIProtocol= Transport> | | | | | { | | | | | "Power Management protected data" =3D "{ theNu= mberOfPowerStates =3D 2, version 1, power state 0 =3D { capabilityFlags= 00000000, outputPowerCharacter 00000000, inputPowerRequirement 00000000,= staticPower 0, unbudgetedPower 0, powerToAttain 0, timeToAttain 0,= settleUpTime 0, timeToLower 0, settleDownTime 0, powerDomainBudget 0 },= power state 1 =3D { capabilityFlags 0000c080, outputPowerCharacter= 00000002, inputPowerRequirement 00000022, staticPower 0, unbudgetedPower 0,= powerToAttain 0, timeToAttain 0, settleUpTime 0, timeToLower 0,= settleDownTime 0, powerDomainBudget 0 }, aggressiveness =3D 0,= myCurrentState =3D 1, parentsCurrentPowerFlags =3D 00000022, maxCapability= =3D 1 }" | | | | | "IOMatchCategory" =3D "IODefaultMatchCategory" | | | | | "IOClass" =3D "IOATAPIProtocolTransport" | | | | | "ata device type" =3D "atapi" | | | | | "IOProviderClass" =3D "IOATADevice" | | | | | "IOProbeScore" =3D 0 | | | | | "CFBundleIdentifier" =3D "com.apple.iokit.IOAT= APIProtocolTransport" | | | | | "Power Management private data" =3D "{ this= object =3D 02d62800, interested driver =3D 02d62800, driverDesire =3D 1,= deviceDesire =3D 1, ourDesiredPowerState =3D 1, previousRequest =3D 98 }" | | | | | } | | | | | | | | | +-o IOSCSIPeripheralDeviceNub <class IOSCSIPeriph= eralDeviceNub> | | | | | { | | | | | "IOMatchCategory" =3D "SCSITaskUserClientDev= ice" | | | | | "Product Identification" =3D "CD-R/RW RW7083= A" | | | | | "IOClass" =3D "IOSCSIPeripheralDeviceNub" | | | | | "IOProviderClass" =3D "IOSCSIProtocolService= s" | | | | | "IOProbeScore" =3D 0 | | | | | "Peripheral Device Type" =3D 5 | | | | | "CFBundleIdentifier" =3D "com.apple.iokit.IO= SCSIArchitectureModelFamily" | | | | | "Vendor Identification" =3D " D=92A= rt=F7=ED=BFb< =91 =F7(" | | | | | "Product Revision Level" =3D "1.20" | | | | | } | | | | | | | | | +-o IOSCSIPeripheralDeviceType05 <class IOSCSIP= eripheralDeviceType05> | | | | | { | | | | | "CD Features" =3D 15 | | | | | "IOMatchCategory" =3D "IODefaultMatchCateg= ory" | | | | | "Power Management protected data" =3D "{ t= heNumberOfPowerStates =3D 5, version 1, power state 0 =3D { capabilityFlags= 00000000, outputPowerCharacter 00000000, inputPowerRequirement 00000000,= staticPower 0, unbudgetedPower 0, powerToAttain 0, timeToAttain 0,= settleUpTime 0, timeToLower 0, settleDownTime 0, powerDomainBudget 0 },= power state 1 =3D { capabilityFlags 00000000, outputPowerCharacter= 00000002, inputPowerRequirement 00000002, staticPower 0, unbudgetedPower 0,= powerToAttain 0, timeToAttain 0, settleUpTime 0, timeToLower 0,= settleDownTime 0, powerDomainBudget 0 }, power state 2 =3D {= capabilityFlags 00008040, outputPowerCharacter 00000002, inputPowerRequirem= ent 00000002, staticPower 0, unbudgetedPower 0, powerToAttain 0,= timeToAttain 0, settleUpTime 0, timeToLower 0, settleDownTime 0,= powerDomainBudget 0 }, power state 3 =3D { capabilityFlags 00008040, output= PowerCharacter 00000002, inputPowerRequirement 00000002, staticPower 0,= unbudgetedPower 0, powerToAttain 0, timeToAttain 0, settleUpTime 0,= timeToLower 0, settleDownTime 0, powerDomainBudget 0 }, power state 4 =3D {= capabilityFlags 0000c040, outputPowerCharacter 00000002, inputPowerRequirem= ent 00000002, staticPower 0, unbudgetedPower 0, powerToAttain 0,= timeToAttain 0, settleUpTime 0, timeToLower 0, settleDownTime 0,= powerDomainBudget 0 }, aggressiveness =3D 0, myCurrentState =3D 4, parentsC= urrentPowerFlags =3D 00000002, maxCapability =3D 4 }" | | | | | "IOClass" =3D "IOSCSIPeripheralDeviceType0= 5" | | | | | "IOProviderClass" =3D "IOSCSIPeripheralDev= iceNub" | | | | | "Peripheral Device Type" =3D 5 | | | | | "IOProbeScore" =3D 5000 | | | | | "CFBundleIdentifier" =3D "com.apple.iokit.= IOSCSIMultimediaCommandsDevice" | | | | | "DVD Features" =3D 0 | | | | | "Power Management private data" =3D "{= this object =3D 02d6c300, interested driver =3D 02d6c300, driverDesire =3D= 1, deviceDesire =3D 4, ourDesiredPowerState =3D 4, previousRequest =3D 66 }= " | | | | | } | | | | | | | | | +-o IOCompactDiscServices <class IOCompactDis= cServices> | | | | | { | | | | | "IOMatchCategory" =3D "SCSITaskAuthoring= Device" | | | | | "IOMaximumBlockCountWrite" =3D 256 | | | | | "IOMaximumSegmentCountRead" =3D 32 | | | | | "IOMaximumSegmentCountWrite" =3D 32 | | | | | "IOCFPlugInTypes" =3D {"97ABCF2C-23CC-11= D5-A0E8-003065704866"=3D"IOSCSIArchitectureModelFamily.kext/Contents/PlugIns= /SCSITaskUserClient.kext/Contents/PlugIns/SCSITaskLib.plugin"} | | | | | "IOMaximumBlockCountRead" =3D 256 | | | | | "device-type" =3D "CDROM" | | | | | "SCSITaskUserClient GUID" =3D <02d96e800= 000001913fe211e> | | | | | "IOUserClientClass" =3D "SCSITaskUserCli= ent" | | | | | } | | | | | | | | | +-o IOCDBlockStorageDriver <class IOCDBlock= StorageDriver> | | | | | | { | | | | | | "Statistics" =3D {"Bytes (Read)"=3D271= 664,"Latency Time (Write)"=3D0,"Total Time (Read)"=3D0,"Errors (Write)"=3D0,= "Retries (Write)"=3D0,"Total Time (Write)"=3D0,"Bytes (Write)"=3D0,"Operatio= ns (Write)"=3D0,"Operations (Read)"=3D153,"Latency Time (Read)"=3D0,"Errors= (Read)"=3D1,"Retries (Read)"=3D0} | | | | | | "IOMatchCategory" =3D "IODefaultMatchC= ategory" | | | | | | "IOClass" =3D "IOCDBlockStorageDriver" | | | | | | "IOProviderClass" =3D "IOCDBlockStorag= eDevice" | | | | | | "IOPropertyMatch" =3D {"device-type"= =3D"CDROM"} | | | | | | "IOProbeScore" =3D 0 | | | | | | "CFBundleIdentifier" =3D "com.apple.io= kit.IOCDStorageFamily" | | | | | | "IOGeneralInterest" =3D ("_IOServiceIn= terestNotifier is not serializable") | | | | | | } | | | | | | | | | | | +-o D=92A rt=F7=ED=BFb< =91 =F7( CD-R/RW= RW7083A Media <class IOCDMedia> | | | | | | { | | | | | | "BSD Unit" =3D 2 | | | | | | "Content" =3D "" | | | | | | "Whole" =3D Yes | | | | | | "BSD Minor" =3D 20 | | | | | | "Type" =3D "CD-R" | | | | | | "Preferred Block Size" =3D 2352 | | | | | | "Ejectable" =3D Yes | | | | | | "Writable" =3D No | | | | | | "Size" =3D 2352 | | | | | | "TOC" =3D <00020000> | | | | | | "BSD Name" =3D "disk2" | | | | | | "Content Hint" =3D "" | | | | | | "BSD Major" =3D 14 | | | | | | "Leaf" =3D Yes | | | | | | } | | | | | | | | | | | +-o IOCDMediaBSDClient <class IOCDMedia= BSDClient> | | | | | { | | | | | "IOMatchCategory" =3D "IOMediaBSDC= lient" | | | | | "IOPersonalityName" =3D "IOCDMedia= BSDClient" | | | | | "IOClass" =3D "IOCDMediaBSDClient" | | | | | "IOProbeScore" =3D 31000 | | | | | "IOProviderClass" =3D "IOCDMedia" | | | | | "CFBundleIdentifier" =3D "com.appl= e.iokit.IOCDStorageFamily" | | | | | "ParentKey" =3D "KEXTBundle?com.ap= ple.iokit.IOCDStorageFamily" | | | | | } | | | | | | | | | +-o SCSITaskUserClientIniter <class SCSITas= kUserClientIniter> | | | | | { | | | | | "IOProviderMergeProperties" =3D {"IOCF= PlugInTypes"=3D{"97ABCF2C-23CC-11D5-A0E8-003065704866"=3D"IOSCSIArchitecture= ModelFamily.kext/Contents/PlugIns/SCSITaskUserClient.kext/Contents/PlugIns/S= CSITaskLib.plugin"},"IOUserClientClass"=3D"SCSITaskUserClient"} | | | | | "IOMatchCategory" =3D "SCSITaskAuthori= ngDevice" | | | | | "IOPersonalityName" =3D "CDIniter" | | | | | "IOClass" =3D "SCSITaskUserClientInite= r" | | | | | "IOProviderClass" =3D "IOCompactDiscSe= rvices" | | | | | "IOProbeScore" =3D 0 | | | | | "CFBundleIdentifier" =3D "com.apple.io= kit.SCSITaskUserClient" | | | | | "ParentKey" =3D "KEXTBundle?com.apple.= iokit.SCSITaskUserClient" | | | | | } | | | | | | | | | +-o SCSITaskUserClient <class SCSITaskUserC= lient> | | | | { | | | | } | | | | BTW what is "Leaf"? |