Device Information

From iPodLinux

Revision as of 04:08, 19 September 2006 by Jonrelay (Talk | contribs)
(diff) ← Older revision | Current revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Newer (4th gen+) iPods expose data about themselves available through a SCSI INQUIRY command. The 0xC0 page code contains a list page codes for each chunk of the data.

sg_inq -p=0xc0 /dev/sda
VPD INQUIRY, page code=0xc0:
 00     00 c0 00 27 c2 c3 c4 c5  c6 c7 c8 c9 ca cb cc cd    ...'............
 10     ce cf d0 d1 d2 d3 d4 d5  d6 d7 d8 d9 da db dc dd    ................
 20     de df e0 e1 e2 e3 e4 e5  e6 e7 e8                   ...........

The 2nd byte is just the page code you requested, and the 4th byte is the length of the payload. According to the above, the device data starts at page code 0xC2 and ends at 0xE8. You can request each chunk the same way as we did above:

sg_inq -p=0xc2 /dev/sda
VPD INQUIRY, page code=0xc2:
 00     00 c2 00 f8 3c 3f 78 6d  6c 20 76 65 72 73 69 6f    ....<?xml versio
 10     6e 3d 22 31 2e 30 22 20  65 6e 63 6f 64 69 6e 67    n="1.0" encoding
 20     3d 22 55 54 46 2d 38 22  3f 3e 0a 3c 21 44 4f 43    ="UTF-8"?>.<!DOC
 30     54 59 50 45 20 70 6c 69  73 74 20 50 55 42 4c 49    TYPE plist PUBLI
 40     43 20 22 2d 2f 2f 41 70  70 6c 65 20 43 6f 6d 70    C "-//Apple Comp
 50     75 74 65 72 2f 2f 44 54  44 20 50 4c 49 53 54 20    uter//DTD PLIST
 60     31 2e 30 2f 2f 45 4e 22  20 22 68 74 74 70 3a 2f    1.0//EN" "http:/
 70     2f 77 77 77 2e 61 70 70  6c 65 2e 63 6f 6d 2f 44    /www.apple.com/D
 80     54 44 73 2f 50 72 6f 70  65 72 74 79 4c 69 73 74    TDs/PropertyList
 90     2d 31 2e 30 2e 64 74 64  22 3e 0a 3c 70 6c 69 73    -1.0.dtd">.<plis
 a0     74 20 76 65 72 73 69 6f  6e 3d 22 31 2e 30 22 3e    t version="1.0">
 b0     0a 3c 64 69 63 74 3e 0a  3c 6b 65 79 3e 41 70 70    .<dict>.<key>App
 c0     6c 65 44 52 4d 56 65 72  73 69 6f 6e 3c 2f 6b 65    leDRMVersion</ke
 d0     79 3e 0a 3c 64 69 63 74  3e 0a 3c 6b 65 79 3e 4d    y>.<dict>.<key>M
 e0     69 6e 69 6d 75 6d 3c 2f  6b 65 79 3e 0a 3c 69 6e    inimum</key>.<in
 f0     74 65 67 65 72 3e 30 3c  2f 69 6e 74                teger>0</int

As you can see, the data is an xml document. It contains nice things like the serial number and supported audio/photo/video formats. An example of a complete doc from a video iPod is below:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>AppleDRMVersion</key>
    <dict>
      <key>Minimum</key>
      <integer>0</integer>
      <key>Maximum</key>
      <integer>4</integer>
      <key>Format</key>
      <integer>2</integer>
    </dict>
    <key>AudioCodecs</key>
    <dict>
      <key>AIFF</key>
      <dict>
        <key>Mono</key>
        <true/>
        <key>Stereo</key>
        <true/>
        <key>Multichannel</key>
        <false/>
        <key>MaximumSampleRate</key>
        <integer>48000</integer>
        <key>MaximumBitDepth</key>
        <integer>16</integer>
      </dict>
      <key>MP3</key>
      <dict>
        <key>Mono</key>
        <true/>
        <key>Stereo</key>
        <true/>
        <key>MaximumSampleRate</key>
        <integer>48000</integer>
        <key>MaximumDataRate</key>
        <integer>320</integer>
      </dict>
      <key>WAV</key>
      <dict>
        <key>Mono</key>
        <true/>
        <key>Stereo</key>
        <true/>
        <key>Multichannel</key>
        <false/>
        <key>MaximumSampleRate</key>
        <integer>48000</integer>
        <key>MaximumBitDepth</key>
        <integer>16</integer>
      </dict>
      <key>AAC</key>
      <dict>
        <key>AppleDRM</key>
        <true/>
        <key>MaximumSampleRate</key>
        <integer>48000</integer>
        <key>LC</key>
        <dict>
          <key>VariableBitRate</key>
          <true/>
          <key>PerceptualNoiseSubsitution</key>
          <true/>
        </dict>
      </dict>
      <key>AppleLossless</key>
      <dict>
        <key>Mono</key>
        <true/>
        <key>Stereo</key>
        <true/>
        <key>Multichannel</key>
        <false/>
        <key>MaximumBitDepth</key>
        <integer>32</integer>
        <key>MaximumBitDepthUntruncated</key>
        <integer>16</integer>
        <key>MaximumSampleRate</key>
        <integer>48000</integer>
        <key>AppleDRM</key>
        <true/>
      </dict>
      <key>Audible</key>
      <dict>
        <key>Type1</key>
        <false/>
        <key>Type2</key>
        <true/>
        <key>Type3</key>
        <true/>
        <key>Type4</key>
        <true/>
      </dict>
    </dict>
    <key>BuildID</key>
    <string>6.1.2</string>
    <key>ConnectedBus</key>
    <string>USB</string>
    <key>MaxTransferSpeed</key>
    <integer>61440</integer>
    <key>FamilyID</key>
    <integer>6</integer>
    <key>FireWireGUID</key>
    <string>000A2700157501F8</string>
    <key>FireWireVersion</key>
    <string>1.62</string>
    <key>ImageSpecifications</key>
    <array>
      <key>1019</key>
      <dict>
        <key>FormatId</key>
        <integer>1019</integer>
        <key>DisplayWidth</key>
        <integer>720</integer>
        <key>RenderWidth</key>
        <integer>640</integer>
        <key>RenderHeight</key>
        <integer>480</integer>
        <key>PixelFormat</key>
        <string>32767579</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>1</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <false/>
      </dict>
      <key>1015</key>
      <dict>
        <key>FormatId</key>
        <integer>1015</integer>
        <key>RenderWidth</key>
        <integer>130</integer>
        <key>RenderHeight</key>
        <integer>88</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <true/>
        <key>BackColor</key>
        <string>00000000</string>
      </dict>
      <key>1024</key>
      <dict>
        <key>FormatId</key>
        <integer>1024</integer>
        <key>RenderWidth</key>
        <integer>320</integer>
        <key>RenderHeight</key>
        <integer>240</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <true/>
        <key>Rotation</key>
        <integer>0</integer>
      </dict>
      <key>1036</key>
      <dict>
        <key>FormatId</key>
        <integer>1036</integer>
        <key>RenderWidth</key>
        <integer>50</integer>
        <key>RenderHeight</key>
        <integer>41</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <true/>
        <key>AlignRowBytes</key>
        <true/>
        <key>BackColor</key>
        <string>00000000</string>
      </dict>
    </array>
    <key>AlbumArt</key>
    <array>
      <key>1028</key>
      <dict>
        <key>FormatId</key>
        <integer>1028</integer>
        <key>RenderWidth</key>
        <integer>100</integer>
        <key>RenderHeight</key>
        <integer>100</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <true/>
        <key>BackColor</key>
        <string>FFFFFFFF</string>
      </dict>
      <key>1029</key>
      <dict>
        <key>FormatId</key>
        <integer>1029</integer>
        <key>RenderWidth</key>
        <integer>200</integer>
        <key>RenderHeight</key>
        <integer>200</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <true/>
        <key>BackColor</key>
        <string>FFFFFFFF</string>
      </dict>
    </array>
    <key>PodcastsSupported</key>
    <true/>
    <key>ChapterImageSpecs</key>
    <array>
      <key>1028</key>
      <dict>
        <key>FormatId</key>
        <integer>1028</integer>
        <key>RenderWidth</key>
        <integer>100</integer>
        <key>RenderHeight</key>
        <integer>100</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <true/>
        <key>BackColor</key>
        <string>FFFFFFFF</string>
      </dict>
      <key>1029</key>
      <dict>
        <key>FormatId</key>
        <integer>1029</integer>
        <key>RenderWidth</key>
        <integer>200</integer>
        <key>RenderHeight</key>
        <integer>200</integer>
        <key>PixelFormat</key>
        <string>4C353635</string>
        <key>Interlaced</key>
        <false/>
        <key>ColorAdjustment</key>
        <integer>0</integer>
        <key>GammaAdjustment</key>
        <real>2.2</real>
        <key>Crop</key>
        <false/>
        <key>AlignRowBytes</key>
        <true/>
        <key>BackColor</key>
        <string>FFFFFFFF</string>
      </dict>
    </array>
    <key>MinITunesVersion</key>
    <string>6.0</string>
    <key>SerialNumber</key>
    <string>XXXXXXXXXXX</string>
    <key>UpdaterFamilyID</key>
    <integer>13</integer>
    <key>VisibleBuildID</key>
    <string>1.1.2</string>
    <key>64Bit</key>
    <integer>3</integer>
    <key>OEMID</key>
    <integer>0</integer>
    <key>OEMV</key>
    <integer>8</integer>
    <key>PowerInformation</key>
    <dict>
      <key>WillFlash</key>
      <true/>
      <key>USB</key>
      <true/>
      <key>FireWire</key>
      <false/>
    </dict>
    <key>VoiceMemosSupported</key>
    <true/>
    <key>VoiceMemoFormats</key>
    <dict>
      <key>WAV</key>
      <dict>
        <key>MaximumSampleRate</key>
        <integer>44100</integer>
      </dict>
    </dict>
    <key>AutoRebootAfterFirmwareUpdate</key>
    <true/>
    <key>VolumeFormat</key>
    <string>FAT32</string>
    <key>VolumeInformation</key>
    <dict>
      <key>HFSPLUS</key>
      <dict>
        <key>SupportedFormat</key>
        <true/>
        <key>ConversionSupported</key>
        <true/>
        <key>CurrentFormat</key>
        <false/>
      </dict>
      <key>FAT32</key>
      <dict>
        <key>SupportedFormat</key>
        <true/>
        <key>ConversionSupported</key>
        <false/>
        <key>CurrentFormat</key>
        <true/>
      </dict>
    </dict>
    <key>ForcedDiskMode</key>
    <false/>
    <key>BangFolder</key>
    <false/>
    <key>CorruptDataPartition</key>
    <false/>
    <key>CorruptFirmwarePartition</key>
    <false/>
    <key>CanFlashBacklight</key>
    <true/>
    <key>CanHibernate</key>
    <true/>
    <key>RAM</key>
    <integer>32</integer>
    <key>HotPlugState</key>
    <integer>0</integer>
    <key>vCardWithJPEGSupported</key>
    <true/>
    <key>VideoCodecs</key>
    <dict>
      <key>H.264</key>
      <dict>
        <key>AppleVideoDRM</key>
        <dict>
          <key>MaximumEncryptionPercentage</key>
          <real>12.5</real>
        </dict>
        <key>AAC</key>
        <dict>
          <key>AppleDRM</key>
          <true/>
          <key>MaximumSampleRate</key>
          <integer>48000</integer>
          <key>MaximumBitRate</key>
          <integer>160</integer>
          <key>LC</key>
          <dict>
            <key>VariableBitRate</key>
            <true/>
            <key>Multichannel</key>
            <false/>
          </dict>
        </dict>
        <key>Profile</key>
        <string>B</string>
        <key>Level</key>
        <integer>13</integer>
        <key>MaximumPeakBitRate</key>
        <integer>768</integer>
        <key>MaximumResolution</key>
        <integer>76800</integer>
        <key>MinimumWidth</key>
        <integer>16</integer>
        <key>MinimumHeight</key>
        <integer>16</integer>
        <key>MaximumWidth</key>
        <integer>4800</integer>
        <key>MaximumHeight</key>
        <integer>4800</integer>
      </dict>
      <key>MPEG4</key>
      <dict>
        <key>AppleVideoDRM</key>
        <dict>
          <key>MaximumEncryptionPercentage</key>
          <real>12.5</real>
        </dict>
        <key>AAC</key>
        <dict>
          <key>AppleDRM</key>
          <true/>
          <key>MaximumSampleRate</key>
          <integer>48000</integer>
          <key>MaximumBitRate</key>
          <integer>160</integer>
          <key>LC</key>
          <dict>
            <key>VariableBitRate</key>
            <true/>
            <key>Multichannel</key>
            <false/>
          </dict>
        </dict>
        <key>Profile-Level-ID</key>
        <integer>3</integer>
        <key>MaximumAverageBitRate</key>
        <integer>2500</integer>
        <key>MaximumPeakBitRate</key>
        <integer>0</integer>
        <key>MaximumBufferSize</key>
        <integer>0</integer>
        <key>MaximumResolution</key>
        <integer>230400</integer>
        <key>MinimumWidth</key>
        <integer>16</integer>
        <key>MinimumHeight</key>
        <integer>16</integer>
        <key>MaximumWidth</key>
        <integer>14400</integer>
        <key>MaximumHeight</key>
        <integer>14400</integer>
      </dict>
    </dict>
  </dict>
</plist>