blob: 9e1156238c011cc1bcf5f8577114b9d0c85157db [file] [log] [blame]
Linus Walleij0dd71e92006-05-04 18:47:07 +00001Building and Installing
2-----------------------
Linus Walleij6fd2f082006-03-28 07:19:22 +00003
Linus Walleij0dd71e92006-05-04 18:47:07 +00004See the "INSTALL" file.
5
6
7Heritage
8--------
9
10libmtp is based on several ancestors:
11
12* libptp2 by Mariusz Woloszyn was the starting point used
13 by Richard A. Low for the initial starter port. You can
14 find it at http://libptp.sourceforge.net/
15
16* libgphoto2 by Mariusz Woloszyn and Marcus Meissner was
17 used at a later stage since it was (is) more actively
18 maintained. libmtp tracks the PTP implementation in
19 libgphoto2 and considers it an upstream project. We will
20 try to submit anything generally useful back to libgphoto2
21 and not make double efforts. In practice this means we
22 use ptp.c, ptp.h and ptp-pack.c verbatim from the libgphoto2
23 source code. If you need to change things in these files,
24 make sure it is so general that libgphoto2 will want to
25 merge it to their codebase too. You find libgphoto2 as part
26 of gPhoto: http://gphoto.sourceforge.net/
27
28* libnjb was a project that Richard and Linus were working
Linus Walleijfcf88912006-06-05 13:23:33 +000029 on before libmtp. When Linus took Richards initial port
Linus Walleij0dd71e92006-05-04 18:47:07 +000030 and made an generic C API he re-used the philosophy and
31 much code from libnjb. Many of the sample programs are for
32 example taken quite literally from libnjb. You find it here:
33 http://libnjb.sourceforge.net/
34
35
36Compiling programs for libmtp
37-----------------------------
38
39libmtp has support for the pkg-config script by adding a libmtp.pc
40entry in $(prefix)/lib/pkgconfig. To compile a libmtp program,
41"just" write:
42
43gcc -o foo `pkg-config --cflags --libs libmtp` foo.c
44
45This also simplifies compilation using autoconf and pkg-config: just
46write e.g.
47
48PKG_CHECK_MODULES(MTP, libmtp)
49AC_SUBST(MTP_CFLAGS)
50AC_SUBST(MTP_LIBS)
51
52To have libmtp LIBS and CFLAGS defined. Needless to say, this will
53only work if you have pkgconfig installed on your system, but most
54people have nowadays.
55
56If your library is installed in e.g. /usr/local you may have to tell
57this to pkgconfig by setting the PKG_CONFIG_PATH thus:
58
59export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
60
61
62Documentation
63-------------
64
65Read the API documentation that can be generated with doxygen.
66It will be output in doc/html if you have Doxygen properly
67installed. (It will not be created unless you have Doxygen!)
68
69For information about the Media Transfer Protocol, see:
70http://en.wikipedia.org/wiki/Media_Transfer_Protocol
71
72
73Contributing
74------------
75
76See the project page at http://libmtp.sourceforge.net/
Linus Walleijee73ef22006-08-27 19:56:00 +000077We always need your help. There is a mailinglist and a
78bug report system there.
Linus Walleij6fd2f082006-03-28 07:19:22 +000079
Linus Walleija1b66f22007-05-10 20:02:16 +000080
81New Devices
82-----------
83
Linus Walleijfcf88912006-06-05 13:23:33 +000084If you happen upon a device which libmtp claims it cannot
85autodetect, please submit the vendor ID and device ID
Linus Walleij9ee29402007-10-31 20:24:48 +000086(these can be obtained from the "lsusb" and "lsusb -n"
87commands run as root) as a bug, patch or feature request
88on the Sourceforge bug tracker at our homepage. If it
89gives a sensible output from "mtp-detect" then please attach
90the result as well as it teach us some stuff about your
91device. If you've done some additional hacking, join our
92mailinglist and post your experiences there.
Linus Walleijda558be2007-03-10 21:42:25 +000093
Linus Walleija1b66f22007-05-10 20:02:16 +000094If you want to be able to hack some more and you're not
95afraid of C hacking, add an entry for your device's
96vendor/product ID and a descriptive string to the database
97in the file src/libusb-glue.c. It is close to the top of the
98file.
99
100If you want to poke around to see if your device has some
101special pecularities, you can test some special device
102flags (defined in src/libusb-glue.h) by inserting them
103together with your device entry in src/libusb-glue.c.
104Flags can be tested in isolation or catenated with "|"
105(binary OR). If relatives to your device use a certain
106flag, chances are high that a new device will need it
107too, typically from the same manufacturer.
108
109The most common flag that needs to be set is the
110DEVICE_FLAG_UNLOAD_DRIVER that detach any Linux kernel
111drivers that may have attached to the device making
Linus Walleij94f23d52007-08-04 19:37:28 +0000112MTP access impossible. This is however not expected to
113really work: this is a problem being tracked as of
114now (2007-08-04). See the "last resort" solutions below
115if you really need to get your dual-mode device to work
116with MTP.
Linus Walleija1b66f22007-05-10 20:02:16 +0000117
Linus Walleij91fb0282007-09-03 21:16:08 +0000118If you are a device vendor, please consider assigning one
119of your employees as a contact person for libmtp, have them
120sign up to the libmtp development list and answer questions
121and post new device ID:s as they are released to our
122mailing list. By the way: do you have spare devices you
123can give us? Send them to Richard (Mac support) or Linus
124(Linux support). (So far nobody did that except for Microsoft
125who sent us a Zune by proxy!)
126
Linus Walleija1b66f22007-05-10 20:02:16 +0000127If your device is very problematic we are curious of how it
Linus Walleijda558be2007-03-10 21:42:25 +0000128works under Windows, so we enjoy reading USB packet sniffs
129that reveal the low-level traffic carried out between
130Windows Media Player and your device. This can be done
Linus Walleij61c25682007-09-04 14:46:21 +0000131using e.g.:
132
133* USBsnoop:
134 http://benoit.papillault.free.fr/usbsnoop/
135
136* The trial version of HHD Softwares software-only
137 USB monitor. You need to get a copy of version 2.37 since
138 the newer trial versions won't let you carry out the
139 needed packet sniffs. (As of 2007-03-10 a copy can be found
140 at: http://www.cobbleware.com/files/usb-monitor-237.exe)
141
Linus Walleijda558be2007-03-10 21:42:25 +0000142There are other USB monitors as well, some more expensive
143alternatives use hardware and even measure electronic
144characteristics of the traffic (which is far too much
145detail for us).
146
Linus Walleij91fb0282007-09-03 21:16:08 +0000147Device sniffs are an easy read since the PTP/MTP protocol
148is nicely structured. All commands will have a structure such
149as this in the log, we examplify with a object list request:
150
151PTP REQEUST:
152000120: Bulk or Interrupt Transfer (UP), 03.09.2007 12:49:25.9843750 +0.0
153Pipe Handle: 0x863ce234 (Endpoint Address: 0x2)
154Send 0x20 bytes to the device:
155 20 00 00 00 01 00 05 98 23 00 00 00 27 03 00 10 ......?#...'...
156 Length TYPE CMD Trans# Param1
157
158 00 00 00 00 02 DC 00 00 00 00 00 00 00 00 00 00 .....Ü..........
159 Param2 Param3 Param4 Param5
160
161[OPTIONAL] DATA PHASE:
162000121: Bulk or Interrupt Transfer (UP), 03.09.2007 12:49:26.0 +0.0156250
163Pipe Handle: 0x863ce214 (Endpoint Address: 0x81)
164Get 0x1a bytes from the device:
165 1A 00 00 00 02 00 05 98 23 00 00 00 01 00 00 00 .......?#.......
166 Length TYPE CMD Trans# DATA
167
168 27 03 00 10 02 DC 04 00 00 30 '....Ü...0
169
170RESPONSE:
171000122: Bulk or Interrupt Transfer (UP), 03.09.2007 12:49:26.0 +0.0
172Pipe Handle: 0x863ce214 (Endpoint Address: 0x81)
173Get 0xc bytes from the device:
174 0C 00 00 00 03 00 01 20 23 00 00 00 ....... #...
175 Length TYPE CODE Trans#
176
177* One send (OUT to the device), two reads (IN from the device).
178
179* All three byte chunks commands are
180 sent/recieved/recieeved by the function ptp_transaction()
181 in the file ptp.c.
182
183* It boils down to ptp_usb_sendreq(), optionally ptp_usb_senddata()
184 or ptp_usb_getdata() and finally ptp_usb_getresp() in the file
185 libusb-glue.c. Notice ptp_usb_sendreq() and ptp_usb_getresp()
186 are ALWAYS called. The TYPE field correspond to this, so the
187 TYPES in this case are "COMMAND" (0x0001), "DATA" (0x0002),
188 and "RESPONSE" (0x0003).
189
190* Notice that the byte order is little endian, so you need to read
191 each field from right to left.
192
193* This COMMAND has:
194 CMD 0x99805, we see in ptp.h that this is PTP_OC_MTP_GetObjPropList.
195 Transaction# 0x00000023.
196 REQUEST parameters 0x10000327, 0x00000000, 0x0000DC02, 0x00000000
197 0x00000000, in this case it means "get props for object 0x10000327",
198 "any format", "property 0xDC02" (PTP_OPC_ObjectFormat), then two
199 parameters that are always zero (no idea what they mean or their
200 use).
201
202* The DATA has:
203 CMD 0x99805, we see in ptp.h that this is PTP_OC_MTP_GetObjPropList.
204 Transaction# 0x00000023.
205 Then comes data 0x00000001, 0x10000327, 0xDC02, 0x0004, 0x3000
206 Which means in this case, (and this is the tricky part) "here
207 you have 1 property", "for object 0x10000327", "it is property
208 0xDC02" (PTP_OPC_ObjectFormat), "which is of type 0x0004"
209 (PTP_DTC_UINT16), "and set to 0x3000" (PTP_OFC_Undefined, it
210 is perfectly valid to have undefined object formats, since it
211 is a legal value defining this).
212
213* This RESPONSE has:
214 CMD 0x99805, we see in ptp.h that this is PTP_OC_MTP_GetObjPropList.
215 Return Code ("RC") = 0x2001, PTP_RC_OK, all went fine.
216 Transaction# 0x00000023.
Linus Walleijfcf88912006-06-05 13:23:33 +0000217
Linus Walleijd05fce62007-09-29 20:17:23 +0000218If you want to compare the Windows behaviour with a similar
219operation using libmtp you can go into the libusb-glue.c file
220and uncomment the row that reads:
221
222//#define ENABLE_USB_BULK_DEBUG
223
224(I.e. remove the two //.)
225
226This will make libmtp print out a hex dump of every bulk USB
227transaction. The bulk transactions contain all the PTP/MTP layer
228data, which is usually where the problems appear.
229
Linus Walleij6fd2f082006-03-28 07:19:22 +0000230
Linus Walleijbd7624c2007-05-28 10:48:54 +0000231Devices does not work - last resort:
232------------------------------------
233
234Some devices that are dual-mode are simply impossible to get
235to work under Linux because the usb-storage(.ko) kernel
236module hook them first, and refuse to release them, even
Linus Walleij94f23d52007-08-04 19:37:28 +0000237when we specify the DEVICE_FLAG_UNLOAD_DRIVER flag. (Maybe
238it DOES release it but the device will immediately be probed
239at the USB mass storage interface AGAIN because it
240enumerates.)
Linus Walleijbd7624c2007-05-28 10:48:54 +0000241
Linus Walleij584eb8d2007-09-05 19:51:27 +0000242Try this, if you have a recent 2.6.x Linux kernel,
243run (as root) something like:
244
245> rmmod usb_storage ; mtp-detect
246
247You can run most any command or a client like gnomad2 or
248Amarok immediately after the rmmod command. This works
249sometimes. Another way:
Linus Walleijbd7624c2007-05-28 10:48:54 +0000250
Linus Walleij94f23d52007-08-04 19:37:28 +0000251* Edit /etc/modprobe.d/blacklist
Linus Walleijbd7624c2007-05-28 10:48:54 +0000252
253* Add the line "blacklist usb-storage"
254
255* Reboot.
256
257Now none of you USB disks, flash memory sticks etc will be
258working (you just disabled them all). However you *can* try
259your device, and it might have started working because there
260is no longer a USB mass storage driver that tries to hook onto
261the mass storage interface of your device.
262
Linus Walleij94f23d52007-08-04 19:37:28 +0000263If not even blacklisting works (check with
264"lsmod | grep usb-storage"), there is some problem with
265something else and you may need to remove or rename the file
266/lib/modules/<VERSION>/kernel/drivers/usb/storage/usb-storage.ko
267manually.
268
Linus Walleijbd7624c2007-05-28 10:48:54 +0000269If you find the PerfectSolution(TM) to this dilemma, so you
270can properly switch for individual devices whether to use it
271as USB mass storage or not, please tell us how you did it. We
272know we cannot use udev, because udev is called after-the-fact:
273the device is already configured for USB mass storage when
274udev is called.
275
276
Linus Walleij15def332006-09-19 14:27:02 +0000277Calendar and contact support:
278-----------------------------
Linus Walleijd3bdf762006-02-20 22:21:56 +0000279
Linus Walleij3c16fe42006-04-30 07:53:41 +0000280The Creative Zen series can read VCALENDAR2 (.ics) files
Linus Walleij15def332006-09-19 14:27:02 +0000281and VCard (.vcf) files from programs like for example
282Evolution with the following limitations/conditions:
Linus Walleijd3bdf762006-02-20 22:21:56 +0000283
Linus Walleij3c16fe42006-04-30 07:53:41 +0000284- The file must be in DOS (CR/LF) format, use the unix2dos
285 program to convert if needed
Linus Walleij15def332006-09-19 14:27:02 +0000286
287- Repeat events in calendar files do not seem to be supported,
288 entries will only appear once.
289
290- Calendar (.ics) files should be stored in the folder "My Organizer"
291 when sent to the device (this directory should be autodetected
Linus Walleij80b2c722006-06-22 17:57:17 +0000292 for use with calendar files, otherwise use the option
Linus Walleij15def332006-09-19 14:27:02 +0000293 -f "My Organizer" to sendfile for this) Apparently this file can
294 also contain tasklists.
295
296- Contact (.vcf) files should be stored in the folder "My Contacts"
297 when sent to the device. (-f "My Contacts")
298
299- Some devices are picky about the name of the calendar and
300 contact files. For example the Zen Microphoto wants:
301
Linus Walleijb1318d12006-09-25 14:59:26 +0000302 Calendar: My Organizer/6651416.ics
303 Contacts: My Organizer/6651416.vcf
304
305
306Syncing in with Evolution and Creative Devices
307----------------------------------------------
308
309Evolution can easily export .ics an .vcf files, but you currently
310need some command-line hacking to get you stuff copied over in
311one direction host -> device. The examples/ directory contains a script
312created for the Creative Zen Microphoto by Nicolas Tetreault.
313
Linus Walleij6e8cef42006-12-03 20:45:04 +0000314
315It's Not Our Bug!
316-----------------
317
318Some MTP devices have strange pecularities. We try to work around
319these whenever we can, sometimes we cannot work around it or we
320cannot test your solution.
321
322* The Zen Vision:M (possibly more Creative Zens) has a firmware bug
323 that makes it drop the last two characters off a playlist name.
324 It is fixed in later firmware.
325
Linus Walleijc41f2e82007-03-12 22:26:00 +0000326* For Creative Technology devices, there are hard limits on how
327 many files can be put onto the device. For a 30 GiB device (like
328 the Zen Xtra) the limit is 6000, for a 60 GiB device the limit
329 is 15000 files. For further Creative pecularities, see the
330 FAQ sections at www.nomadness.net.
331
Linus Walleijd24a7ab2007-03-07 21:48:43 +0000332* Sandisk sansa c150 and probably several other Sandisk devices
333 (and possibly devices from other manufacturers) have a dual
334 mode with MTP and USB mass storage. The device will initially
335 claim to be mass storage so udev will capture is and make the
Linus Walleijda558be2007-03-10 21:42:25 +0000336 use of MTP mode impossible. One way of avoiding it could be to
Linus Walleijd24a7ab2007-03-07 21:48:43 +0000337 be to blacklist the "usb-storage" module in
338 /etc/modprobe.c/blacklist with a row like this:
Linus Walleijda558be2007-03-10 21:42:25 +0000339 "blacklist usb-storage". Some have even removed the
340 "usb-storage.ko" (kernel module file) to avoid loading.
Linus Walleijd24a7ab2007-03-07 21:48:43 +0000341
Linus Walleijda558be2007-03-10 21:42:25 +0000342* The iriver devices (possibly all of them) cannot handle the
Linus Walleij6e8cef42006-12-03 20:45:04 +0000343 enhanced GetObjectPropList MTP command (0x9805) properly. So
344 they have been banned from using it.
345
Linus Walleijda558be2007-03-10 21:42:25 +0000346* iriver devices have problems with older versions of libmtp and
Linus Walleij82265222007-03-04 19:47:08 +0000347 with new devices libmtp does not know of as of yet, since it
348 has an oldstyle USB device controller that cannot handle zero
Linus Walleijda558be2007-03-10 21:42:25 +0000349 writes. (Register your device with us!) All their devices are
350 likely to need a special device flag in the src/libusb-glue.c
351 database.
Linus Walleij82265222007-03-04 19:47:08 +0000352
Linus Walleij6e8cef42006-12-03 20:45:04 +0000353* The Samsung Yepp T9 has several strange characteristics, some
354 that we've managed to work around. (For example it will return
355 multiple PTP packages in a single transaction.)
356
Linus Walleijf2711b32007-02-26 20:18:40 +0000357* The early firmware for Philips HDD players is known to be
358 problematic. Please upgrade to as new firmware as you can get.
359 (Yes this requires some kind of Windows Installation I think.)
360
Linus Walleij9340aac2007-10-01 10:02:05 +0000361* Some devices that implement GetObjectPropList (0x9805) will
362 not return the entire object list if you request a list for object
363 0xffffffffu. (But they should.) So they may need the special
364 DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL.
365
366* Some (smaller) subset of devices cannot even get all the
367 properties for a single object in one go, these need the
368 DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST. Currently only the
369 iriver devices seem to have this bug.
370
371* The Toshiba Gigabeat S (and probably its sibling the
372 Microsoft Zune and other Toshiba devices) will only display
373 album information tags for a song in case there is also
374 an abstract album (created with the album interface) with
375 the exact same name.
Linus Walleijd132d8e2007-04-03 23:24:54 +0000376
377
378Lost symbols
379------------
380
381Shared libraries can be troublesome to users not experienced with
382them. The following is a condensed version of a generic question
383that has appeared on the libmtp mailing list from time to time.
384
385> PTP: Opening session
386> Queried Creative Zen Vision:M
387> gnomad2: relocation error: gnomad2: undefined symbol:
388> LIBMTP_Get_Storageinfo
389> (...)
390> Are these type of errors related to libmtp or something else?
391
392The problem is of a generic nature, and related to dynamic library
393loading. It is colloquially known as "dependency hell".
394(http://en.wikipedia.org/wiki/Dependency_hell)
395
396The gnomad2 application calls upon the dynamic linker in Linux to
397resolve the symbol "LIBMTP_Get_Storageinfo" or any other symbol
398(ELF symbol, or link point or whatever you want to call them, a
399symbol is a label on a memory address that the linker shall
400resolve from label to actual address.)
401For generic information on this subject see the INSTALL file and
402this Wikipedia page:
403
404http://en.wikipedia.org/wiki/Library_(computing)
405
406When Linux /lib/ld-linux.so.X is called to link the symbols compiled
407into gnomad2 (or any other executable using libmtp), it examines the
408ELF file for the libmtp.so.X file it finds first and cannot resolve
409the symbol "LIBMTP_Get_Storageinfo" (or whichever symbol you have a
410problem witj) from it, since it's probably not there. There are many
411possible causes of this symbol breakage:
412
4131) You installed precompiled libmtp and gnomad2 packages (RPMs, debs
414 whatever) that do not match up. Typical cause: your gnomad2 package was
415 built against a newer version of libmtp than what's installed on your
416 machine. Another typical cause: you installed a package you found on
417 the web, somewhere, the dependency resolution system did not protest
418 properly (as it should) or you forced it to install anyway, ignoring
419 some warnings.
420
4212) You compiled libmtp and/or gnomad2 from source, installing both or
422 either in /usr/local/lib and /usr/local/bin. This means at compile-time
423 gnomad2 finds the libmtp library in /usr/local/lib but at runtime, it
424 depends on the Linux system wide library loader (/lib/ld-linux.so.X) in
425 order to resolve the symbols. This loader will look into the file
426 /etc/ld.so.conf and/or the folder /etc/ld.so.conf.d in order to find
427 paths to libraries to be used for resolving the symbols. If you have
428 some older version of libmtp in e.g. /usr/lib (typically installed by a
429 package manager) it will take precedence over the new version you just
430 installed in /usr/local/lib and the newly compiled library in
431 /usr/local/lib will *not* be used, resulting in this error message.
432
4333) You really did install the very latest versions (as of writing libmtp
434 0.1.5 and gnomad2 2.8.11) from source and there really is no
435 pre-installed package of either on your machine. In that case I'm
436 totally lost, I have no idea what's causing this.
437
438Typical remedies:
439
4401) If you don't want to mess around with your system and risk these
441 situations, only use pre-packaged software that came with the
442 distribution or its official support channels. If it still breaks,
443 blame your distribution, they're not packaging correctly. Relying on
444 properly packaged software and not installing things yourself *is* the
445 Linux solution to the "dependency hell" problem.
446
4472) Read about dynamically linked library handling until the stuff I wrote
448 about in the previous list sounds like music to your ears, inspect
449 your /lib, /usr/lib, /usr/local/lib, /etc/ld.so.conf and the
450 /etc/ld.so.conf.d, remove all pre-packed versions using RPM, APT,
451 YaST or whatever your distribution uses, compile libmtp and gnomad2
452 (or whatever) from source only and you will be enlighted.
453
454I don't know if this helps you, it's the best answer we can give.