Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AT91]USB- sterownik pod Linuxa

12 Wrz 2008 02:19 2731 6
  • Poziom 9  
    Na AT91SAM7S wgrałem FreeRTOS wraz klasą komunikacyjną CDC. Pod Windowsem wszystko ładnie działa jako port wirtualny COM.
    Teraz chce napisać prosty sterownik USB, nie traktujący USB jak RS232 tylko po prostu bulk-in, bulk-out itd. Skorzystałem z gotowego kodu sterownika zawartego w jądrze- usb-skeleton.c. Linux wykrywa urządzenie i automatycznie tworzy /dev/bulk0.
    W programie udaje mi się otworzyć plik fopen, ale fread zawsze odczytuje 0 bajtów. Dlaczego?
    Czy to dobrze, że tworzony jest jeden plik? Mam go otwierać jako read-write, czytac i pisac do tego samego pliku? Nie bardzo wiem jakby to miało działać.
  • Użytkownik usunął konto  
  • Poziom 9  
    Wiem że łatwiej, ale piszę ten sterownik dla "sportu".
    Komunikaty mówią tylko tyle, że znaleziono bulk in i bulk out end point
    oraz "DSO bulk interface is now attached to 192"
    Postaram się jeszcze raz sformułować pytanie: gdzie znajdują się pliki automatycznie utworzone przez usbdevfs które reprezentują endpointy.
    Czy może te pliki nie są automatycznie tworzone i muszę to zrobić sam?
    Moja urządzenie raczej nie ma tu znaczenia, bo jestem pewien, że działa w 100% poprawnie.
  • Użytkownik usunął konto  
  • Poziom 9  
    Dzięki już sobie poradziłem, tzn. wiem co jest źle ;). Funkcja
    Code:

    static ssize_t skel_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
    {

       struct usb_skel *dev;
       int retval = 0;
       int bytes_read;

       dev = (struct usb_skel *)file->private_data;

       info("READ TRY");      

       /* do a blocking bulk read to get data from the device */
       retval = usb_bulk_msg(dev->udev,
                   usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
                   dev->bulk_in_buffer,
                   min(dev->bulk_in_size, count),
                   &bytes_read, 100000);
       
       info("RETVAL %d:",retval);   

       /* if the read was successful, copy the data to userspace */
       if (!retval) {
          if (copy_to_user(buffer, dev->bulk_in_buffer, bytes_read))
          {
             retval = -EFAULT;
             info("READ FAIL! %d",retval);
          }
          else
          {
             retval = bytes_read;
             info("READ SUCCESS! %d",retval);
          }
       }
          

       return retval;
    }

    zwraca TIMEOUT (wywolana przez fread)
    Chyba to przez to, że na AT91 mam kod klasy CDC. Jak wiadomo są tam dwa interfejsy, narazie chciałem się skupić na tym z endpointami bulk in i bulk out. Wydawało mi się, że to będzie działać. Czy może muszę jakoś zainicjować transmisję przez interrupt endpoint w drugim interfejsie, ale nie widziałem żadnych takich zależności po dokładnym przeanalizowaniu kodu na AT91.

    edit. Jeszcze to
    Cytat:
    Nie ma takich plików. Endpointy są abstrakcją protokołu komunikacji device - host USB
    a pliki abstrakcją komunikacji kernel - user. Ma to się nijak do siebie.

    No dobrze, ale przecież USB jest traktowane jako character device, więc ze swojej natury musi być powiązane z jakimś plikiem. Czy jest to plik automatycznie tworzony: /dev/dso-bulk0 jak ja przyjąłem i który próbuje odczytać? Jeśli nie, to jaki to ma być plik i ew. jak go stworzyć?
  • Użytkownik usunął konto  
  • Poziom 31  
    Ja bym zastosowal jakis sniffer USB zeby zobaczyc o co kaman. Zeby cos odczytac z endpointa trzeba cos do niego "wlozyc" wiec pytanie 1 czy wkladasz tam jakies dane na procku. USB jest traktowane jak szereg roznych plikow w zaleznosci jakiej klasy jest to urzadzenie.