# Implementace host kontroléru USB 1.0 v SpinalHDL pro RISC-V SoC
Vývoj syntetizovatelného systému na čipu na bázi RISC-V vyžaduje integraci moderních periferiálních rozhraní. Host kontrolér USB 1.0 umožňuje připojit HID zařízení pro vstup: klávesnice, myši, gamepady. Implementace v SpinalHDL zajišťuje hardwarovou zpracování protokolu bez softwarových kompromisů PS/2 nebo analogových joysticků.
Fyzická vrstva USB používá diferenciální pár D+ a D-, linky VBUS a GND. Režim poloduplexního přenosu odlišuje USB od UART: data se přenáší bit po bitu v jednom směru s povinným rozdělením rolí host a device.
Fyzická vrstva USB 1.0
Elektrické vlastnosti určují úrovně signálů: idle stav na D+ a D- určuje rychlost. Low-speed (1.5 Mbit/s) — D- vysoký, full-speed (12 Mbit/s) — D+ vysoký. Kódování NRZI: přechod signálu kóduje '1', absence — '0'. Synchronizace prostřednictvím bit stuffing: po šesti stejných bitech se vloží invertovaný bit.
Služební signály:
- SE0 (Single Ended Zero): oba D+/D- nízké — pro reset sběrnice.
- J/K stavy: diferenciální úrovně pro idle a rychlost.
- Chirp: výměna K/J pro určení rychlosti hubu.
Přenos začíná SYNC (8 bitů '0'), za ním následuje PID (Packet ID).
Protokol USB: pakety a transakce
PID určuje typ paketu:
- Tokeny: SETUP (řídicí požadavky), IN (čtení), OUT (zápis), SOF (start of frame).
- Data: DATA0/1 (toggle bity pro integritu).
- Handshake: ACK (potvrzení), NAK (odmítnutí), STALL (chyba).
Transakce:
- Control Transfer: SETUP + DATA (volitelně) + IN/OUT + ACK.
- Interrupt Transfer: IN/OUT + DATA + ACK — pro HID zprávy.
- Bulk Transfer: velké bloky s retry.
- Isochronous: bez handshake, pro proudy.
Kontrolní součty: CRC5 pro tokeny, CRC16 pro data. Formule:
// CRC5 pro adresu/konec
crc5_next = crc5_reg ^ data_in;
// Polynom: x^5 + x^2 + 1 (0b001101)
Deskriptory a inicializace zařízení
Deskriptory popisují zařízení:
- Device Descriptor: bLength=18, bDescriptorType=1, idVendor, idProduct.
- Configuration Descriptor: bConfigurationValue, maxPower.
- Interface/Endpoint: bInterfaceClass (HID=3), bEndpointAddress, bmAttributes (interrupt).
- HID Descriptor: bcdHID, bCountryCode, Report Descriptor.
Inicializace:
- Bus Reset (SE0 >10 μs).
- GET_DESCRIPTOR (Device).
- SET_ADDRESS.
- GET_DESCRIPTOR (Configuration).
- SET_CONFIGURATION.
Pro HID se přidává GET_DESCRIPTOR (Report). Příklad zprávy klávesnice: modifier byte + reserved + 6 keycodes.
Hardwarová implementace v SpinalHDL
Kontrolér je postaven jako hierarchie konečných automatů:
- USBMain: hlavní FSM, řídí sekvenci.
- USBSendSE0: generování SE0 pro reset.
- USBSendShortToken: krátké tokeny (SOF).
- USBSendLongToken: plné tokeny (addr+endp).
- USBSendData: NRZI kódování + bit stuffing.
- USBReceiver: dekódování NRZI, CRC kontrola.
Rozhraní:
import spinal.core._
case class USB_IO() extends Bundle {
val dpp = in Bool()
val dpn = in Bool()
val txen = out Bool()
val txdp = out Bool()
val txdn = out Bool()
}
Apb3USB10Ctrl integruje do SoC přes APB3. Taktování: 48 MHz pro full-speed.
Integrace do KarnixSoC a ovladač
Připojení: USB Type A na desce „Karno“, vývod signálů z FPGA. Konfigurace SpinalHDL přidává modul do topu.
Ovladač v C pro RISC-V:
- usb10_bus_reset(): SE0 20 μs.
- usb10_in_request(): IN token + DATA1 + ACK.
- usb10_setup_request(): SETUP + DATA + IN.
Inicializace: usb10_init() detekuje zařízení, čte deskriptory, nastavuje adresu.
Testování s HID zařízeními
Aplikace karnix_usb10_test:
- Gamepad: analogové osy, tlačítka v interrupt endpoint 1.
- Myš: X/Y delta, tlačítka v 4-bytových zprávách.
- Klávesnice: boot protocol, 8-bytové zprávy (modifikátory + klávesy).
Integrace do TetRISC-V: nahrazení PS/2 za USB vstup.
Co je důležité:
- USB 1.0 full-speed (12 Mbit/s) je realizováno FSM bez MACRO-IP.
- SpinalHDL generuje RTL pro syntézu na FPGA.
- HID boot protocol zjednodušuje ovladač pro klávesnici/myš.
- NRZI + bit stuffing vyžadují přesné načasování (48 MHz clk).
- CRC5/16 ověření zabraňuje chybám paketů.
— Editorial Team
Zatím žádné komentáře.