Forum: Mikrocontroller und Digitale Elektronik Bulktransfer mit libusb


von Pat R. (patrik)


Lesenswert?

Hallo Leute,
ich versuche einen bulk transfer zwischen PC(WinXP) und einem AT90USB647 
zu realisieren. Dazu habe ich mir das CDC Beispiel 
USBKEY_STK525-series6-cdc von Atmel geholt und ich versuche es mit 
libusb anzusprechen. CDC ist im Prinzip bulk transfer, daher dachte ich 
mir, dass es auch funktionieren müsste. Leider funktioniert aber nur 
usb_bulk_write, bei usb_bulk_read bekomme ich den Fehler -22.

Ich versuche einfach nur einen Byte an den uC zu schicken und diesen 
dann wieder zurück senden. Auf der uC Seite mache ich folgendes:
1
if (uart_usb_test_hit())   // Something received from the USB ?
2
{
3
4
  Usb_select_endpoint(RX_EP);
5
6
  receivedUsbData[0] = Usb_read_byte();
7
8
9
  Usb_select_endpoint(TX_EP);
10
  while(!Is_usb_write_enabled());  
11
  while(!(UEINTX &= (1<<FIFOCON)));
12
13
  Usb_write_byte(receivedUsbData[0]);
14
15
  Usb_ack_in_ready();
16
17
  rx_counter = 0; // ist nur wegen CDC hier
18
}

mit
#define TX_EP                 0x01
#define RX_EP                 0x02

RX_EP und TX_EP sind als Bulk konfiguriert und haben 64 Byte grossen 
Puffer.

Dieser Code funktioniert auch, wenn ich den Standard XP Treiber 
usbser.sys benutze und über einen com port mit dem uC kommuniziere. 
Leider aber nur mit 9600 Baudrate was mir viel zu wenig ist.

Wenn ich über libusb gehe, kann ich die Daten nur schreiben und die 
kommen auch richtig an. Ich versuche es mit folgendem Code:
1
#define EP_IN      0x01
2
#define EP_OUT     0x02
3
#define BUF_SIZE   64
4
5
usb_dev_handle *dev = NULL; /* the device handle */
6
char tmp[BUF_SIZE];
7
8
for(int i=0; i<BUF_SIZE; i++)
9
{
10
  tmp[i] = i;
11
}
12
13
tmp[0] = 17;
14
15
usb_init(); /* initialize the library */
16
usb_find_busses(); /* find all busses */
17
usb_find_devices(); /* find all connected devices */
18
19
20
if(!(dev = open_dev())) // die standard Methode aus dem bulk.c Beispiel
21
{
22
  printf("error: device not found!\n");
23
  return 0;
24
}
25
26
//SETUP_SET_CONFIGURATION
27
28
29
if(usb_set_configuration(dev, 1) < 0)
30
{
31
  printf("error: setting config 1 failed\n");
32
  usb_close(dev);
33
  return 0;
34
}
35
36
if(usb_claim_interface(dev, 0) < 0)
37
{
38
  printf("error: claiming interface 0 failed\n");
39
  usb_close(dev);
40
  return 0;
41
}
42
43
int written = usb_bulk_write(dev, EP_OUT, tmp, 1, 5000) ;
44
45
if(written != 1)
46
{
47
  printf("error: bulk write failed\n");
48
}
49
50
int readed = usb_bulk_read(dev, EP_IN, tmp, 1, 5000);
51
52
if(readed < 0)
53
{
54
  printf("error: bulk read failed\n");
55
}
56
57
58
usb_release_interface(dev, 0);
59
usb_close(dev);

Wie schon gesagt, bekomme ich beim Lesen den Fehler -22. Ich denke, das 
heisst 'Ungültiger Parameter', weiss aber nicht warum und welcher das 
ist.

Ich habe auch versucht, 64 Bytes zu schreiben und lesen, hat aber nichts 
gebracht.

Hat jemand vielleicht ne Idee was ich noch versuchen/ändern könnte? Oder 
kennt jemand ein Projekt in dem mit libusb Daten an den uC geschickt und 
gelesen werden?

Würde mich über eure Hilfe sehr freuen
Danke
Patrik

von Michael B. (mb_)


Lesenswert?

> Wie schon gesagt, bekomme ich beim Lesen den Fehler -22. Ich denke, das
> heisst 'Ungültiger Parameter',

Ja das heisst es.
Der endpoint ist falsch. Ein IN EP hat immer 0x80 gesetzt.
Also irgendwie sowas:

int readed = usb_bulk_read(dev, EP_IN | USB_ENDPOINT_IN, tmp, 1, 5000);

(PS: readed -> Gaaaaarrrrgghhhhhh :D)

von Olaf (Gast)


Lesenswert?

> int readed = usb_bulk_read(dev, EP_IN | USB_ENDPOINT_IN, tmp, 1, 5000);

> (PS: readed -> Gaaaaarrrrgghhhhhh :D)

Wenn readed vom typ int ist, dann kann es kein Zeiger auf einen struct 
auf mit der Variablen Gaaaaarrrrgghhhhhh sein!

Olaf :-)

von Pat R. (patrik)


Lesenswert?

Michael DANKE!!!!

ps: ich finde readed geil :-D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.