{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;\red0\green68\blue254;} \paperw11900\paperh16840\margl1440\margr1440\vieww38200\viewh18000\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \f0\b\fs36 \cf0 AndroidAccessory\ \b0\fs24 \ Le mini-projet AndroidAccessory est ma tentative d'utiliser le protocole \i Open Accessory \i0 qu'Android a introduit lors de sa version 3.1. Il a \'e9galement \'e9t\'e9 \i back-port\'e9e \i0 dans la version 2.3.4. Les d\'e9tails sur ce protocole sont disponibles dans la documentation officielle d'Android : \b \cf2 http://developer.android.com/guide/topics/usb/index.html \b0 \cf0 \ Un appareil peut se connecter \'e0 un t\'e9l\'e9phone Android en disposant de ce protocole pour se connecter comme \i Host USB \i0 et d'interagir avec le t\'e9l\'e9phone. L'appareil est alors consid\'e9r\'e9 par Android comme \'e9tant un accessoire, bien que cet appareil soit l'h\'f4te de la liaison USB \'e9tablie.\ \ Ce mini-projet tente d'impl\'e9menter les commandes pr\'e9sent\'e9es dans l'article "Initiez-vous au d\'e9veloppement d'accessoires Android 2.3.4/3.1sans kit", disponible dans le num\'e9ro 3 du magasine OpenSiliicum. Mon t\'e9l\'e9phone (un Samsung Teos = Galaxy 3 ?) est en version Android 2.2 et donc ne connait pas le protocole. Vous verrez dans le code o\'f9 s'arr\'eate la communication. Le programme a surtout \'e9t\'e9 pour moi l'occasion de m'initier \'e0 l'utilisation de la libusb. Quand j'aurai install\'e9 une version plus r\'e9cente d'Android, je continuerai le projet.\ \ \ \ \b\fs36 Compilation \b0\fs24 \ \ J'ai d\'e9velopp\'e9 le projet sous Ubuntu 11.10 et la libusb-1.0.8. Le code devrait normalement \'eatre portable sur tout autre version de Linux, probablement Unix et Mac OS X. Il devra \'eatre adapt\'e9 sous Windows pour prendre en compte la version port\'e9e de la libusb pour l'OS de Microsoft.\ \ Une fois les sources t\'e9l\'e9charg\'e9es et la libusb install\'e9e (voir tutoriel ci-dessous), vous devez \'e9ditez le fichier main.c pour renseigner le \i vendor_id \i0 et le \i product_id \i0 de votre t\'e9l\'e9phone. Il suffit ensuite d'utiliser le fichier \i Makefile \i0 , de brancher votre t\'e9l\'e9phone Android et de lancer l'ex\'e9cutable g\'e9n\'e9r\'e9. Il vous dira alors si votre t\'e9l\'e9phone (qui s'appelera \i Teos \i0 , comme le mien, d\'e9sol\'e9) est pass\'e9 ou non en mode \i Open Accessory. \i0\b\fs36 \ \fs24 \ \ \ \fs36 Utilisation de la libusb-1.0 \b0\fs24 \ \ Le site officiel de la libusb est : \b \cf2 http://www.libusb.org/ \b0 \cf0 \ \ La libusb existe en deux versions incompatibles : 0.1 et 1.0. La version 0.1 est obsol\'e8te mais encore utilis\'e9e dans de tr\'e8s nombreux projets. Il est conseill\'e9 d'utiliser la version 1.0 pour les nouveaux d\'e9veloppements : c'est ce que je fais dans ce projet AndroidAccessory.\ \ \ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \b\fs28 \cf0 Installation \b0\fs24 \ \ On peut t\'e9l\'e9charger l'archive des sources de la biblioth\'e8que \'e0 l'adresse suivante :\ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \b \cf2 http://sourceforge.net/projects/libusb/files/libusb-1.0/ \b0 \cf0 \ \ Une fois la biblioth\'e8que t\'e9l\'e9charg\'e9e, on se place dans le dossier contenant l'archive et on l'extrait avec les deux commandes :\ \i pierre@debian:~/T\'e9l\'e9chargements$ bunzip2 libusb-1.0.8.tar.bz2\ pierre@debian:~/T\'e9l\'e9chargements$ tar xvf libusb-1.0.8.tar \i0 \ \ On se place dans le dossier :\ \i pierre@debian:~/T\'e9l\'e9chargements$ cd libusb-1.0.8/ \i0 \ \ Il faut maintenant configurer les scripts d'installation :\ \i pierre@debian:~/T\'e9l\'e9chargements/libusb-1.0.8$ ./configure \i0 \ \ Il suffit ensuite de l'installer \'e0 l'aide de la commande \i make \i0 :\ \i pierre@debian:~/T\'e9l\'e9chargements/libusb-1.0.8$ sudo make install ; echo $? \i0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 Les sorties en console indiquent que la biblioth\'e8que a \'e9t\'e9 install\'e9e dans le r\'e9pertoire \i /usr/local/lib \i0 :\ \i pierre@debian:/usr/local/lib$ ls -l /usr/local/lib/libusb*\ -rw-r--r-- 1 root staff 196566 14 janv. 20:35 /usr/local/lib/libusb-1.0.a\ -rwxr-xr-x 1 root staff 955 14 janv. 20:35 /usr/local/lib/libusb-1.0.la\ lrwxrwxrwx 1 root staff 19 14 janv. 20:35 /usr/local/lib/libusb-1.0.so -> libusb-1.0.so.0.0.0\ lrwxrwxrwx 1 root staff 19 14 janv. 20:35 /usr/local/lib/libusb-1.0.so.0 -> libusb-1.0.so.0.0.0\ -rwxr-xr-x 1 root staff 151850 14 janv. 20:35 /usr/local/lib/libusb-1.0.so.0.0.0 \i0 \ \ Le fichier d'en-t\'eate n'est pas bien loin :\ \i pierre@debian:/usr/local/lib$ tree /usr/local/include\ /usr/local/include\ `-- libusb-1.0\ `-- libusb.h \i0 \ \ \ \b\fs28 Compilation d'une application utilisant la libusb-1.0 \b0\fs24 \ \ Le fichier libusb.h n'est pas dans /usr/local/include mais dans /usr/local/include/libusb-1.0, comme montrer juste avant. Il faut donc l'inclure dans le fichier source de la fa\'e7on suivante :\ \i #include <libusb-1.0/libusb.h> \i0 \ \ Voici un exemple court de fichier source :\ \i #include <stdio.h>\ #include <libusb-1.0/libusb.h>\ \ int main(void)\ \{\ libusb_context *pctx=NULL;\ int codeRetour=0;\ \ if(0!=libusb_init(&pctx))\ \{\ puts("Erreur lors de libusb_init");\ codeRetour=1;\ \}\ else\ \{\ puts("Contexte initie avec succes");\ libusb_exit(pctx);\ \}\ \ return codeRetour;\ \} \i0 \ \ On compile le fichier \'e0 l'aide de gcc en lui pr\'e9cisant en option qu'il doit utiliser la libusb-1.0 :\ pierre@debian:~/Code$ gcc main.c -lusb-1.0\ \ Ne pas passer cette option conduit \'e0 :\ \i pierre@debian:~/Code$ gcc main.c\ /tmp/ccOeoVnQ.o: In function `main':\ main.c:(.text+0x21): undefined reference to `libusb_init'\ main.c:(.text+0x53): undefined reference to `libusb_exit'\ collect2: ld returned 1 exit status \i0 \ \ \ \b\fs28 Remarques sur l'utilisation de la libusb \b0\fs24 \ \ La documentation officielle est disponible \'e0 l'adresse suivante :\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \b \cf2 http://libusb.sourceforge.net/api-1.0/index.htm \b0 \cf0 \ \ \ La libusb utilise de nombreux types opaques. Il n'est, par exemple, pas possible d'acc\'e9der aux champs de la structure libusb_device. C'est un type opaque et essayer de faire :\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \i \cf0 libusbdevice device = NULL;\ init(device);\ device->champ; \i0 \ donnera l'erreur de compilation suivante :\ \i "erreur: d\'e9r\'e9f\'e9rencement d'un pointeur de type incomplet" \i0 \ Un type opaque ne peut pas \'eatre d\'e9r\'e9f\'e9renc\'e9. Voir : \b \cf2 http://www.developpez.net/forums/d456472/c-cpp/c/debuter/dereferencement-pointeur-type-incomplet/#post2750788}