Ποια η διαφορά ενός USB printer driver με έναν αντίστοιχο USB driver για fax modem?

Γιατί ένα λειτουργικό χρειάζετε διαφορετικούε driver για έναν εκτυπωτη και για ένα fax modem. Εφόσον και τα 2 είναι USB. Εννοώ ένας driver για το fax modem τι το διαφορετικό κάνει στην οδήγηση της συσκευής εν αντιθέση με έναν printer driver;

Αυτό που θέλω να δω είναι τι το διαφορετικό έχουν από άποψη κώδικα και αρχιτεκτονικής οι 2 driver και τι απαιτήσεις πρέπει να καλύψουν. Πχ μπορεί να έχουν ένα κοινό κομμάτι κώδικα για την επικοινωνία από-προς USB αλλά τα δεδομένα που ανταλλάσονται να είναι διαφορετικά πχ. στο modem να είναι απλά 7bit ASCII (πρακτικά 8bit ASCII) για τα AT commands ενώ στον εκτυπωτή να είναι BASE16 και θα πρέπει να το αντιμετωσίσει διαφορερικά.

Δλδ αν του δούμε απο μια άποψη στοίβας προτοκόλλων (όπως είναι το OSI ή το TCP/IP stack) ένας USB driver σε τί επίπεδα πρέπει να καλύψει;

Αν μιλαμε για εναν απλο usb printer που συνδεεται μονο με usb και οχι με ethernet, wifi, bluetooth τοτε δεν ανηκει σε κανενα απο τα επιπεδα του OSI, αρα εχει εναν απλο οδηγο που συμπεριλαμβανει τον usb ελεγκτη και οτι αλλο χρειαζεται οσον αφορα τις λειτουργειες και τα χαρακτηριστικα του εκτυπωτη.

Ενα fax modem θα βγει στο δικτυο τοτε θα χρησιμοποιησει κανονικα οσο προτοκολλα χρειαζεται απο το TCP/IP λογικα μεχρι το 4ο (επιπεδο μεταφορας)

*ολα αυτα με καθε επιφυλλαξη, με πετυχες πανω που διαβαζω για εξετασεις και ειναι καλη ευκαιρια να δω αν λεω μπουρδες η οχι :sweat_smile:

Ο σχεδιασμός του USB stack μοιάζει κατά κάποιον τρόπο με το μοντέλο του OSI, αλλά έτσι δεν θα μοιάζει κάθε πολύπλοκο μοντέλο επικοινωνίας; Οπότε όχι άλλο πράγμα τα δίκτυα και άλλο πράγμα το USB stack.

Αν θέλεις να καταλάβεις το USB θα πρέπει να ξέρεις πως κάθε συσκευή έχει μια περιγραφή της, που μεταξύ άλλων περιλαμβάνει ένα κωδικό κατηγορίας συσκευής. Κάποιες συσκευές έχουν τα δικά τους πρωτόκολλα (συσκευές HID, κάμερες, μέσα αποθήκευσης). Σε αυτές τις περιπτώσεις δεν θέλεις κάτι άλλο, διαφορετικά έχεις ένα κωδικό κατασκευαστή (που κοστίζει κάπου 10.000€ να πάρεις ένα) και ένα κωδικό συσκευής (και πιθανά ένα σειριακό αριθμό). Με βάση αυτά μπορείς να έχεις ένα οδηγό να πάρει προτεραιότητα ή να χειριστεί μια άγνωστη συσκευή. Και κάθε συσκευή μπορεί να έχει (και συνήθως έχει) πολλούς περιφραφείς.

Αν πάρεις τον έλεγχο ενός περιγραφέα μπορείς στην συνέχεια να δεχτείς τα μυνήματα της συσκευής (σε polling ή interupt mode) καθώς και να στείλεις μηνύματα. Το payload κάθε μηνύματος δεν αφορά το υποσύστημα του USB αλλά την κάθε συσκευή. Πάνω σε αυτή την υποδομή μπορείς να έχεις αυτά που ο πυρήνας θέλει για μια τυπική συσκευή (block ή char) ανάλογα με το είδος της.

Αν θέλεις να μάθεις περισσότερα δοκίμασε να φτιάξεις μια δική σου συσκευή με κάποιο κατάλληλο μικροέλεκτη (px κάποιο teensy ή pico). Και δεν θέλεις απαραίτητα οδηγό σε επίπεδο πυρήνα, μπορείς να το κάνεις σε user space με την βοήθεια της βιβλιοθήκης libusb. Πολλές συσκευές όπως λεντοταινίες, πληκτρολόγια, graphichs tablets τις δουλεύουμε έτσι (ακόμα και σε Python) οπότε υπάρχουν παραδείγματα. Επίσης μπορείς να κάνεις capture την επικοινωνία μιας συσκευής που την έχεις δώσει σε ένα Windows VM και να κάνεις reverse engineering τα πακέτα.

YΓ: Απλά έχω παίξει λίγο με δικές μου συσκευές, δεν είμαι κανένας ειδικός οπότε διορθώστε ελεύθερα.

Άρα ένας οδηγός είναι στα εξής επίπεδα:

  1. Φυσικό επίπεδο (sugnal modulation)
  2. Επίπεδο αναγvώρισης συσκευής (vendorid & serial, τύπος κοκ)
  3. Επίπεδο πακετοποίησης και αποστολής λήγης δεδομένων.
    1. Πχ. αν θα στέλνω 7-bit ascii ή αν θα στέλνω δεδομένα σε βασε16 ή raw binary data χύμα.
    2. Αλληλουχία μυνημάτων (πχ Hayes command set)

Σαφώς το λέω εμπειρικά προσπαθώντας να κωδικοποιήσω το post σου.

Μισό, αλλά τα παραπάνω αφορούν πως φτιάχνεις κάποιο οδηγό για μια συσκευή. Το πως την χρησιμοποιείς είναι κάτι διαφορετικό. Στην πρώτη περίπτωση τα χαμηλά επίπεδα (πχ διευθυνσιοδότηση και δρομολόγηση, διαχείρηση ενέργειας κλπ) δεν σε αφορούν. Προγραμματιστικά φτιάχνεις το USB descriptor και στην συνέχεια μοιάζει αρκετά με συνήθη socket programming.

Τωρα αν έχεις μια συσκευή modem, αυτή θα είναι ένα character device και για το πρόγραμμα σου είναι αδίαφορο η φυσική της υλοποίηση. Character device θα είναι και ένας εκτυπωστης. Και απλά ανοίγεις την συσκευή (εφόσον έχεις το δικαίωμα) και την δουλεύεις σαν αρχείο. Είναι ένα αρχείο. Ενα modem θα το βρείς σαν μια σειριακή συσκεύη (/dev/ttyACMx ή /dev/ttyUSBx συνήθως). Σχεδόν καμία διαφορά απο την συνήθη είσοδο/έξοδο απο το τερματικό. Αλλά υπάρχει υπηρεσία έτοιμη.

Οπότε δεν κατάλαβα την ερώτηση. Σε ένα πρώτο επίπεδο θέλεις ένα βιβλίο για system programming. Αν θέλεις να πας ποιο βαθία δες κάποιο βιβλίο για kernel programming σχεδόν πάντα στα πρώτα κεφάλαια έχουν την υλοποίηση ενός char device που είναι ευκολότερο. Στην συνέχεια για USB υπάρχει το documentation της βιβλιοθήκης libusb και βρήσκεις εύκολα πολλά παραδείγματα. Και σε περίπτωση απελπισίας υπάχουν στο usb.org όλλα όσα δεν θέλεις να γνωρίζεις.

Disclaimer: Είμαι ψιλοάχετος με το αντικείμενο