USB Device - Joystick/Mouse
1.0
|
#include "usb.h"
#include "hal.h"
#include "led.h"
#include "log.h"
#include "stm32f4xx.h"
#include "usb_defines.h"
#include "usb_regs.h"
Macros | |
#define | USB_GINTMSK (USB_OTG_GREGS *)(USB_OTG_FS_BASE_ADDR + 0x18) |
Registr preruseni. More... | |
#define | USB_G_BASE (USB_OTG_GREGS *)(USB_OTG_FS_BASE_ADDR ) |
Core registr. More... | |
#define | USB_D_BASE (USB_OTG_DREGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_DEV_GLOBAL_REG_OFFSET) |
Device registr. More... | |
#define | USB_H_BASE (USB_OTG_HREGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_HOST_GLOBAL_REG_OFFSET ) |
Host registr - neni pouzit. More... | |
#define | PGGCCTL_BASE (uint32_t *)(USB_OTG_FS_BASE_ADDR + USB_OTG_PCGCCTL_OFFSET) |
Registr pro power a hodiny. More... | |
#define | USB_EPx__IN(x) (USB_OTG_INEPREGS *) (USB_OTG_FS_BASE_ADDR + USB_OTG_DEV_IN_EP_REG_OFFSET + (x * USB_OTG_EP_REG_OFFSET)) |
IN endpointy. More... | |
#define | USB_EPx__OUT(x) (USB_OTG_OUTEPREGS *) (USB_OTG_FS_BASE_ADDR + USB_OTG_DEV_OUT_EP_REG_OFFSET + (x * USB_OTG_EP_REG_OFFSET)) |
OUT enpointy. More... | |
#define | USB_HC_REGS(x) (USB_OTG_HC_REGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_HOST_CHAN_REGS_OFFSET + (x * USB_OTG_CHAN_REGS_OFFSET)) |
HOST registry - nepouzity. More... | |
#define | USB_HC_FIFOS(x) (uint32_t *)(USB_OTG_FS_BASE_ADDR + USB_OTG_DATA_FIFO_OFFSET + (x * USB_OTG_DATA_FIFO_SIZE)) |
FIFO pro registry. More... | |
Functions | |
void | DelayUsec (const uint32_t _usec) |
Funkce aktivne ceka. More... | |
void | FlushFifoTx (uint32_t _ep) |
Splachni TX FIFO pro dany endpoint. More... | |
void | FlushFifoRx () |
Splachni RX FIFO pro vsechny EP. More... | |
void | enableDevInt () |
Povoli vsechny potrebna preruseni Hlavne usbreset,enumdone,inepintr,outepintr,rxstsqlvl. More... | |
void | initEps () |
Inicializace vsechny user IN a OUT Endpointuu Inicializuje 4 IN a 4 OUT user endpointy. More... | |
void | USBInit () |
Vlastni inicializace USB Funkce nastavi GPIO piny. More... | |
void | EPActivate (uint8_t _epAddr, uint16_t _maxPacket, uint8_t _epType) |
Aktivace endpointu Aktivuje endpoint s adresou _epAddr, max velikosti packetu _maxPacket a nastavi typ endpointu na _epType. More... | |
void | EPClose (uint8_t _epAddr) |
Uzavre dany EP. More... | |
void | EP0StartXfer (__IO SUsbEP *_ep) |
Zapocne prenos na EP0 a podle _ep na EP OUT nebo IN. More... | |
void | EPStartXfer (__IO SUsbEP *_ep) |
Zapocne prenos na EP IN podle _ep. More... | |
void | EPTransfer (uint8_t _epAddr, __IO uint8_t *_buff, uint16_t _buffLen) |
Prenos EP. More... | |
void | EPReceive (uint8_t _epAddr) |
Analogie k funkce EPTransfer. More... | |
void | CtlSendData (__IO uint8_t *_buff, uint16_t _buffLen) |
Odesle data na EP0. More... | |
uint16_t | usbMemcpy (uint8_t *_pbuf, char const *_str, uint16_t _len) |
NEFUNKNCI Pripravi v bufferu _pbuf string z _str o velikosti _len. More... | |
void | ReadPacket (__IO uint8_t *_dest, uint16_t _len) |
Precte z EP0 FIFO packet a ulozi do _dest. More... | |
void | parseSetupRequest (SUsbSetupPckt *_req) |
Rozparsuje data ze setupPacket do _req. More... | |
void | WritePacket (__IO uint8_t *_buff, uint8_t _epnum, uint16_t _len) |
Analogie k ReadPacket. More... | |
void | WriteEmpTXFifo (uint32_t epnum) |
Zkontroluje jestli dany ep nema jeste data pro FIFO. More... | |
void | DataInStageIN (uint8_t _epNum) |
Posle DATA packet na USB. More... | |
void | getDescriptor (SUsbSetupPckt *_req) |
Posle descriptor dle dotazu v _req. More... | |
void | setAddress (SUsbSetupPckt *_req) |
Nastavi adresu pri SET ADDRESS packetu. More... | |
void | setConfig (SUsbSetupPckt *req) |
Nastavi konfiguraci USB a aktivuje EP1 pro odesilani dat. More... | |
void | DeviceRequest (SUsbSetupPckt *req) |
Zjisti o jaky request se jedna a zavola prislusnou funkci. More... | |
void | InterfaceRequest (SUsbSetupPckt *req) |
Odesle/Odpovi na dotaz na interface. More... | |
void | OTG_FS_IRQHandler (void) |
Preruseni od USB. More... | |
void | hard_fault_handler_c (unsigned int *hardfault_args) |
Funkce je volana pri hard fault. More... | |
void | USBSendMouseMove (uint8_t *_mouseStat, uint16_t _len) |
Uzivatelska funkce pro odeslani pohybu mysi. More... | |
Variables | |
__IO USB_OTG_GREGS * | usbGREGS |
Global registers. More... | |
__IO USB_OTG_DREGS * | usbDREGS |
Device registers. More... | |
__IO USB_OTG_HREGS * | usbHREGS |
Host registers. More... | |
__IO USB_OTG_INEPREGS * | inEndpoints [MAX_EPS] |
Endpoints in registers. More... | |
__IO USB_OTG_OUTEPREGS * | outEndpoints [MAX_EPS] |
Endpoints out registers. More... | |
__IO uint32_t * | PGCCTLREG |
PGCCTL register. More... | |
__IO uint32_t * | usbDFIFO [USB_OTG_MAX_TX_FIFOS] |
Device dndpoint FIFOS. More... | |
__IO SUsbEP | inLocEPs [MAX_EPS] |
Lokalni endpointy, jejich data apod. More... | |
__IO SUsbEP | outLocEps [MAX_EPS] |
Lokalni endpointy, jejich data apod. More... | |
__IO uint8_t | setupPacket [8 *3] |
SetuPackets. More... | |
__IO EDevState | deviceState |
Stav zarizeni pri prijimani DATA/SETUP. More... | |
__IO EDevStatus | deviceStatus |
Faze zariyeni DEFAULT - ADDRESSED - CONFIGURED apod.... More... | |
__IO uint8_t | usbConfig |
Id konfigurace - v tomto pripade nepouzito. More... | |
#define PGGCCTL_BASE (uint32_t *)(USB_OTG_FS_BASE_ADDR + USB_OTG_PCGCCTL_OFFSET) |
Registr pro power a hodiny.
#define USB_D_BASE (USB_OTG_DREGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_DEV_GLOBAL_REG_OFFSET) |
Device registr.
#define USB_EPx__IN | ( | x | ) | (USB_OTG_INEPREGS *) (USB_OTG_FS_BASE_ADDR + USB_OTG_DEV_IN_EP_REG_OFFSET + (x * USB_OTG_EP_REG_OFFSET)) |
IN endpointy.
#define USB_EPx__OUT | ( | x | ) | (USB_OTG_OUTEPREGS *) (USB_OTG_FS_BASE_ADDR + USB_OTG_DEV_OUT_EP_REG_OFFSET + (x * USB_OTG_EP_REG_OFFSET)) |
OUT enpointy.
#define USB_G_BASE (USB_OTG_GREGS *)(USB_OTG_FS_BASE_ADDR ) |
Core registr.
#define USB_GINTMSK (USB_OTG_GREGS *)(USB_OTG_FS_BASE_ADDR + 0x18) |
Registr preruseni.
#define USB_H_BASE (USB_OTG_HREGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_HOST_GLOBAL_REG_OFFSET ) |
Host registr - neni pouzit.
#define USB_HC_FIFOS | ( | x | ) | (uint32_t *)(USB_OTG_FS_BASE_ADDR + USB_OTG_DATA_FIFO_OFFSET + (x * USB_OTG_DATA_FIFO_SIZE)) |
FIFO pro registry.
#define USB_HC_REGS | ( | x | ) | (USB_OTG_HC_REGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_HOST_CHAN_REGS_OFFSET + (x * USB_OTG_CHAN_REGS_OFFSET)) |
HOST registry - nepouzity.
void CtlSendData | ( | __IO uint8_t * | _buff, |
uint16_t | _buffLen | ||
) |
Odesle data na EP0.
Funkce slouzi pro odesilani deskriptoruu
_buff | Buffer s SETUP daty |
_buffLen | velikost dat v SETUP datech |
void DataInStageIN | ( | uint8_t | _epNum | ) |
Posle DATA packet na USB.
_epNum | Cislo endpointu |
void DelayUsec | ( | const uint32_t | _usec | ) |
Funkce aktivne ceka.
Cekani zavisi na nastavene rychlosti/zatizeni CPU
@param _usec pocet mikrosekund k cekani
void DeviceRequest | ( | SUsbSetupPckt * | req | ) |
Zjisti o jaky request se jedna a zavola prislusnou funkci.
req | Request |
void enableDevInt | ( | ) |
Povoli vsechny potrebna preruseni Hlavne usbreset,enumdone,inepintr,outepintr,rxstsqlvl.
void EP0StartXfer | ( | __IO SUsbEP * | _ep | ) |
Zapocne prenos na EP0 a podle _ep na EP OUT nebo IN.
_ep | Endpoint, ktery slouzi jako EP0 |
void EPActivate | ( | uint8_t | _epAddr, |
uint16_t | _maxPacket, | ||
uint8_t | _epType | ||
) |
Aktivace endpointu Aktivuje endpoint s adresou _epAddr, max velikosti packetu _maxPacket a nastavi typ endpointu na _epType.
_epAddr | Adresa endpointu |
_maxPacket | Maximalni velikost packetu |
_epType | Typ endpointu |
void EPClose | ( | uint8_t | _epAddr | ) |
Uzavre dany EP.
_epAddr | Adresa endpointu |
void EPReceive | ( | uint8_t | _epAddr | ) |
Analogie k funkce EPTransfer.
Na zaklade adresy epAddr, pripravy dany OUT EP pro prijem
_epAddr | Adresa endpointu |
void EPStartXfer | ( | __IO SUsbEP * | _ep | ) |
Zapocne prenos na EP IN podle _ep.
_ep | Endpoint, na kterem to budeme prenaset |
void EPTransfer | ( | uint8_t | _epAddr, |
__IO uint8_t * | _buff, | ||
uint16_t | _buffLen | ||
) |
Prenos EP.
Pripravi user ep a zavola fce EP0StartXfer nebo EPStartXfer na zaklade _epAddr
_epAddr | Adresa endpointu |
_buff | Buffer s daty, ktere budu prenaset |
_buffLen | Velikost dat v _buff |
void FlushFifoRx | ( | ) |
Splachni RX FIFO pro vsechny EP.
void FlushFifoTx | ( | uint32_t | _ep | ) |
Splachni TX FIFO pro dany endpoint.
_ep | Endpoint, pro ktery mazu FIFO |
void getDescriptor | ( | SUsbSetupPckt * | _req | ) |
Posle descriptor dle dotazu v _req.
_req | Request |
void hard_fault_handler_c | ( | unsigned int * | hardfault_args | ) |
Funkce je volana pri hard fault.
Ve funkci je mozna zkontrolovat registry, ulozene adresy a dalsi... Slouzi pro DEBUG pri chybe. Napr. pri pristupu mimo pamet.
hardfault_args | ulozene argumenty hard faultu |
void initEps | ( | ) |
Inicializace vsechny user IN a OUT Endpointuu Inicializuje 4 IN a 4 OUT user endpointy.
Kazdy nastavi jako kontrolni. Priradi Velikost FIFO, Cislo EP,
void InterfaceRequest | ( | SUsbSetupPckt * | req | ) |
Odesle/Odpovi na dotaz na interface.
req | Request |
void OTG_FS_IRQHandler | ( | void | ) |
Preruseni od USB.
Zavola prislusnou funkci, ktera preruseni zpracuje
void parseSetupRequest | ( | SUsbSetupPckt * | _req | ) |
Rozparsuje data ze setupPacket do _req.
_req | cil usb setup packet struct |
void ReadPacket | ( | __IO uint8_t * | _dest, |
uint16_t | _len | ||
) |
Precte z EP0 FIFO packet a ulozi do _dest.
_dest | Buffer, do ktereho se ulozi prijata data |
_len | Bisto v _dest |
void setAddress | ( | SUsbSetupPckt * | _req | ) |
Nastavi adresu pri SET ADDRESS packetu.
_req | Request |
void setConfig | ( | SUsbSetupPckt * | req | ) |
Nastavi konfiguraci USB a aktivuje EP1 pro odesilani dat.
req | Request |
void USBInit | ( | ) |
Vlastni inicializace USB Funkce nastavi GPIO piny.
Priradi Pinum alternativni funkci USB FS. Nastavi zakladni adresy promennym pro obsluhu USB registruu. Dle manualu nastavi usb CORE pro prijem usbreset. Predpriravi EP.
uint16_t usbMemcpy | ( | uint8_t * | _pbuf, |
char const * | _str, | ||
uint16_t | _len | ||
) |
NEFUNKNCI Pripravi v bufferu _pbuf string z _str o velikosti _len.
_pbuf | Buffer do ktereho se cpe usb string packet |
_str | string ktery se bude cpat do _pbuf |
_len | velikost _str |
void USBSendMouseMove | ( | uint8_t * | _mouseStat, |
uint16_t | _len | ||
) |
Uzivatelska funkce pro odeslani pohybu mysi.
_mouseStat | pole bytu se stavem(pohybem) mysi |
_len | velikost (pocet bajtu) v _mouseStat |
void WriteEmpTXFifo | ( | uint32_t | epnum | ) |
Zkontroluje jestli dany ep nema jeste data pro FIFO.
epnum | Endpoint ke kontrole |
void WritePacket | ( | __IO uint8_t * | _buff, |
uint8_t | _epnum, | ||
uint16_t | _len | ||
) |
Analogie k ReadPacket.
Zapise data z _buff do FIFO daneho ep(_epnum)
_buff | Buffer s daty k zapsani do FIFO |
_len | velikost dat k zapsani |
_epnum | cislo endpointu |
__IO EDevState deviceState |
Stav zarizeni pri prijimani DATA/SETUP.
__IO EDevStatus deviceStatus |
Faze zariyeni DEFAULT - ADDRESSED - CONFIGURED apod....
__IO USB_OTG_INEPREGS* inEndpoints[MAX_EPS] |
Endpoints in registers.
__IO USB_OTG_OUTEPREGS* outEndpoints[MAX_EPS] |
Endpoints out registers.
__IO uint32_t* PGCCTLREG |
PGCCTL register.
__IO uint8_t setupPacket[8 *3] |
SetuPackets.
__IO uint8_t usbConfig |
Id konfigurace - v tomto pripade nepouzito.
__IO uint32_t* usbDFIFO[USB_OTG_MAX_TX_FIFOS] |
Device dndpoint FIFOS.
__IO USB_OTG_DREGS* usbDREGS |
Device registers.
__IO USB_OTG_GREGS* usbGREGS |
Global registers.
__IO USB_OTG_HREGS* usbHREGS |
Host registers.