Στο Bootlin, αναπτύξαμε πρόσφατα από την αρχή ένα νέο πρόγραμμα οδήγησης Linux για το Ελεγκτής συσκευής USB που βρέθηκαν στο Επεξεργαστής Renesas RZ/N1. Αυτό το πρόγραμμα οδήγησης είναι ήδη αποδεκτό ανάντη, είναι αυτήν τη στιγμή ορατό στο linux-next και ελπίζουμε να είναι μέρος της επερχόμενης έκδοσης Linux 6.3.
Ως μέρος της ανάπτυξης αυτού του προγράμματος οδήγησης, έπρεπε φυσικά να το… δοκιμάσουμε! Για να δοκιμάσετε ένα πρόγραμμα οδήγησης USB Device Controller, η προφανής ιδέα που σας έρχεται στο μυαλό είναι να χρησιμοποιήσετε τα διαθέσιμα προγράμματα οδήγησης gadget USB στον πυρήνα του Linux, για να εκθέσετε μια συσκευή μαζικής αποθήκευσης USB, μια συσκευή δικτύου USB κ.λπ. Ωστόσο, αυτά τα υπάρχοντα gadget USB Τα προγράμματα οδήγησης δεν είναι απαραίτητα η καλύτερη επιλογή για αυτού του είδους τις δοκιμές: εκτελούν κάποιες περισσότερο ή λιγότερο περίπλοκες μεταφορές και μπορεί να είναι δύσκολο να βρεθεί η βασική αιτία ενός σφάλματος χρησιμοποιώντας αυτά τα προγράμματα οδήγησης gadget.
Ευτυχώς, υπάρχει ένα εργαλείο ακριβώς για την εκτέλεση δοκιμών των μεταφορών USB: αυτό το εργαλείο ονομάζεται testusb
, και μπορεί να βρεθεί απευθείας στον πηγαίο κώδικα του πυρήνα Linux στο tools/usb/testusb.c. Το εργαλείο είναι αρκετά παλιό και όχι πολύ γνωστό, αλλά αποδείχθηκε πολύ χρήσιμο για τις δοκιμές μας, γι‘ αυτό σε αυτήν την ανάρτηση ιστολογίου μοιραζόμαστε μερικές λεπτομέρειες σχετικά με τον τρόπο χρήσης του.
Πρώτα απ ‚όλα, μπορείτε να βρείτε κάποια τεκμηρίωση στη διεύθυνση http://www.linux-usb.org/usbtest/.
Εδώ είναι μερικές λεπτομέρειες για το πώς το χρησιμοποιήσαμε. Χρησιμοποιώντας τεστβ απαιτεί τα εξής:
- Το υπό δοκιμή σύστημα, το οποίο περιέχει τον ελεγκτή συσκευής USB που πρόκειται να δοκιμαστεί, ο οποίος πρέπει να εκθέσει ορισμένες λειτουργίες USB χρησιμοποιώντας ένα πρόγραμμα οδήγησης gadget USB
- Το σύστημα δοκιμής, το οποίο εκτελεί τα ίδια τα τεστ, το οποίο διαθέτει έναν ελεγκτή κεντρικού υπολογιστή USB. Σε αυτό το σύστημα, απαιτείται μια αποκλειστική μονάδα δοκιμής πυρήνα USB, μαζί με το τεστβ εφαρμογή χώρου χρήστη.

Στο δοκιμασμένο σύστημα, το απλό g_zero
μονάδα gadget (CONFIG_USB_ZERO=m
) μπορεί να χρησιμοποιηθεί. Πράγματι, αυτό το gadget είναι συμβατό με τεστβ.
ο testusb
μέρος που εκτελείται στο σύστημα δοκιμής αποτελείται από ένα πρόγραμμα οδήγησης πυρήνα και ένα απλό πρόγραμμα χώρου χρήστη που ζητά από τον οδηγό να εκτελέσει τις δοκιμές. Το πρόγραμμα οδήγησης μπορεί να κολλήσει σε ορισμένες αστοχίες και, σε αυτήν την περίπτωση, απαιτείται επανεκκίνηση του συστήματος δοκιμής. Επομένως, δεν χρησιμοποιήσαμε το σταθμό εργασίας μας ως σύστημα δοκιμής.
Αντίθετα, δεδομένου ότι η πλακέτα μας που περιέχει τον ελεγκτή συσκευής USB που πρόκειται να δοκιμαστεί περιλαμβάνει επίσης έναν ελεγκτή κεντρικού υπολογιστή USB, χρησιμοποιήσαμε την ίδια την πλακέτα ως δοκιμαστικό σύστημα και επαναφέραμε τον κεντρικό υπολογιστή USB στη συσκευή USB χρησιμοποιώντας το κατάλληλο καλώδιο USB.

Για το σύστημα δοκιμής, πρέπει να ενεργοποιήσετε το πρόγραμμα οδήγησης δοκιμής USB, χρησιμοποιώντας CONFIG_USB_TEST=m
. Φυσικά πρέπει να είναι ενεργοποιημένη και η υποστήριξη USB Host, με τα σχετικά προγράμματα οδήγησης ανάλογα με το συγκεκριμένο υλικό σας.
Η εφαρμογή χώρου χρήστη που βρίσκεται στο tools/usb/ στον κώδικα του πυρήνα του Linux πρέπει να διασταυρωθεί. Ένα βολικό Makefile παρέχεται για αυτόν τον σκοπό σε αυτό tools/usb
Ευρετήριο.
Μόλις εγκατασταθούν όλα, στο υπό δοκιμή σύστημα φορτώστε το g_zero
μονάδα μέτρησης:
# modprobe g_zero
Στο δοκιμαστικό σύστημα, τοποθετήστε το usbtest
ενότητα και εκτελέστε τις δοκιμές:
# modprobe usbtest # testusb -a -v512 [ 220.276460] usbtest 2-1:3.0: TEST 0: NOP [ 220.292316] usbtest 2-1:3.0: TEST 1: write 1024 bytes 8 times [ 220.324711] usbtest 2-1:3.0: TEST 2: read 1024 bytes 8 times [ 220.364648] usbtest 2-1:3.0: TEST 3: write/512 0..1024 bytes 8 times [ 220.394705] usbtest 2-1:3.0: TEST 4: read/512 0..1024 bytes 8 times [ 220.434605] usbtest 2-1:3.0: TEST 5: write 8 sglists 32 entries of 1024 bytes [ 220.504601] usbtest 2-1:3.0: TEST 6: read 8 sglists 32 entries of 1024 bytes [ 220.554617] usbtest 2-1:3.0: TEST 7: write/512 8 sglists 32 entries 0..1024 bytes [ 220.604618] usbtest 2-1:3.0: TEST 8: read/512 8 sglists 32 entries 0..1024 bytes [ 220.631632] usbtest 2-1:3.0: TEST 9: ch9 (subset) control tests, 8 times [ 220.840328] usbtest 2-1:3.0: TEST 10: queue 32 control calls, 8 times [ 220.891842] usbtest 2-1:3.0: TEST 11: unlink 8 reads of 1024 [ 221.238312] usbtest 2-1:3.0: TEST 12: unlink 8 writes of 1024 [ 221.588363] usbtest 2-1:3.0: TEST 13: set/clear 8 halts [ 221.724579] usbtest 2-1:3.0: TEST 14: 8 ep0out, 1..1024 vary 512 [ 222.328352] usbtest 2-1:3.0: TEST 17: write odd addr 1024 bytes 8 times core map [ 222.364632] usbtest 2-1:3.0: TEST 18: read odd addr 1024 bytes 8 times core map [ 222.394700] usbtest 2-1:3.0: TEST 19: write odd addr 1024 bytes 8 times premapped [ 222.434615] usbtest 2-1:3.0: TEST 20: read odd addr 1024 bytes 8 times premapped [ 222.474661] usbtest 2-1:3.0: TEST 21: 8 ep0out odd addr, 1..1024 vary 512 [ 223.086524] usbtest 2-1:3.0: TEST 24: unlink from 8 queues of 32 1024-byte writes [ 223.182482] usbtest 2-1:3.0: TEST 27: bulk write 0Mbytes [ 223.222741] usbtest 2-1:3.0: TEST 28: bulk read 0Mbytes [ 223.250355] usbtest 2-1:3.0: TEST 29: Clear toggle between bulk writes 8 times #
Προφανώς, όλες οι δοκιμές θα πρέπει να τελειώσουν με επιτυχία… εάν όχι, θα πρέπει να διορθώσετε το πρόγραμμα οδήγησης σας.
ο g_zero
Το gadget υποστηρίζει επίσης ισόχρονες μεταφορές στην εναλλακτική του διαμόρφωση. ο usbtest
Η ενότητα μπορεί να υποστηρίξει ισόχρονες δοκιμές και για να γίνει αυτό με το g_zero
gadget, πρέπει να πούμε usbtest
για να χρησιμοποιήσετε αυτήν τη δεύτερη διαμόρφωση:
# modprobe g_zero # modprobe usbtest alt=1
Στη συνέχεια, εκτελέστε απλώς τη δοκιμή:
# testusb -a -v512
testusb
μπορεί να χρησιμοποιηθεί με ένα gadget σύνθετης λειτουργίας USB, αλλά στις δοκιμές μας δεν χρησιμοποιήσαμε αυτήν τη δυνατότητα.
Ωστόσο, ορισμένοι από τους πυρήνες που παρέχονται από προκατασκευασμένα προγράμματα οδήγησης USB Gadget είναι ενδιαφέρον να δοκιμάσουν συγκεκριμένες περιπτώσεις χρήσης. Για παράδειγμα:
- g_mass_storage (
CONFIG_USB_MASS_STORAGE
): αυτό το πρόγραμμα οδήγησης gadget έχει το χαρακτηριστικό της διακοπής ορισμένων τελικών σημείων, κάτι που είναι χρήσιμο για τη δοκιμή της δυνατότητας διακοπής.
Για να χρησιμοποιήσετε αυτό το gadget, στον στόχο, δημιουργήστε ένα αρχείο για το backend μαζικής αποθήκευσης και φορτώστε τη λειτουργική μονάδα:dd if=/dev/zero of=/tmp/storage.part bs=1M count=8 modprobe g_mass_storage file=/tmp/storage.part
Στον υπολογιστή εμφανίζεται η νέα αφαιρούμενη συσκευή αποθήκευσης. Μπορείτε να το μορφοποιήσετε και να μεταφέρετε αρχείο προς/από αυτήν τη συσκευή.
- g_ether (
CONFIG_USB_ETH
): αυτό το πρόγραμμα οδήγησης gadget έχει το χαρακτηριστικό ότι χρησιμοποιεί μεγέθη μεταφοράς που δεν είναι πολλαπλάσιο του MaxPacketSizeτο οποίο είναι χρήσιμο για τη δοκιμή μεταφορών που εκτείνονται σε πολλά πακέτα με το τελευταίο να είναι μικρότερο από MaxPacketSize.
Για να χρησιμοποιήσουμε αυτό το πρόγραμμα οδήγησης gadget, χρησιμοποιήσαμε έναν απλό διακομιστή HTTP σε υπολογιστή που εξυπηρετούσε δοκιμαστικά αρχεία διαφόρων μεγεθών (700 byte, 1000 byte, 1100 byte και 64 MB).wget
κλήσεις στο δοκιμασμένο σύστημα έκανε τη λήψη καιWireshark
στον υπολογιστή βοήθησε στον έλεγχο του μεγέθους του μεταφερόμενου πακέτου. Ακόμα κι αν το αίτημα USB εκτείνεται σε πολλά πακέτα USB, το αίτημα USB θα πρέπει να ολοκληρωθεί με το μέγεθος του πακέτου Ethernet που εκτίθεται από το Wireshark. - g_serial (
CONFIG_USB_G_SERIAL
): αυτό το πρόγραμμα οδήγησης gadget έχει το χαρακτηριστικό ότι σε μια βασική διαμόρφωση κάθε byte που αποστέλλεται είναι ηχώ, πράγμα που σημαίνει ότι μεταφέρονται πολύ σύντομα πακέτα.
Για να χρησιμοποιήσετε αυτό το gadget, στον στόχο, κάντε μια επαναφορά λογισμικού:cat /dev/ttyGS0 > /dev/ttyGS0
Στον υπολογιστή:picocom -b115200 /dev/ttyACM0
Κάθε χαρακτήρας που πληκτρολογείτε στον υπολογιστή (picocom
) γίνεται ηχώ και όταν πατήσετε ‚enter‘, ηχεί ολόκληρο το buffer.
Ελπίζουμε ότι αυτή η σύντομη ανάρτηση ιστολογίου σχετικά με testusb
και τα προκατασκευασμένα gadget θα σας βοηθήσουν να αναπαράγετε, να απομονώσετε, να βρείτε τη βασική αιτία ορισμένων προβλημάτων και, τέλος, να διορθώσετε τα προγράμματα οδήγησης USB Device Controller.