ARM:0012 STM32CubeMX – USB HID pele

Sekantis projektas iš konservų dėžutės vardu STM32CubeMX- pelė. Tai bus USB HID (human interface device) pelė. Pradedam nuo pelės, nes ji sugeneruojama automatiškai ir nereikia vargti su įrenginio aprašymų košmaru (device descriptor). Viską darom kai su virtualiu COM portu, tik pasirenkam kitą įrenginį:

STM32CubeMx HID mouse
HID klasė, daugiau pas kubika nieko nepakeisi (o gaila, nes norėturi didesnės klasių bibliotekos. O ir čia niekur neparašyta, kad čia ne paprastas HID, kas gali būti bet kas, o paprasčiausia pelė).

Sugeneruojam kodą, perkeliam PS2 kodą ir senesnio projekto. Kodėl? Nu gerai, galima nekelti. Bet aš taip vedu iki klavietūros projekto.

Toliau mums beveik nieko nereikia keisti. Pertraukimų faile viskas kaip ir buvo, tik kiek pakeičiau PS2 apdorojimą, dabar PINo numeris perduodamas išoriškai, todėl nebereikia perkonfiguruoti PS apdorojimo failų- jie tapo universalūs. Pasižiūrėkit į puslapio gale esanti source kodą.

Dabar apie svarbiausius pokyčius kurie minimalūs ir visi tupi “main.c” failę:

/* USER CODE BEGIN Includes */
#include "PS2/PS2Keyboard.c"
#include "usbd_hid.h"
/* USER CODE END Includes */
. . . . . . . . .
extern USBD_HandleTypeDef hUsbDeviceFS;
. . . . . . . . .

Čia tik surašom, kad kompiliatorius nepyktu- męs naudojam mano PS klavietūros paprogrames ir “usbd_hid” komandas. Ir dar aišku USB įrenginio “nuoroda”.

Pelės pranešimas (report), jei pasinagrinėtume* deskriptorius, susideda iš 5 baitų. Bent jau taip sako:
“/Midleware/ST/STM32_USB_device_Library /Class/HID/Src/usbd_hid.c”

Galima tuos baitus sukelti į kokį nors buferį, bet žymiai gražiau atrodo struktūra:

// HID Mouse
struct mouseHID_t {
uint8_t buttons;
int8_t x;
int8_t y;
int8_t wheel;
uint8_t wakeup;
};
struct mouseHID_t mouseHID;

mouseHID.buttons = 0;
mouseHID.x = 0;
mouseHID.y = 0;
mouseHID.wheel = 0;
mouseHID.wakeup = 0;

Viskas aišku- mygtukai taip tik 3 bitai, x ir y – tai pelės poslinkis, wheel- tai sukutis, o wakeup- aš nežinau. Realiai veikia ir be paskutinio baito. Gal čia koks “magic number” kuris gali užmigdyti ir pažadinti kompą? Geras- paspaudi slaptą pelės mygtuką ir kompas užmiega.

Ir pagrindiniam cikle:

/* USER CODE BEGIN WHILE */
while (1)
{
unsigned char c=get_PS2scan_code();
switch(c)
{
case 0x09: mouseHID.x = 10; break;// desine
case 0x16: mouseHID.x = -10; break;// kaire
case 0x3e: mouseHID.y = -10; break;// virsus
case 0x2e: mouseHID.y = 10; break;// apacia
case 0x4b: mouseHID.buttons = 1; break;// mygtukas kaireje
case 0x2c: mouseHID.buttons = 2; break;// mygtukas desineje
case 0xf0: while(get_PS2scan_code()){}; break; // klaviso atspaudimas
}
if (c!=0) {
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*)&mouseHID, sizeof(struct mouseHID_t));
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(10 ); // rodos ne dazniau nei 10ms??
mouseHID.buttons = 0;
mouseHID.x = 0;
mouseHID.y = 0;
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*)&mouseHID, sizeof(struct mouseHID_t));
}
/* USER CODE END WHILE */

Kas čia vyksta? Viskas paprasta- nuskanuojama PS2 klavietūra. Jei kodas atitinka strėliukes, pajudinam pelę, jei tarpas ar enter – spaudžiojam pelės klavišus. Jei kodas 0xF0 išvalom klavietūros buferį. Nedidelis (10ms) užlaikymas teoriškai reikalingas, kad neužpildyti USB HID buferį. Kažkur buvo parašyta, kad HID reportas nedažniau 10ms.
Aš dar išsiunčiu užnulintą reportą- kažkaip man gražiau vaikščiojo kursorius ir nepatinka, kai “užlimpa” teksto pažymėjimas. Šiaip, programa nėra skirta tobulam pelės valdymui- dar čia man daug paslapčių.
Dar durniausia, kad LEDas indukuoja falšyvus suveikimus, tačiau pelė gražiai vaikšto. Gal gliukina PS2 klavietūros apdorojimas.

Dar pastebėjimas- jei jūsų pasidaryta pelė neveikia ar veikia keistai, išinstaliuokit jos draiverius ir lai windows vėl susiinstaliuoja. Tai ypač svarbu, jei eksperimentuojama su USB descriptoriais- windows ne visada atnaujina “mūsų USB įrenginio tobulėjimą”. 🙂

Visas source kodas, STM32CubeMX projektas ir sukompiliuoti binarai.

*) bliamba, “pasinagrinėtume”. Ten pražilti galima. USB konsorciumas taip ten viską užsuko, kad be čierkos nesuprasi. Yra kažkoks automatinis deskriptorių generavimo įrankis, kuris kiek padeda. Tačiau, kai tik pradedu kažką ten suprasti, vėl viskas susipainioja ir gaunasi šlamštas. Todėl patikėkit kad 5 baitai ir tiek. Jei suprasiu kaip ten viskas veikia, tikrai parašysiu.

Leave a Reply

Your email address will not be published. Required fields are marked *