void do_usb (void) { boot_os_fn *boot_fn; int res; u32 usb_inbuffer[512]; u32 total; u8 *addr; u32 bytes; int size; int cntr = 0; usb_msg (USBLOAD_CMD_FILE_REQ, "file req"); while(++cntr < 200000) /* try for 1 second then bail out */ { res = usb_recv ((u8 *) usb_inbuffer, sizeof (usb_inbuffer)); switch (usb_inbuffer[0]) { case USBLOAD_CMD_FILE: printf ("USBLOAD_CMD_FILE total = %d cmd = %c%c%c%c val = 0x%x val = 0x%x\n", res, ((char*)&usb_inbuffer[0])[0], ((char*)&usb_inbuffer[0])[1], ((char*)&usb_inbuffer[0])[2], ((char*)&usb_inbuffer[0])[3], usb_inbuffer[1], usb_inbuffer[2]); total = usb_inbuffer[1]; /* get size and address */ addr = (u8 *) usb_inbuffer[2]; usb_code (USBLOAD_CMD_ECHO_SZ, total); bytes = 0; while (bytes < total) { size = usb_recv ((u8 *) usb_inbuffer, sizeof (usb_inbuffer)); memcpy(addr, usb_inbuffer, size); addr += size; bytes += size; } usb_code (USBLOAD_CMD_REPORT_SZ, total); /* tell him we got this many bytes */ printf ("got file addr = 0x%x counter = %d\n", addr, cntr); usb_msg (USBLOAD_CMD_FILE_REQ, "file req"); /* see if they have another file for us */ cntr = 0; break; case USBLOAD_CMD_JUMP: printf ("USBLOAD_CMD_JUMP total = %d addr = 0x%x val = 0x%x\n", res, usb_inbuffer[0], usb_inbuffer[1]); boot_fn = (boot_os_fn *) usb_inbuffer[1]; boot_fn(); /* go to u-boot and maybe kernel */ break; default: break; } udelay(10); /* delay 10 us */ } printf("USB done\n"); hang(); }
msg256 read_data (std::shared_ptr<libusb_device_handle> dh, unsigned char cmd) { send_cmd (dh, cmd); // hey, give me the data! msg32 b = {{10, 11, 12, 13, 0, 0, 1, 0}}; usb_send (dh, b); return usb_recv (dh); }
void main(void) { char *entries[] = {"Replay", "Record", "From USB", "Halt", NULL}; gui_text_menu_t menu; U8 res; /* U32 nulldata[EFC_PAGE_WORDS] = {0}; for (res=128; res<140; res++) nx__efc_write_page(nulldata, res); */ menu.entries = entries; menu.title = "Tag route"; menu.active_mark = GUI_DEFAULT_TEXT_MARK; while (TRUE) { res = nx_gui_text_menu(menu); switch (res) { case 0: replay(ROUTE_FILE); break; case 1: record(ROUTE_FILE); break; case 2: usb_recv(); break; case 3: return; break; default: continue; break; } nx_display_string("\nOk to go back"); while (nx_avr_get_button() != BUTTON_OK); nx_systick_wait_ms(500); } }
static int usb_ymodem_rcv_pkt(struct ymodem_rcv * rx) { unsigned char * pkt = rx->pkt.hdr; unsigned char * cp; int ret = 0; int cnt = 0; #if XMODEM_SEQUENCE_CHECK int nseq; int seq; #endif int rem; int pos; int i; for (;;) { if ((ret = usb_send(CDC_TX_EP, &rx->sync, 1)) < 0) { return ret; } rem = 0; pos = 0; for (;;) { int c; if (rem == 0) { ret = usb_recv(CDC_RX_EP, pkt, 128, 2000); DCC_LOG1(LOG_TRACE, "usb_recv() ret=%d)", ret); if (ret <= 0) goto timeout; pos = 0; rem = ret; } c = pkt[pos]; pos++; rem--; if (c == STX) { cnt = 1024; break; } if (c == SOH) { cnt = 128; break; } if (c == CAN) { return -1; } if (c == EOT) { /* end of transmission */ #if XMODEM_CHECKSUM rx->sync = rx->crc_mode ? 'C' : NAK; #else rx->sync = 'C'; #endif rx->pktno = 0; pkt[0] = ACK; usb_send(CDC_TX_EP, pkt, 1); return 0; } } cp = pkt + 1; for (i = 0; i < rem; ++i) cp[i] = pkt[pos + i]; cp += rem; rem = cnt + 4 - rem; /* receive the packet */ while (rem) { ret = usb_recv(CDC_RX_EP, cp, rem, 500); DCC_LOG1(LOG_TRACE, "usb_recv() ret=%d)", ret); if (ret < 0) goto timeout; rem -= ret; cp += ret; } #if XMODEM_SEQUENCE_CHECK /* sequence */ seq = pkt[1]; /* inverse sequence */ nseq = pkt[2]; if (seq != ((~nseq) & 0xff)) { goto error; } #endif cp = &pkt[3]; #if XMODEM_CHECKSUM if (rx->crc_mode) #endif #if XMODEM_CRC_CHECK { unsigned short crc = 0; unsigned short cmp; int i; for (i = 0; i < cnt; ++i) crc = CRC16CCITT(crc, cp[i]); cmp = (unsigned short)cp[i] << 8 | cp[i + 1]; if (cmp != crc) { goto error; } } #endif #if XMODEM_CHECKSUM else { unsigned char cks = 0; int i; for (i = 0; i < cnt; ++i) cks += cp[i]; if (cp[i] != cks) { goto error; } } #endif #if XMODEM_SEQUENCE_CHECK if (seq == ((rx->pktno - 1) & 0xff)) { /* retransmission */ continue; } if (seq != (rx->pktno & 0xff)) { #if XMODEM_FALLBACK if ((rx->pktno == 0) && (seq == 1)) { rx->pktno++; /* Fallback to XMODEM */ rx->xmodem = true; } else #endif { goto error; } } #endif /* YModem first packet ... */ if (rx->pktno == 0) { pkt[0] = ACK; usb_send(CDC_TX_EP, pkt, 1); } else { rx->retry = 10; rx->sync = ACK; if ((rx->count + cnt) > rx->fsize) cnt = rx->fsize - rx->count; rx->count += cnt; } rx->pktno++; return cnt; #if XMODEM_SEQUENCE_CHECK || XMODEM_CRC_CHECK error: /* flush */ while (usb_recv(CDC_RX_EP, pkt, 1024, 100) > 0); ret = -1; break; #endif timeout: if ((--rx->retry) == 0) { /* too many errors */ DCC_LOG(LOG_WARNING, "too many errors!"); ret = -1; break; } } return usb_ymodem_rcv_cancel(rx); }