Home News Rilasciato libusbhsfs v0.0.2

[Scena Switch] Rilasciato libusbhsfs v0.0.2

269
0

Il developer Pablo Curiel, già autore di nxdumptool, con il sostegno di XorTroll ha pubblicato una nuova libreria (attualmente WIP) che prende il nome di libusbhsfs,

La classe di dispositivi di archiviazione di massa USB (nota anche come USB MSC o UMS ) è un insieme di protocolli di comunicazione, definita dalla USB Implementers Forum che rende un dispositivo USB accessibile a un dispositivo di elaborazione host e consente il trasferimento di file tra l’host e il dispositivo USB.

Per un host, il dispositivo USB funge da disco rigido esterno, il set di protocolli si interfaccia con una serie di dispositivi di archiviazione.

Caratteristiche principali

  • Supporta dispositivi di archiviazione di massa USB che implementano almeno un descrittore di interfaccia USB con le seguenti proprietà:
    • bInterfaceClass: 0x08 (USB Mass Storage Class).
    • bInterfaceSubClass: 0x06 (SCSI Transparent Command Set SubClass).
    • bInterfaceProtocol: 0x50 (Bulk-Only Transport [BOT] Protocol).
  • Driver BOT (Bulk-Only Transport) scritto da zero, che implementa i più comuni comandi SPC (Primary Command Set) SCSI nonché richieste specifiche della classe BOT.
    • Comandi SPC supportati:
      • TEST UNIT READY (0x00).
      • REQUEST SENSE (0x03).
      • INQUIRY (0x12).
      • MODE SENSE (6) (0x1A).
      • START STOP UNIT (0x1B).
      • PREVENT ALLOW MEDIUM REMOVAL (0x1E).
      • READ CAPACITY (10) (0x25).
      • READ (10) (0x28).
      • WRITE (10) (0x2A).
      • MODE SENSE (10) (0x5A).
      • READ (16) (0x88).
      • WRITE (16) (0x8A).
      • SERVICE ACTION IN (0x9E).
    • Azioni supportate SERVICE ACTION IN:
      • READ CAPACITY (16) (0x10).
    • Richieste specifiche della classe BOT supportate:
      • Get Max LUN (0xFE).
      • Bulk-Only Mass Storage Reset (0xFF).
  • Supporta dispositivi di archiviazione di massa USB con indirizzi di blocchi logici lunghi (LBA a 64 bit) e dimensioni di blocchi logici variabili (512 – 4096 byte).
  • Thread in background che si occupa di avviare tutte le unità logiche disponibili da ogni dispositivo di archiviazione di massa USB appena connesso, nonché di montare i file system disponibili da ciascuno quando possibile.
    • File system supportati:
      • FAT12 (via FatFs).
      • FAT16 (via FatFs).
      • FAT32 (via FatFs).
      • exFAT (via FatFs).
      • Completamente possibile aggiungere il supporto per file system aggiuntivi, a condizione che le loro librerie siano portate su Switch.
    • Utilizza l’interfaccia del dispositivo virtuale devoptab per fornire un modo per utilizzare le chiamate I/O standard da libc (ad esempio fopen(), opendir(), ecc..) sui filesystem montati dalle unità logiche disponibili.
  • Interfaccia libreria facile da usare:
    • Fornisce un evento utente di cancellazione automatica che viene segnalato ogni volta che viene rilevata una modifica di stato dal thread in background (nuovo dispositivo montato, dispositivo rimosso).
    • Elenco indolore delle partizioni montate utilizzando una semplice struttura che fornisce il nome del dispositivo devoptab, così come altre informazioni interessanti (indice del file system, tipo di file system, protezione da scrittura, capacità dell’unità logica grezza, ecc..).

Limitazioni

  • Driver Bulk-Only Transport (BOT):
    • È possibile utilizzare contemporaneamente fino a 32 interfacce di archiviazione di massa USB diverse. L’aumento di questo limite non è dannoso, ma fa sì che la libreria occupi ulteriore memoria heap.
    • È possibile eseguire una sola operazione SCSI alla volta per dispositivo di archiviazione di massa USB, indipendentemente dal numero di unità logiche. Questa è una limitazione ufficiale del protocollo BOT. I mutex vengono utilizzati per evitare che più operazioni SCSI abbiano luogo contemporaneamente sullo stesso dispositivo di archiviazione di massa USB.
  • Libreria FatFs:
    • È possibile montare un solo volume FAT per unità logica. Per risolvere questo problema è necessario riscrivere le parti critiche della libreria FatFs.
    • È possibile montare fino a 64 volumi FAT contemporaneamente su tutti i dispositivi di archiviazione di massa USB disponibili. Il limite originale era 10, ma la libreria FatFs è stata leggermente modificata per consentire il montaggio simultaneo di più volumi.
  • Consumo di memoria dello stack e/o dell’heap:
    • Questa libreria non è adatta per sysmodule personalizzati e/o progetti di servizio MITM. Assegna un buffer di 8 MiB per ogni dispositivo UMS, che viene utilizzato per i trasferimenti di comandi e dati. Si basa anche molto sulle funzionalità di libnx, che non sono sempre compatibili con i contesti del programma sysmodule/mitm.
  • Problemi di collegamento:
    • Possono sorgere problemi di collegamento se un’applicazione homebrew che già dipende da FatF (ad esempio per montare partizioni eMMC) è collegata a questa libreria.
  • Funzionalità FS specifiche per switch:
    • I file di concatenazione non sono supportati.

Guida

  • Costruire questa libreria e aggiornarla nel Makefile della propria applicazione homebrew per farvi riferimento.
    • Vengono generate due build differenti: una build normale (-lusbhsfs) e una build di debug con registrazione abilitata (-lusbhsfsd).
    • Nel caso in cui sia necessario segnalare eventuali bug, assicurarsi di utilizzare la build di debug e fornire il relativo file di registro.
  • Includere il file di intestazione usbhsfs.h da qualche parte nel codice.
  • Inizializzare l’interfaccia USB Mass Storage Host con usbHsFsInitialize().
  • Recuperare un puntatore all’evento di modifica dello stato UMS in modalità utente con usbHsFsGetStatusChangeUserEvent() e attendere che l’evento venga segnalato (ad esempio sotto un thread diverso).
  • Ottieni il conteggio dei dispositivi montati con usbHsFsGetMountedDeviceCount().
  • Elenca i dispositivi montati con usbHsFsListMountedDevices().
  • Eseguire operazioni di I/O utilizzando i nomi di montaggio restituiti dai dispositivi elencati.
  • Chiudere l’interfaccia USB Mass Storage Host con usbHsFsExit() quando terminato.

Si prega di controllare l’applicazione di prova fornita in /example per un esempio più approfondito.

Supporto relativo al percorso

[stextbox id=’warning’]Disclaimer: Tutte le chiamate fsdevMount*() da libnx (e qualsiasi wrapper attorno ad esse) possono e sovrascriveranno il dispositivo devoptab predefinito se utilizzato dopo aver chiamato con successo usbHsFsSetDefaultDevice().[/stextbox]

  • usbHsFsSetDefaultDevice() deve essere usato per impostare un UsbHsFsDevice precedentemente elencato come dispositivo devoptab predefinito, che a sua volta renderà possibile utilizzare percorsi relativi con chiamate libc standard su di esso.
  • usbHsFsUnsetDefaultDevice() può essere utilizzato in qualsiasi momento per annullare l’impostazione di un UsbHsFsDevice precedentemente impostato come dispositivo devoptab predefinito. Se il dispositivo devoptab predefinito corrente corrisponde a quello precedentemente impostato dalla libreria, la scheda SD viene impostata come nuovo dispositivo devoptab predefinito.
  • usbHsFsGetDefaultDevice() può essere utilizzato per riempire l’elemento UsbHsFsDevice fornito con le informazioni da un dispositivo devoptab predefinito impostato in precedenza.

Per ulteriori informazioni, leggere i commenti da include/usbhsfs.h. Per un esempio, controllare l’applicazione di prova fornita in /example.

Changelog v0.0.2

  • Libreria con licenza secondo la licenza ISC. Vogliamo davvero che voi lo adottiate e lo utilizziate liberamente nei vostri progetti.
  • Corretto il problema con la generazione della stringa della versione del pacchetto di distribuzione in Makefile.
  • LICENSE.mdREADME.md ora sono archiviati nei pacchetti di distribuzione generati.
  • Aggiunto supporto per percorsi relativi.
    • Si prega di leggere la sezione relativa al supporto del percorso dal README per ulteriori informazioni.
  • I due punti finali vengono ora aggiunti ai nomi di montaggio restituiti dagli elementi UsbHsFsDevice.
  • Corretto il problema con l’annullamento della registrazione del dispositivo devoptab.
  • Driver Bulk-Only Transport (BOT):
    • usbHsFsRequestGetMaxLogicalUnits() ora cancella lo stato STALL da entrambi gli endpoint da solo se fallisce.
    • Allo stesso modo, usbHsFsRequestPostBuffer() ora tenta di cancellare lo stato STALL da entrambi gli endpoint se fallisce.
  • Interfaccia devoptab di FatFs:
    • Corrette le traduzioni dei codici di errore per alcuni errori FatF.
    • Creata una funzione ffdev_fill_stat() unificata sia per ffdev_stat() che per ffdev_dirnext().
    • Corrette le conversioni di timestamp POSIX dai timestamp DOS.
  • Debug build:
    • I messaggi di debug da usbHsFsScsiReadLogicalUnitBlocks() e usbHsFsScsiReadLogicalUnitBlocks() ora includono il numero totale di byte da trasferire per ogni iterazione del ciclo.
    • Aggiunti messaggi di debug all’interfaccia devoptab di FatFs.

Crediti

  • DarkMatterCore: Gestione LUN/FS del dispositivo UMS, driver BOT (Bulk-Only Transport), interfaccia libreria.
  • XorTroll: Sistema di montaggio FS, (un)registered del dispositivo devoptab, esempio di applicazione di prova.
  • Molti documenti SPC/BOT su Internet – questi sono stati referenziati in più file dalla base di codice.

Download: libusbhsfs v0.0.2

Download: Source code libusbhsfs v0.0.2

Fonte: github.com

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.