USB dispozitiv de stocare în masă și libopencm3


Munca mea este legată de programarea de microcontrolere, în special STM32. Pentru o lungă perioadă de timp pentru a lucra cu perifericele am folosit STM32 Standard periferic Library, așa cum este prevăzut de către producător și, în consecință, acesta este cel mai complet. Cu toate acestea, lucrul cu ei este extrem de incomod: structurile initializare sunt adesea excesive, în funcțiile diavolului rupe un picior, în general, foarte curând, există o dorință copleșitoare de a ajunge în jos la bibliotecă și du-te la ceva mai precise, bine concepute și scrise în „cod curat“.

După o lungă căutare, a fost găsit libopencm3 open source de bibliotecă, care îndeplinește toate cerințele. Opinii de munca ei au fost pozitive, si sa dovedit ca plăcut de ea.

Una dintre ultimele sarcini la locul de muncă a fost de a ridica USB MSD. Pentru a rezolva această problemă folosi un consiliu de depanare STM32F4-descoperire, iar acest lucru un exemplu. Exemplul nu pornește. Au existat două probleme:
1. Este imposibil de a merge la disc și citește fișierul localizat acolo.
2. Dispozitiv de detectare ca un disc a durat mai mult de 2 minute.

Toate acestea se datorează prezenței mai multor bug-uri în fișierul usb_msc.c. Astfel, în acest articol voi vorbi despre cum să se stabilească aceste erori și să continue să fie fericit să utilizeze libopencm3 bibliotecă.

Abordarea №1:
Eroare Linia de jos este că, atunci când dispozitivul primește o cerere de scriere, acesta se ocupă în mod corect, dar nu trimite înapoi starea CSW de procesare cerere (comandă Starea Wrapper). Astfel, USB host (în acest caz, este PC-ul nostru) merge în așteptare fără sfârșit pentru un răspuns la cerere, toate se blochează, kernel panic, mor, atâta timp cât dispozitivul de deconectare =)

* Mai multe informații despre stocare în masă în vrac sau numai CBI Specificației de transport aici.

Prin urmare, vom găsi msc_data_rx_cb fișier funcția usb_msc.c și dă următoarea formă:

Piesa adăugată de cod este între slash

Uraaa, acum putem merge la disc pentru a citi fișierul!

Abordarea №2:
Esența problemei este că toate aceleași usb_msc.s de fișiere nu două comenzi SCSI sunt puse în aplicare. Acest lucru a fost dezvăluit de un program de usblyser foarte mare ajutor. care permite un mod convenabil de a vizualiza schimbul de parcele între dispozitivul USB și gazdă USB.

Deci, în primul rând, gazda nu primesc un răspuns la READ_FORMAT_CAPACITIES de comandă. Prin urmare, adăugarea unui fișier usb_msc.s scsi_read_format_capacities funcții și să o funcție scsi_command de forma următoare:

În al doilea rând, gazda nu primește un răspuns la comanda ANCHETĂ (număr de serie). Pentru a corecta această eroare, trebuie să creați un _spc3_inquiry_sn_response matrice și funcția de plumb scsi_inquiry formularul de mai jos:

* Pentru mai multe detalii despre comenzi CO SCSI pot fi din nou aici.

După ce toate aceste interventii chirurgicale au nevoie pentru a reconstrui bibliotecă, înainte de a face comanda curat.

În viitorul apropiat am de gând să fac o cerere de tragere la libopencm3 depozit, cu toate acestea, se poate doar ghici cât de curând proprietarii vor face modificările la bibliotecă și să lucreze în același timp toți avem nevoie de aici și acum.

P.S. Aici se află biblioteca noastră de furcă corporative deja modificată, în cazul în care leneș să sape.

Nu știu cum midi, dar încercarea de a face prin stm32cube CDC portul calculator virtual, toate vrodeby bune, iar viteza atinsă, și de a trimite și primi ... dar atunci când recepția merge, indiferent de transmisie (mod este cerere-răspuns, și vom trimite modul de date singur, pentru a primi datele iar alții ne trimite și primi în mod independent). Apoi USB ar opri - nici o idee care întrerupe datele sunt recepționate de la dispozitivul gazdă. Am încercat încă să facă kit de caroserie și jurnalele în memoria RAM toate LiBu, și a studiat-o în sus și în jos, și am verificat registrul de stare, și a rescris funcția de Dumnezeu, care rezolvă întrerupe. tchetno toate - dispozitiv pur și simplu zastoparivaetsya, încetează să mai iasă și recepție și transmisie. Mai mult decât atât, acest lucru este în mod clar un bug pe un controler de utilizare nivel scăzut de hardware USB de pe STM32F4.

Proiectul este un câștig sau Linux?

o victorie, dar, de asemenea, rula pe Linux.

Apoi am întreb tulcheyna de configurare minigayd :)

Eu lucrez în Eclipse. Aici este un site web GNU ARM Eclipse. totul este super detaliat în secțiunea Inslall: cum se instalează GNU ARM Eclipse plug-in, cum să se adapteze toolchain și debugger modul de a ridica =)

HID MSD - îndrăznesc să spun - debugger mbed?
și în HID MSD CDC-ul nu crede?

Nu, nu ghicit), acest lucru este încă un secret corporativ, dar după o lună sau două am putut scrie despre dezvoltarea noastră!

Dacă nu sunt confundat «Standard Peripheral Biblioteca» Producătorul este considerat caduc și recomandă insistent utilizarea de cub în loc.

Da, este. Cu toate acestea, există întotdeauna probleme atunci când trebuie să știți că nu cu adevărat funcție, care înregistrează și atinge. .. etc și în intorsaturi cub HAL destul de masiv și să coboare în iad în sine (driver de nivel scăzut), aveți nevoie pentru a deschide un milion de fișiere, confuz și să uitați de ce esti acolo a ajuns) În general, singurul HAL pe care am încredere - un HAL ChibiOS. Dar aceasta este totul altă poveste)

Anastasia, vă mulțumesc pentru articol. Ar fi foarte interesant de citit despre provocările cu care vă confruntați la locul de muncă, și să decidă care instrumente, literatură și așa mai departe, în același timp, pe care îl utilizați, citiți acolo orice resurse online profesioniste pe această temă, și așa mai departe. Am dat peste foarte puține informații despre acest subiect în domeniul public. Scrie mai mult!

M-am gândit la ce ar trebui să pună în aplicare interfața la dispozitiv, cum ar fi / proc și / sys în Linux folosind MSC. Acest lucru a fost posibil pentru a actualiza firmware-ul pentru a controla diverse steaguri. Până când acest lucru se face prin intermediul dispozitivului de furnizor și libusb în utilitatea lor. Dar Cypress FX3 face acest lucru se ocupă au complet, deși există o abstracție prin USB, asa sensibil. Mă tem, totuși, că, deși nu alocă și memoria nu are suficient pentru a jura. Adevărata utilitate ar fi mult simplificată de către gazdă.

Timpul indicat în fusul orar, care este montat pe aparat.