ARM:0018 STM32CubeMX hack - printerio klasė

Tai projektas kuris pilnai užstrigo dėl mano neprofesionalumo ir dėl dokumentacijos trūkumo. Užduotis- konvertuoti vieną iš STM32CubeMX projektų į printerio klasę (Printer Class). Tam reikalui panaudojau CDC klasę ir perdariau pagal savo seną AVR projektą į printerio klasę. Ir jis, rupužė, neveikia taip kaip reikia.

Ką daro publikuotas projektas:

  • Prisijungia kaip kompo kaip USB įrenginys, nuskaito standartinius deskriptorius ir kompiuteris mato kaip printerio klasę.
  • Printeris duoda 1284 stringą į hostą, tačiau ar teisingai hostas tai interpretuoja nežinau.
  • Printeris spausdina. Tačiau veikia tik uni ir bi- directional režime. Kažkodėl 1284.4 režime mano windows pastringa.
  • Printeris nesigavo pilnai “plug ir peilis". Jį reikia dagrūsti rankiniam režime. Mano AVR variantas buvo pilnas “plug and play".
  • Kaip ir AVR versijoje nesugebu perduoti STATUS (baigėsi popierius, printeris “on-line/selected") į hostą. Lygtai viską parašiau, bet windows draiveris paprasčiausiai neklausia ir ignoruoja mano bandymus.
  • “MS descriptor" teoriškai padarytas (0xEE), bet kažkodėl neveikia. Gal Windows neklausia, arba klausia taip, kad aš nepastebiu.

Kad atkartoti projektą, reikia pradėti STM32CubeMX su USB ir CDC klase. Poto, viską CDC pašalinti ir sudėti mano source. Kas svarbu- “midlevares"- klasė “PRINTER". Pagrindiniam “src": usbd_princer_if.c - printerio ryšis su USB, usbd_conf ir usb_desc - ne pilnai išvalyti nuo CDC klasės ir kiek pribūrta dėl MS deskriptoriaus.
Tačiau jei laikyti kodą teisingu, tai useriui reikalingas tik vienas failas- printer_hardware.c. Tai pats fizinis spausdinimas. Šiuo metu nuvestas į USARTą. Prisijungus išorinį UART (COM adapterį) galima lengvai debuginti ir monitorinti kas vyksta.

Dėmesio! Nepergeneruokit kubiko kodo, nes nužudys kai kuriuos failus.

Download STM32CubeMX USB PRINTER CLASS demo code (source and compiled hex for bluepill STM32F103C8.

Kodėl tai sunkiai einasi ir kodėl dedu nepilną kodą? Todėl, kad nėra free programų, kurie lengvai analizuotu kas vyksta ant USB. Todėl, kad dokumentacijos labai mažai- daug kas rašo kodą ir daro aparačiukus kurie naudoją printerius, tačiau visiškai niekas nedaro pačių printerių. Todėl, kad USB.ORG tik apibrėžė klasę, o realiam pasaulyje tiek microsoftas, tie obuolys, tie printerių gamintojai prisigalvojo savo “piblūdų ir navarotų" kuriuos mažai kur viešai publikavo. Ir dar aišku, visiškai nėra laiko tokiems žaidimams, o ir šiaip, nėra tiek žinių, kad greitai perprasti svetimą kodą. Ypač kai kodą rašo narkomanai- vien ko vertas STM inžinierių “universalus" metodas bendrauti tarp usb device, usb interface ir userio kodo per pointerius ir pointerių struktūras. Ar pointerių struktūrų pointerius struktūruose per pointerius ar panašiai :) (gi narkomanai rašė).

O postinu, kad kiti gal pasinaudos, o ir pats turėsiu rezervinę kopiją.

5 Responses to “ARM:0018 STM32CubeMX hack - printerio klasė”

  1. Administrator Says:

    “Plūgą ir peilį" pataisiau:

    /* ************************************************************************
    Low-level function to report 1284 id string
    Input: pointer to buffer
    Returns: length of the string
    ************************************************************************ */
    uint16_t printer_hardware_id(unsigned char * pbuf)
    {
    static unsigned char Id1284String[] = "00MFG:Generic;MDL:Generic_/_Text_Only;CMD:1284.4;CLS:PRINTER;DES:TTY;";

    uint16_t length=sizeof(Id1284String);
    Id1284String[0]=(length >>8) & 0xFF;
    Id1284String[1]=length & 0xFF;
    // IEEE 1284 device ID string (including length in the first two bytes in big endian format).
    memcpy(pbuf,Id1284String,length);
    return length;
    }

    Pasirodo, reikėjo dar kartą perskaityti instrukciją. Nepastebėjau, kad 1284 eilutė turi turėti užkoduota jos pačios ilgį. OS sistema mat nesugeba nusiskaityti reporto ilgio… (Šiaip, tai suderinamumas su senoviška sistema, kai naudojo LPT portą ir laidą su Centronix jungtimis).

    STM32F103 printer device STM32CubeMX source code

  2. Algis Says:

    Labutis, Levai, kad Cubas neistrintu vartotojo pakeitimu, juos reikia deti ten, kur pasiulo pats cubas, o norimas ismesti dalis atskirti per salygine kompiliacija

  3. Administrator Says:

    Nu viena problema… Kadangi tai klasės perdarymas, tai po kubo regeneracijos source atsiranda vėl papildoma klasė- CDC. Source kodas lieka ir printerio klasės ir CDC. Tačiau pasikeičia USB deskriptoriai, atsiranda vėl nuorodos į CDC klasės inicializavimą (kai kurių paprogramių dubliai). Šiaip, eksperimentuojant vienu metu netgi buvo atsiradęs “multi" įrenginys pas kompą- serial portas ir printeris vienu metu. Gal net ir veiktu :)
    Aš nesu tikras, bet gal iš viso pašalinus USB klase, gal kubas neperdarytu kodo. Va jei kas nors išsiaiškintu, kaip padaryti savo “įskiepį" į kubo templeitus, tai galima susikurti savo klases.
    Dabar tenka daryti taip- sukonfiguruoji CDC, poto ant viršaus permeti visus USB failus ir turi printerį… (viską su CDC ištrini).

    Ir dar biški jaučiu, kad gali būti problemos su feikinėm STM mikroschemom. Projekto kodas išpampo ir gali netilpti į “pamažintas" ar padirbtas mikroschemas. Nes pastebiu kažkokius crazy momentus. Užsakiau tikrų STM iš digikėjaus ar mauzerio. Pažiūrėsiu, ar mistika dings.

  4. Gediminas Says:

    Weireshark moka usb srautą stebėti, ir nemokamas. Ar to nepakanka?

    https://desowin.org/usbpcap/

  5. Administrator Says:

    Nuskanavus srautą su Laidiniu Rykliu buvo aptiktas bugas. Printerio aprašas buvo perduodamas per didelis- tiek kiek prašo hostas, o reikėjo perduoti tik tiek, kiek reikia sutalpinti aprašui. Mažas pakeitimas sukėle didelius pokyčius kode. Kogero netgi aš nekaltas dėl to, o kiek kūbo kūrėjai.

    New version of USB PRINTER device for STM32f103 (STM32CunbeMX) with proper lenght in printer internals description.

Leave a Reply

Bot-Check (Jei ne skaičiai spauskit refresh. Tik oranžinius naudoti.)

Unhappy Tikbalang