This source code shows a little driver i wrote for the at90usb128-demo-template example from Atmel corporation.
I tested it using the usbkey board and everything was fine.
I hope this helps.
/Archivos de cabecera/
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
/Prototipos para POSIX Threads/
#include <pthread.h>
/Prototipos para libusbdiS.a/
#include <sys/usbdi.h>
/Códigos de error/
#include <errno.h>
/Código del vendor Nokia/
#define USB_VENDOR_NOKIA 0x0421
/Código del producto 5310/
#define USB_PRODUCT_NOKIA_5310 0x006b
/Código del vendor Atmel/
#define USB_VENDOR_ATMEL 0x03eb
/Código del producto AVR USB DEVICE/
#define USB_PRODUCT_AVR_USB_DEVICE 0x0000
/Definir con el fabricante y dispositivo especÃfico respectivamente/
#define USB_VENDOR USB_VENDOR_ATMEL
#define USB_PRODUCT USB_PRODUCT_AVR_USB_DEVICE
/Manejador del dispositivo/
struct usbd_device *device;
/Punteros a URBs IN y OUT respectivamente para las transferencias bulk/
struct usbd_urb *urb1,*urb2;
/Punteros a la tuberÃas IN y OUT respectivamente/
struct usbd_pipe *pipe_in,*pipe_out;
/Puntero a los datos/
char *data;
/Mutex para el flag que sincroniza el principal con el hilo de ejecución usb/
pthread_mutex_t mutex;
/Flag que sincroniza el principal con el hilo de ejecución usb/
char isConnected=0;
/*Callback que se ejecuta cuando se ha conectado el dispositivo */
void insertion(struct usbd_connection *connection, usbd_device_instance_t *instance){
/*Vector en el cual se almacenarán los descriptores*/
char descriptor[200];
/*Condiciones de error de las funciones*/
int status;
/*Ã