>Betreff : [linux-minidisc] netmd download >Gesendet: 30.10.2010 21:03:28 >An : "linux-minidisc@lists.fu-berlin.de" >Von: "manner.moe@gmx.de" >----- Originale Nachricht ----- >I logged USB transfer while SonicStage download and found some commands i >don´t know. >(see attached text file) O.K., i made some more tests and usb logs. The attached text file shows all commands from SonicStage start to SonicStage close There seems to be a general command to access TOC data, there are several comments in the text file to describe my interpretation of some commands. regards, Thomas
# downloading 1 Track with SonicStage on MZ-NH1 # - starts at opening SonicStage and ends on closing SonicStage # - download part and reading track list are not displayed, we already know this # - known commands are replaced by their function names in libnetmd.py # - some commands are grouped with their corresponding open/close commands to make it easier to read # # - following commands are replaced, too # these are not implemented in libnetmd, it´s just a sample of how they could be implemented # # => 00 18 08 00 $m 00 # accesDeviceDescriptor() # <= 09 18 08 00 $m 00 # $m (length: 1 Byte) = mode (0x01=open; 0x00 = close) # # => 00 18 09 00 ff 00 00 00 00 00 # getConfigDescriptor() # <= 09 18 09 00 10 00 00 37 00 00 00 35 00 02 00 02 # not verified, looks like a kind of configuration descriptor # 00 02 10 00 18 00 00 0d 00 0b 01 10 01 03 01 20 # 03 00 02 10 00 00 1a 4e 65 74 4d 44 10 ff 00 00 # 00 01 48 69 2d 4d 44 65 78 33 57 61 6c 6b 6d 61 # 6e # # => 00 18 08 80 00 $m 00 # accessDeviceSettings() # <= 09 18 08 80 00 $m 00 # $m (length: 1 Byte) = mode (0x01=open; 0x00 = close) # # => 00 18 08 10 $p $s $m 00 # accessTOC() ,,, this includes cacheTOC() and syncTOC() # <= 09 18 08 10 $p $s $m 00 # $p (length: 1 Byte) = part (0x10=data; 0x18=titles) # # $s (length: 1 Byte) = subpart (0x00=medium; 0x01= disc/group; 0x02=track) # # $m (length: 1 Byte) = mode (0x00 = close; 0x01=open; 0x03=open writable) # # This seems to open direct TOC acces to disc and not to cloned TOC in device internal memory # cacheTOC() can be replaced by accessTOC() part:titles / subpart:track / mode:open writable # syncTOC() can be replaced by accessTOC() part:titles / subpart:track / mode:close # # writing disc title uses this method of TOC access, too. # => 00 18 08 10 18 01 03 00 # accessTOC() part:titles / subpart:disc/group / mode:open writable # <= 09 18 08 10 18 01 03 00 # => 00 18 07 02 20 18 01 .... # setDiscTitle() # <= 09 18 07 02 20 18 01 .... # => 00 18 08 10 18 01 00 00 # accessTOC() part:titles / subpart:disc/group / mode:close # <= 09 18 08 10 18 01 00 00 # # No warranty, this is just my own interpretation of these commands ;) accesDeviceDescriptor() mode:open getConfigDescriptor() accesDeviceDescriptor() mode:close getStatus() => 02 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 <= 08 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 <= 08 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 c1 ff 60 00 <= 08 18 c1 ff 60 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 ff b2 70 <= 08 ff b2 70 # STATUS_NOT_IMPLEMENTED on NH1 getStatus() stop() getStatus() accesDeviceDescriptor() mode:open getConfigDescriptor() accesDeviceDescriptor() mode:close => 02 18 00 08 00 46 f0 03 01 03 30 ff 00 10 01 00 00 <= 08 18 00 08 00 46 f0 03 01 03 30 ff 00 10 01 00 # STATUS_NOT_IMPLEMENTED on NH1 00 accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessTOC() part:data / subpart:medium / mode:open getDiscFlags() accessTOC() part:data / subpart:medium / mode:close acquire() accessTOC() part:data / subpart:medium / mode:open getDiscFlags() accessTOC() part:data / subpart:medium / mode:close accessTOC() part:data / subpart:medium / mode:open getDiscFlags() accessTOC() part:data / subpart:medium / mode:close accessTOC() part:titles / subpart:disc/group / mode:open getDiscTitle() wchar_value = 0 accessTOC() part:titles / subpart:disc/group / mode:close accessTOC() part:titles / subpart:disc/group / mode:open getDiscTitle() wchar_value = 1 accessTOC() part:titles / subpart:disc/group / mode:close => 02 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 <= 08 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 <= 08 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 c1 ff 60 00 <= 08 18 c1 ff 60 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 ff b2 70 <= 08 ff b2 70 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 <= 08 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 <= 08 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 c1 ff 60 00 <= 08 18 c1 ff 60 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 ff b2 70 <= 08 ff b2 70 # STATUS_NOT_IMPLEMENTED on NH1 accesDeviceDescriptor() mode:open getConfigDescriptor() accesDeviceDescriptor() mode:close accesDeviceDescriptor() mode:open getConfigDescriptor() accesDeviceDescriptor() mode:close getStatus() => 00 18 00 08 00 46 f0 03 01 04 80 ff <= 09 18 00 08 00 46 f0 03 01 04 80 00 03 00 => 02 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 <= 08 18 41 ff 00 00 20 10 01 00 00 20 10 01 00 01 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 <= 08 18 42 ff 00 00 20 10 01 00 00 00 00 00 00 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 18 c1 ff 60 00 <= 08 18 c1 ff 60 00 # STATUS_NOT_IMPLEMENTED on NH1 => 02 ff b2 70 <= 08 ff b2 70 # STATUS_NOT_IMPLEMENTED on NH1 accessTOC() part:data / subpart:medium / mode:open getDiscFlags() accessTOC() part:data / subpart:medium / mode:close accessTOC() part:titles / subpart:disc/group / mode:open getDiscTitle() accessTOC() part:titles / subpart:disc/group / mode:close accessTOC() part:data / subpart:disc/group / mode:open getTrackCount() accessTOC() part:data / subpart:disc/group / mode:close => 02 18 d1 ff 01 00 00 00 88 08 01 00 00 # these three commands seems to be sent to the <= 0c 18 d1 ff 01 00 00 00 88 08 01 00 00 # device right before stop() command # maybe a kind of preparation for stop() command => 02 18 d1 ff 01 00 00 00 88 08 00 80 00 # as "stop write process" (remove overwrite head from disc surface), <= 0c 18 d1 ff 01 00 00 00 88 08 00 80 00 # move laser to "park position" etc. => 02 18 d1 ff 01 00 00 00 88 08 00 c0 00 <= 0c 18 d1 ff 01 00 00 00 88 08 00 c0 00 stop() accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close accessTOC() part:titles / subpart:disc/group / mode:open getDiscTitle() accessTOC() part:titles / subpart:disc/group / mode:close accessTOC() part:data / subpart:disc/group / mode:open getTrackCount() accessTOC() part:data / subpart:disc/group / mode:open accessTOC() part:data / subpart:disc/group / mode:open getTrackCount() accessTOC() part:data / subpart:disc/group / mode:open accessTOC() part:titles / subpart:disc/group / mode:open getDiscTitle() accessTOC() part:titles / subpart:disc/group / mode:close accessTOC() part:data / subpart:disc/group / mode:open getTrackCount() accessTOC() part:data / subpart:disc/group / mode:open accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close ... (several times getDiscTitle() and getTrackCount() ) ... (reading track list: getTrackInfo() for length, encoding, flags and title on all tracks) ... (several times getStatus()) accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close accessTOC() part:data / subpart:medium / mode:open getDiscCapacity() accessTOC() part:data / subpart:medium / mode:close accessDeviceSettings() mode:open getRecordingParameters() accessDeviceSettings() mode:close ... (several times getDiscCapacity() and getRecordingParameters() ) accessTOC() part:data / subpart:disc/group / mode:open getTrackCount() accessTOC() part:data / subpart:disc/group / mode:open ... (downloading track from enterSecureSession() to leaveSecureSession() as we already know ) accessTOC() part:titles / subpart:disc/group / mode:open getDiscTitle() accessTOC() part:titles / subpart:disc/group / mode:close accessTOC() part:data / subpart:disc/group / mode:open getTrackCount() accessTOC() part:data / subpart:disc/group / mode:open ... (several times getDiscTitle() and getTrackCount() ) => 02 18 d1 ff 01 00 00 00 88 08 01 00 00 <= 0c 18 d1 ff 01 00 00 00 88 08 01 00 00 => 02 18 d1 ff 01 00 00 00 88 08 00 80 00 <= 0c 18 d1 ff 01 00 00 00 88 08 00 80 00 => 02 18 d1 ff 01 00 00 00 88 08 00 c0 00 <= 0c 18 d1 ff 01 00 00 00 88 08 00 c0 00 stop() ... (reading track list: getTrackInfo() for length, encoding, flags and title on all tracks) ... (several times getStatus()) stop() release()