X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/5bcc76c427b680e28c001783c29c695e3a8d0c17..72622d6429ebd62f6e416356aeda565956352aed:/armsrc/cmd.c diff --git a/armsrc/cmd.c b/armsrc/cmd.c index f64b4e40..71202522 100644 --- a/armsrc/cmd.c +++ b/armsrc/cmd.c @@ -1,7 +1,7 @@ /* * Proxmark send and receive commands * - * Copyright (c) 2010, Roel Verdult + * Copyright (c) 2012, Roel Verdult * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,45 +31,56 @@ */ #include "cmd.h" -#include "string.h" -#include "util.h" -#include "proxmark3.h" -//static UsbCommand txcmd; +#include +#include +#include +#include "common.h" +#include "usb_cmd.h" +#include "usb_cdc.h" + bool cmd_receive(UsbCommand* cmd) { - - // Check if there is a usb packet available - if (!usb_poll()) return false; - - // Try to retrieve the available command frame - size_t rxlen = usb_read((byte_t*)cmd,sizeof(UsbCommand)); - // Check if the transfer was complete - if (rxlen != sizeof(UsbCommand)) return false; - - // Received command successfully - return true; -} + // Check if there is a usb packet available + if (!usb_poll()) + return false; -bool cmd_send(uint32_t cmd, uint32_t arg0, uint32_t arg1, uint32_t arg2, byte_t* data, size_t len) { - UsbCommand txcmd; + // Try to retrieve the available command frame + size_t rxlen = usb_read((uint8_t*)cmd, sizeof(UsbCommand)); - // Compose the outgoing command frame - txcmd.cmd = cmd; - txcmd.arg[0] = arg0; - txcmd.arg[1] = arg1; - txcmd.arg[2] = arg2; + // Check if the transfer was complete + if (rxlen != sizeof(UsbCommand)) + return false; - // Add the (optional) content to the frame, with a maximum size of USB_CMD_DATA_SIZE - if (data && len) { - memcpy(txcmd.d.asBytes,data,MIN(len,USB_CMD_DATA_SIZE)); - } - - // Send frame and make sure all bytes are transmitted - if (usb_write((byte_t*)&txcmd,sizeof(UsbCommand)) != 0) return false; - - return true; + // Received command successfully + return true; } +bool cmd_send(uint32_t cmd, uint32_t arg0, uint32_t arg1, uint32_t arg2, void* data, size_t len) { + UsbCommand txcmd; + + for (size_t i = 0; i < sizeof(UsbCommand); i++) { + ((uint8_t*)&txcmd)[i] = 0x00; + } + + // Compose the outgoing command frame + txcmd.cmd = cmd; + txcmd.arg[0] = arg0; + txcmd.arg[1] = arg1; + txcmd.arg[2] = arg2; + + // Add the (optional) content to the frame, with a maximum size of USB_CMD_DATA_SIZE + if (data && len) { + len = MIN(len, USB_CMD_DATA_SIZE); + for (size_t i = 0; i < len; i++) { + txcmd.d.asBytes[i] = ((uint8_t*)data)[i]; + } + } + + // Send frame and make sure all bytes are transmitted + if (usb_write((uint8_t*)&txcmd, sizeof(UsbCommand)) != 0) return false; + + return true; +}