From 2d9da87cd764daff77850b9fbb74281e6fa7a891 Mon Sep 17 00:00:00 2001 From: eddyem Date: Tue, 30 Apr 2019 11:49:39 +0300 Subject: [PATCH] USB HID is working! --- F0-nolib/USBHID/Makefile | 2 +- F0-nolib/USBHID/main.c | 5 ++-- F0-nolib/USBHID/usb.c | 39 +++++++++++++++++++++++------ F0-nolib/USBHID/usb_lib.c | 49 +++++++++++++++++++++++++++++++------ F0-nolib/USBHID/usb_lib.h | 3 +-- F0-nolib/USBHID/usbhid.bin | Bin 6564 -> 4824 bytes 6 files changed, 79 insertions(+), 19 deletions(-) diff --git a/F0-nolib/USBHID/Makefile b/F0-nolib/USBHID/Makefile index b3a135a..8f4e7eb 100644 --- a/F0-nolib/USBHID/Makefile +++ b/F0-nolib/USBHID/Makefile @@ -8,7 +8,7 @@ MCU = F042x6 # hardware definitions DEFS += -DUSARTNUM=1 #DEFS += -DCHECK_TMOUT -DEFS += -DEBUG +#DEFS += -DEBUG # change this linking script depending on particular MCU model LDSCRIPT = stm32f042k.ld diff --git a/F0-nolib/USBHID/main.c b/F0-nolib/USBHID/main.c index a3749bb..f065509 100644 --- a/F0-nolib/USBHID/main.c +++ b/F0-nolib/USBHID/main.c @@ -101,7 +101,7 @@ int main(void){ RCC->CSR |= RCC_CSR_RMVF; // remove reset flags USB_setup(); - //iwdg_setup(); + iwdg_setup(); while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog @@ -123,11 +123,12 @@ int main(void){ SEND("connected\n"); break; case 'K': - send_word("Hello!"); + send_word("Hello!\n\n"); SEND("Write hello\n"); break; case 'M': move_mouse(100, 10); + move_mouse(0,0); SEND("Move mouse\n"); break; case 'R': diff --git a/F0-nolib/USBHID/usb.c b/F0-nolib/USBHID/usb.c index c89b808..b9811c8 100644 --- a/F0-nolib/USBHID/usb.c +++ b/F0-nolib/USBHID/usb.c @@ -28,22 +28,45 @@ static int8_t usbON = 0; // ==1 when USB fully configured -// interrupt IN handler (never used?) +static volatile uint8_t tx_succesfull = 0; + static uint16_t EP1_Handler(ep_t ep){ - uint8_t epbuf[10]; - if (ep.rx_flag){ - MSG("EP1 OUT\n"); + /*if (ep.rx_flag){ + MSG("EP1 OUT: "); +#ifdef EBUG + printu(ep.rx_cnt); + newline(); +#endif + uint8_t epbuf[10]; EP_Read(1, epbuf); ep.status = SET_VALID_TX(ep.status); ep.status = KEEP_STAT_RX(ep.status); - }else if (ep.tx_flag){ - MSG("EP1 IN\n"); + }else */ + if (ep.tx_flag){ + MSG("EP1 IN: "); +#ifdef EBUG + printu(ep.rx_cnt); + newline(); +#endif + tx_succesfull = 1; ep.status = SET_VALID_RX(ep.status); ep.status = SET_STALL_TX(ep.status); } return ep.status; } +/** + * @brief EP_WaitTransmission - wait until data transmitted (or timeout) + * @param number - EP number + * @return 0 if all OK, 1 if timed out + */ +static uint8_t EP_WaitTransmission(){ + uint32_t ctr = 1000000; + while(--ctr && tx_succesfull == 0); + if(!tx_succesfull) return 1; + return 0; +} + void USB_setup(){ RCC->APB1ENR |= RCC_APB1ENR_CRSEN | RCC_APB1ENR_USBEN; // enable CRS (hsi48 sync) & USB RCC->CFGR3 &= ~RCC_CFGR3_USBSW; // reset USB @@ -69,7 +92,7 @@ void usb_proc(){ if(USB_GetState() == USB_CONFIGURE_STATE){ // USB configured - activate other endpoints if(!usbON){ // endpoints not activated SEND("Configure endpoints\n"); - EP_Init(1, EP_TYPE_INTERRUPT, 10, 10, EP1_Handler); // IN1 - transmit + EP_Init(1, EP_TYPE_INTERRUPT, 10, 0, EP1_Handler); // IN1 - transmit usbON = 1; } }else{ @@ -81,7 +104,9 @@ void USB_send(uint8_t *buf, uint16_t size){ uint16_t ctr = 0; while(size){ uint16_t s = (size > USB_TXBUFSZ) ? USB_TXBUFSZ : size; + tx_succesfull = 0; EP_Write(1, (uint8_t*)&buf[ctr], s); + if(EP_WaitTransmission()) SEND("Err\n"); size -= s; ctr += s; } diff --git a/F0-nolib/USBHID/usb_lib.c b/F0-nolib/USBHID/usb_lib.c index a4f431b..8be6fb1 100644 --- a/F0-nolib/USBHID/usb_lib.c +++ b/F0-nolib/USBHID/usb_lib.c @@ -26,7 +26,7 @@ #include // memcpy #include "usart.h" -ep_t endpoints[ENDPOINTS_NUM]; +static ep_t endpoints[ENDPOINTS_NUM]; //static uint8_t set_featuring; static usb_dev_t USB_Dev; @@ -78,7 +78,7 @@ static const uint8_t USB_DeviceQualifierDescriptor[] = { bNumConfigurations, // bNumConfigurations 0x00 // Reserved }; -#if 0 + static const uint8_t HID_ReportDescriptor[] = { 0x05, 0x01, /* Usage Page (Generic Desktop) */ 0x09, 0x02, /* Usage (Mouse) */ @@ -140,8 +140,8 @@ static const uint8_t HID_ReportDescriptor[] = { 0x81, 0x00, /* Input (Data, Array) */ 0xC0 /* End Collection,End Collection */ }; -#endif +#if 0 const uint8_t HID_ReportDescriptor[] = { 0x05, 0x01, /* Usage Page (Generic Desktop) */ 0x09, 0x06, /* Usage (Keyboard) */ @@ -183,6 +183,7 @@ const uint8_t HID_ReportDescriptor[] = { 0xC0 /* End Collection,End Collection */ }; +#endif static const uint8_t USB_ConfigDescriptor[] = { /*Configuration Descriptor*/ @@ -318,6 +319,37 @@ static inline void std_h2d_req(){ } } +static uint16_t WriteHID_descriptor(uint16_t status){ + uint16_t rest = sizeof(HID_ReportDescriptor); + uint8_t *ptr = (uint8_t*)HID_ReportDescriptor; + while(rest){ + uint16_t l = rest; + if(l > endpoints[0].txbufsz) l = endpoints[0].txbufsz; + EP_WriteIRQ(0, ptr, l); + ptr += l; + rest -= l; + MSG("Sent\n"); + uint8_t needzlp = (l == endpoints[0].txbufsz) ? 1 : 0; + if(rest || needzlp){ // send last data buffer + status = SET_NAK_RX(status); + status = SET_VALID_TX(status); + status = KEEP_DTOG_TX(status); + status = KEEP_DTOG_RX(status); + status = CLEAR_CTR_RX(status); + status = CLEAR_CTR_TX(status); + USB->ISTR = 0; + USB->EPnR[0] = status; + uint32_t ctr = 1000000; + while(--ctr && (USB->ISTR & USB_ISTR_CTR) == 0); + if((USB->ISTR & USB_ISTR_CTR) == 0){MSG("ERR\n")}; + USB->ISTR = 0; + status = USB->EPnR[0]; + if(needzlp) EP_WriteIRQ(0, (uint8_t*)0, 0); + } + } + return status; +} + /* bmRequestType: 76543210 7 direction: 0 - host->device, 1 - device->host @@ -347,11 +379,10 @@ static uint16_t EP0_Handler(ep_t ep){ epstatus = SET_VALID_TX(epstatus); break; case STANDARD_INTERFACE_REQUEST_TYPE: - WRITEDUMP("IFACE "); if(dev2host && setup_packet.bRequest == GET_DESCRIPTOR){ if(setup_packet.wValue == HID_REPORT_DESCRIPTOR){ WRITEDUMP("HID_REPORT"); - wr0(HID_ReportDescriptor, sizeof(HID_ReportDescriptor)); + epstatus = WriteHID_descriptor(epstatus); } } epstatus = SET_NAK_RX(epstatus); @@ -393,7 +424,9 @@ static uint16_t EP0_Handler(ep_t ep){ // here we can do something with ep.rx_buf - set_feature }*/ // Close transaction +#ifdef EBUG hexdump(ep.rx_buf, ep.rx_cnt); +#endif epstatus = CLEAR_DTOG_RX(epstatus); epstatus = CLEAR_DTOG_TX(epstatus); // wait for new data from host @@ -480,9 +513,9 @@ int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, uint16_t // standard IRQ handler void usb_isr(){ + // disallow interrupts + USB->CNTR = 0; if (USB->ISTR & USB_ISTR_RESET){ - // Reinit registers - USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM; USB->ISTR = 0; // Endpoint 0 - CONTROL // ON USB LS size of EP0 may be 8 bytes, but on FS it should be 64 bytes! @@ -532,6 +565,8 @@ void usb_isr(){ // refresh EPnR USB->EPnR[n] = epstatus; } + // allow interrupts + USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM; } /** diff --git a/F0-nolib/USBHID/usb_lib.h b/F0-nolib/USBHID/usb_lib.h index 2ea9cba..5083668 100644 --- a/F0-nolib/USBHID/usb_lib.h +++ b/F0-nolib/USBHID/usb_lib.h @@ -189,7 +189,7 @@ typedef struct { uint16_t wLength; } __attribute__ ((packed)) usb_cdc_notification; -extern ep_t endpoints[]; +//extern ep_t endpoints[]; void USB_Init(); uint8_t USB_GetState(); @@ -199,7 +199,6 @@ void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size); int EP_Read(uint8_t number, uint8_t *buf); usb_LineCoding getLineCoding(); - void WEAK linecoding_handler(usb_LineCoding *lc); void WEAK clstate_handler(uint16_t val); void WEAK break_handler(); diff --git a/F0-nolib/USBHID/usbhid.bin b/F0-nolib/USBHID/usbhid.bin index 9acc3b897f623d58cc48ce2f99ab342f8e4f337e..ced42f23df1cac2d04da984482aecadc0641223e 100755 GIT binary patch delta 2609 zcma)83v5&86+Zv9o!CxDoH(J59jNU~AmIW{2u!@DUVO<<;+qyqcqU=;5(i9hNPwh@ zRyJQKln|(zIJDS1H;tGk zp>CEwpYNRW{ZF6s%R}XliY#CQXIVBF7b8j#y*Z8$Xb#MLG@ftzCaDSj7fk<$=G*7U z1LM0{|Gm%&L+@{o$QKR#$}Rw>69GQpj}9kBKBL>{>$HMSjAZuBlFdEl%Nf0o4;6OX zSSxSi)+pBWxepul*c^fc7XatN(brp#9k`XGxVo)2fbDSV`YV*6A^FWCQDBQSXh{*)WVfoQa&CT z-8A4yJgT8BwjI)b`-upY%#K~F$QxTn&#GzMR>jD9@N@&QH@tEe;SN69QCMYR6maDR za-=G6jdW5Ks67&8C1;ped5H*oMJ2;qg;IAoQp1C@fo}A#^GZ%Ue**=^>hp-q1X&H7 zPHCW@9jwB6gl%{TC_tXP#!%8hJ1<3lB5%z&lzYjyi8>0b5?+@x%!DJSB>C?dYlu^J zWiBqOpx-pZ#0V6vt3EzlM`&*rs@z>o7?0!HoDDiK|B|E%NNXC%{Cck^Z{MMPU?+xjTgR7Zz(@?Hu(q?hTl zb&nsaOV4^p+(yyjvbROqSC)pc7A@e2*!W6b7HonP(GP25dvL6Lg;_rq0+u*aldVa@vTgrRdr=8FU~EYTV|;|tKhq6VqS2A8x$_lZPt!aR77Wt7 z>g9#zB`{_#5-Hmz(5sQLf`y>XLsD5Y#m*@1PFOglu${m$v5ges8#Pnji*FHTLSXMJU%zFY*3jCcr09&>I{8bNd z=@Nit1W6~jAbw!VU9k4|G?W1-q{{aBP_2Ykl^> zaeN2tXy2K(7)P7!to1!^J|aABu8AX1W^#R^G^c6^pup-WIW?vc{)tHl;ZjhdD#gH2^F7ba*+b$$4Kv{KC{OEVHJm z#^x}=tjG{*7iR$`EQAQj>?1smbrA>c#r%Fs&DNzCK8Iip(!g z)0zIeWgp^%FZf1HpgQ*4cqaBZh~VZH+KFA~76rDU*XGZ}#R?5UdPYuvqePlfn+Lcl)! zXDq5ZIzz(h@kk!WKU(Dt!~N~&=t?}%vqY3WQ&%8MByN7W;k`xTcf5~%8cV9n#1+8E zz#3cwboKt!?U2t7PC5b&FCXyOXT9*vxc;1S=HI{d%5}YL~ds2RxU1O0Hv#(qR`@aFPqD*4| delta 4356 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 A8vp