Zpět na domů

USB 1.0 ovladač na SpinalHDL: implementace

Článek popisuje implementaci USB 1.0 hostového ovladače na SpinalHDL pro RISC-V SoC. Pokrývá fyzickou vrstvu, protokol, deskriptory HID, hardwareové FSM a ovladač. Příklady testování s klávesnicí, myší, gamepadem.

SpinalHDL USB 1.0: od protokolu po FPGA
Advertisement 728x90

# 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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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í:

Google AdInline article slot
  • 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

Advertisement 728x90

Číst dál