ASF habe ich nicht benutzt, war mir zu grässlich. Habe für die Firma
mal selbst einen mass-storage class driver geschrieben, zwar für SAM4
und nicht SAMD, aber aus USB-Sicht ist das an dieser Stelle egal, die
Hardware wird ja an anderen Stellen abstrahiert.
Anfangs hatten wir das Device einfach read-only deklariert, damit nur
die Firmware was am Dateisystem ändern kann und der Host nicht. Später
haben wir aber auch noch read/write eingebaut, damit man vom Host aus
neue Dateien auf die SD-Karte im Gerät übertragen konnte (insbesondere
ein neues Firmware-Image, welches der Bootloader dann nutzen kann).
So grob: die Enumeration durch den Host bekommst du in der USB-Firmware
immer mit, da kannst du ein Flag setzen. Erst danach kann der Host ja
zugreifen. Ein Gegenstück dazu gibt es nicht so recht, aber vielleicht
helfen dir an dieser Stelle die Interrupts, die du schon gefunden hast.
Bei mass storage bekommst du ja außerdem die diversen SCSI-Kommandos zur
Verarbeitung vorgelegt. Da kannst du sicher auch was damit machen, so
nach dem Prinzip "READ CAPACITY kommt auf jeden Fall am Anfang, ab da
hat der Host das Sagen", "SYNCHRONIZE CACHE kommt beim Aushängen". UNIT
ATTENTION ist eine nette Methode, um den Host ggf. zu zwingen, seinen
derzeitigen Status zu verwerfen und neu anzufangen (falls bspw. der Host
einen Zugriff versucht, obwohl die Firmware gerade gar nicht der Meinung
ist, dass er aktiv wäre). Wenn du das Gerät als Wechseldatenträger
deklarierst, ist es ja jederzeit legitim, eine UNIT ATTENTION mit
"Medium may have changed" zu werfen. Wir benutzen diese Variante, wenn
die Firmware von read/only auf read/write umschaltet.
Sorry, unsere Firmware ist closed-source, wir müssen damit Geld
verdienen. Fragen kann ich aber gern beantworten.