示例#1
0
文件: usb.c 项目: xNikB/NestDFUAttack
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();
   }
示例#2
0
文件: temper.cpp 项目: yrro/temper
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);
}
示例#3
0
文件: main.c 项目: Jazzinghen/NXoSPAM
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);
  }
}
示例#4
0
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);
}