The goal of this document is to provide an overview of the various parts/files
involved when libgpod interacts with a device. Ideally it will be helpful to
help application writers/distributors/... figure out what's going wrong when
trying to interact with an iPod-like device.
Please note that not all devices need all these steps (especially the
hash58/hash72 stuff and the sqlite databases), see the table at the end for
* device is plugged in
HAL/udev detects the insertion and runs a callout. This callout sends the
appropriate commands (raw SCSI/USB commands or special AFC command) to the
device to get an XML file describing the device capabilities (artwork formats
supported, serial number, ...) and dumps this XML file to
iPod_Control/Device/SysInfoExtended for future use by libgpod. libgpod doesn't
do it directly because sending these SCSI/USB commands might need elevated
* the application uses libgpod to read the device content
iPod_Control/iTunes/iTunesDB is accessed as well as a few other files. If
the device needs an hash72 (either in its iTunesDB or because it's using sqlite
databases), then the necessary information is extracted from the existing
iTunesDB to generate an iPod_Control/Device/HashInfo file (if it doesn't
exist) which will be useful to generate any hash72 we need for this device.
* the application uses libgpod to write to the device
libgpod generates an iPod_Control/iTunes/iTunesDB file. If an hash58 is needed
then the device FirewireID is used to generate it. If an hash72 is needed
then the HashInfo file is used to generate it. If the device uses sqlite
databases, they are generated as well. Post process SQL commands are then
extracted from the device (either by getting them from SysInfoExtended or by
getting them through AFC) and executed after the sqlite database generation.
These post process commands are useful to make sure the sqlite databases layout
matches what the current device firmware expects.
iTunesDB: binary file containing information about all the songs, playlists, ...
stored on the device. On recent devices (iPhoneOS 3.x, Nano 5g), it's replaced
by iTunesCDB which is a compressed version of iTunesDB.
sqlite: recent devices (iPhoneOS 3.x, Nano5g) use sqlite databases instead
of an iTunesDB to store song information, playlists, ... More accurately, they
have both an iTunesCDB (compressed iTunesDB) used by iTunes to know the device
content and sqlite databases used by the device. Along with these sqlite
databases, there's a .cbk file which contains checksum information and a hash72
for the sqlite data.
iPhoneOS: umbrella for iPhone-like devices, ie iPhones, iPod Touch and (likely)
iPad. On these devices, what matters is the firmware version, not the device
hash58: first iTunesDB hashing scheme introduced by Apple. It appeared in the
iPod Nano Video (3g) and iPod Classic and was used by iPhoneOS 1.x. It's fully
reverse-engineered and uses the iPod FirewireID (called this way even on USB
devices) as part of the calculation.
hash72: hashing scheme that was first introduced in iPhoneOS 2.x and has then
been used on the iPod Nano with a camera (5g). It was much more complicated to
reverse engineer and is not yet 100% known. However, given a file with a valid
hash72, we can extract some hashing data to be able to generate valid hash72
hashes for any file.
iPod feature matrix:
SysInfoExtended hash58 hash72 sqlite iTunesCDB
iPod 1G no no no no no
iPod 2G no no no no no
iPod 3G no no no no no
Mini 1G no no no no no
Mini 2G no no no no no
iPod 4G yes no no no no
iPod 5G yes no no no no
Nano 1G yes no no no no
Nano 2G yes no no no no
iPod Classic yes yes no no no
Nano3G yes yes no no no
Nano4G yes yes no no no
iPhoneOS 1.x yes yes no no no
iPhoneOS 2.x yes no yes no no
Nano5G yes yes yes yes yes
iPhoneOS 3.x yes no yes yes yes
 surprisingly, the Nano5G uses a hash58 for its iTunesCDB and a hash72
for its sqlite cbk file. iPhoneOS 3.x uses hash72 everywhere.