From 72622d6429ebd62f6e416356aeda565956352aed Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Sat, 11 Jan 2020 17:11:19 +0100 Subject: [PATCH] usb communication (device side) housekeeping * move cmd.[ch] and usb_cdc.[ch] to armsrc * sorting out #includes * replace byte_t by uint8_t * some reformatting * whitespace fixes * (no functional changes) --- armsrc/apps.h | 4 - {common => armsrc}/cmd.c | 79 ++++++++-------- {common => armsrc}/cmd.h | 16 ++-- armsrc/hfsnoop.c | 1 + armsrc/hitagS.c | 1 + armsrc/i2c.c | 1 + armsrc/iso14443a.c | 8 +- armsrc/iso14443a.h | 3 +- armsrc/iso14443b.c | 1 + armsrc/legicrf.c | 1 + armsrc/lfops.c | 1 + armsrc/pcf7931.c | 1 + {common => armsrc}/usb_cdc.c | 171 ++++++++++++++++++++--------------- {common => armsrc}/usb_cdc.h | 25 ++--- armsrc/util.h | 57 ++++++------ include/common.h | 11 +-- include/usb_cmd.h | 46 +++++----- 17 files changed, 230 insertions(+), 197 deletions(-) rename {common => armsrc}/cmd.c (60%) rename {common => armsrc}/cmd.h (83%) rename {common => armsrc}/usb_cdc.c (86%) rename {common => armsrc}/usb_cdc.h (79%) diff --git a/armsrc/apps.h b/armsrc/apps.h index 5d3e3e59..0431d2ee 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -112,8 +112,4 @@ void ReaderMifareDES(uint32_t param, uint32_t param2, uint8_t * datain); int DesfireAPDU(uint8_t *cmd, size_t cmd_len, uint8_t *dataout); size_t CreateAPDU( uint8_t *datain, size_t len, uint8_t *dataout); -// cmd.h -bool cmd_receive(UsbCommand* cmd); -bool cmd_send(uint32_t cmd, uint32_t arg0, uint32_t arg1, uint32_t arg2, void* data, size_t len); - #endif diff --git a/common/cmd.c b/armsrc/cmd.c similarity index 60% rename from common/cmd.c rename to armsrc/cmd.c index 0c3ecc1f..71202522 100644 --- a/common/cmd.c +++ b/armsrc/cmd.c @@ -31,49 +31,56 @@ */ #include "cmd.h" -#include "string.h" -#include "proxmark3.h" + +#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; + + // Try to retrieve the available command frame + size_t rxlen = usb_read((uint8_t*)cmd, sizeof(UsbCommand)); + + // Check if the transfer was complete + if (rxlen != sizeof(UsbCommand)) + return false; + + // 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; + UsbCommand txcmd; - for (size_t i=0; i +#include +#include #include "usb_cmd.h" -#include "usb_cdc.h" -bool cmd_receive(UsbCommand* cmd); -bool cmd_send(uint32_t cmd, uint32_t arg0, uint32_t arg1, uint32_t arg2, void* data, size_t len); - -#endif // _PROXMARK_CMD_H_ +extern bool cmd_receive(UsbCommand* cmd); +extern bool cmd_send(uint32_t cmd, uint32_t arg0, uint32_t arg1, uint32_t arg2, void* data, size_t len); +#endif // PROXMARK_CMD_H__ diff --git a/armsrc/hfsnoop.c b/armsrc/hfsnoop.c index 755ac0cc..2bb7fbce 100644 --- a/armsrc/hfsnoop.c +++ b/armsrc/hfsnoop.c @@ -14,6 +14,7 @@ #include "BigBuf.h" #include "util.h" #include "apps.h" +#include "cmd.h" #include "usb_cdc.h" // for usb_poll_validate_length #include "fpga.h" #include "fpgaloader.h" diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 5da170bb..e7533da7 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -17,6 +17,7 @@ #include #include "proxmark3.h" #include "apps.h" +#include "cmd.h" #include "util.h" #include "hitag.h" #include "string.h" diff --git a/armsrc/i2c.c b/armsrc/i2c.c index 51513114..30cbddd0 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -18,6 +18,7 @@ #include "mifareutil.h" // for MF_DBGLEVEL #include "BigBuf.h" #include "apps.h" +#include "cmd.h" #ifdef WITH_SMARTCARD #include "smartcard.h" diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 31a3e4cc..2d6c3e3b 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -942,7 +942,7 @@ bool prepare_allocated_tag_modulation(tag_response_info_t* response_info, uint8_ // Main loop of simulated tag: receive commands from reader, decide what // response to send, and send it. //----------------------------------------------------------------------------- -void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, byte_t* data) { +void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, uint8_t* data) { uint8_t sak; @@ -1701,13 +1701,13 @@ static int GetATQA(uint8_t *resp, uint8_t *resp_par) { // if anticollision is false, then the UID must be provided in uid_ptr[] // and num_cascades must be set (1: 4 Byte UID, 2: 7 Byte UID, 3: 10 Byte UID) // requests ATS unless no_rats is true -int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats) { +int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats) { uint8_t sel_all[] = { 0x93,0x20 }; uint8_t sel_uid[] = { 0x93,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uint8_t rats[] = { 0xE0,0x80,0x00,0x00 }; // FSD=256, FSDI=8, CID=0 uint8_t resp[MAX_FRAME_SIZE]; // theoretically. A usual RATS will be much smaller uint8_t resp_par[MAX_PARITY_SIZE]; - byte_t uid_resp[4]; + uint8_t uid_resp[4]; size_t uid_resp_len; uint8_t sak = 0x04; // cascade uid @@ -2020,7 +2020,7 @@ void ReaderIso14443a(UsbCommand *c) { size_t lenbits = c->arg[1] >> 16; uint32_t timeout = c->arg[2]; uint32_t arg0 = 0; - byte_t buf[USB_CMD_DATA_SIZE] = {0}; + uint8_t buf[USB_CMD_DATA_SIZE] = {0}; uint8_t par[MAX_PARITY_SIZE]; bool cantSELECT = false; diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index d2a94a78..32bf3971 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -13,6 +13,7 @@ #ifndef __ISO14443A_H #define __ISO14443A_H +#include #include #include #include "usb_cmd.h" @@ -31,7 +32,7 @@ extern void GetParity(const uint8_t *pbtCmd, uint16_t len, uint8_t *par); extern void AppendCrc14443a(uint8_t *data, int len); extern void RAMFUNC SnoopIso14443a(uint8_t param); -extern void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, byte_t *data); +extern void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, uint8_t *data); extern void ReaderIso14443a(UsbCommand *c); extern void ReaderTransmit(uint8_t *frame, uint16_t len, uint32_t *timing); extern void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t *timing); diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 6434409d..5a335e25 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -14,6 +14,7 @@ #include "proxmark3.h" #include "apps.h" +#include "cmd.h" #include "util.h" #include "string.h" #include "iso14443crc.h" diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 97af8843..3bc09732 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -14,6 +14,7 @@ #include "proxmark3.h" #include "apps.h" +#include "cmd.h" #include "util.h" #include "string.h" #include "legic_prng.h" diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 12f9de08..a1a31f1a 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -17,6 +17,7 @@ #include "lfdemod.h" #include "lfsampling.h" #include "protocols.h" +#include "cmd.h" #include "usb_cdc.h" // for usb_poll_validate_length #include "fpgaloader.h" diff --git a/armsrc/pcf7931.c b/armsrc/pcf7931.c index 147f6fb8..b0f8e4a3 100644 --- a/armsrc/pcf7931.c +++ b/armsrc/pcf7931.c @@ -1,5 +1,6 @@ #include "proxmark3.h" #include "apps.h" +#include "cmd.h" #include "lfsampling.h" #include "pcf7931.h" #include "util.h" diff --git a/common/usb_cdc.c b/armsrc/usb_cdc.c similarity index 86% rename from common/usb_cdc.c rename to armsrc/usb_cdc.c index d33bca7b..269d71d7 100644 --- a/common/usb_cdc.c +++ b/armsrc/usb_cdc.c @@ -33,10 +33,15 @@ */ #include "usb_cdc.h" + +#include +#include +#include + +#include "common.h" #include "at91sam7s512.h" #include "config_gpio.h" - #define AT91C_EP_CONTROL 0 #define AT91C_EP_OUT 1 #define AT91C_EP_IN 2 @@ -49,6 +54,7 @@ #define STR_MANUFACTURER 0x01 #define STR_PRODUCT 0x02 + static const char devDescriptor[] = { /* Device descriptor */ 0x12, // bLength @@ -67,6 +73,7 @@ static const char devDescriptor[] = { 0x01 // bNumConfigs }; + static const char cfgDescriptor[] = { /* ============== CONFIGURATION 1 =========== */ /* Configuration 1 descriptor */ @@ -157,47 +164,50 @@ static const char cfgDescriptor[] = { 0x00 // bInterval }; + static const char StrDescLanguageCodes[] = { - 4, // Length - 0x03, // Type is string - 0x09, 0x04 // supported language Code 0 = 0x0409 (English) + 4, // Length + 0x03, // Type is string + 0x09, 0x04 // supported language Code 0 = 0x0409 (English) }; + // Note: ModemManager (Linux) ignores Proxmark3 devices by matching the // manufacturer string "proxmark.org". Don't change this. static const char StrDescManufacturer[] = { - 26, // Length - 0x03, // Type is string - 'p', 0x00, - 'r', 0x00, - 'o', 0x00, - 'x', 0x00, - 'm', 0x00, - 'a', 0x00, - 'r', 0x00, - 'k', 0x00, - '.', 0x00, - 'o', 0x00, - 'r', 0x00, - 'g', 0x00 + 26, // Length + 0x03, // Type is string + 'p', 0x00, + 'r', 0x00, + 'o', 0x00, + 'x', 0x00, + 'm', 0x00, + 'a', 0x00, + 'r', 0x00, + 'k', 0x00, + '.', 0x00, + 'o', 0x00, + 'r', 0x00, + 'g', 0x00 }; + static const char StrDescProduct[] = { - 20, // Length - 0x03, // Type is string - 'p', 0x00, - 'r', 0x00, - 'o', 0x00, - 'x', 0x00, - 'm', 0x00, - 'a', 0x00, - 'r', 0x00, - 'k', 0x00, - '3', 0x00 + 20, // Length + 0x03, // Type is string + 'p', 0x00, + 'r', 0x00, + 'o', 0x00, + 'x', 0x00, + 'm', 0x00, + 'a', 0x00, + 'r', 0x00, + 'k', 0x00, + '3', 0x00 }; -const char* getStringDescriptor(uint8_t idx) -{ + +const char* getStringDescriptor(uint8_t idx) { switch (idx) { case STR_LANGUAGE_CODES: return StrDescLanguageCodes; @@ -210,10 +220,12 @@ const char* getStringDescriptor(uint8_t idx) } } + // Bitmap for all status bits in CSR which must be written as 1 to cause no effect #define REG_NO_EFFECT_1_ALL AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1 \ - |AT91C_UDP_STALLSENT | AT91C_UDP_RXSETUP \ - |AT91C_UDP_TXCOMP + |AT91C_UDP_STALLSENT | AT91C_UDP_RXSETUP \ + |AT91C_UDP_TXCOMP + // Clear flags in the UDP_CSR register #define UDP_CLEAR_EP_FLAGS(endpoint, flags) { \ @@ -222,7 +234,8 @@ const char* getStringDescriptor(uint8_t idx) reg |= REG_NO_EFFECT_1_ALL; \ reg &= ~(flags); \ pUdp->UDP_CSR[(endpoint)] = reg; \ -} +} + // Set flags in the UDP_CSR register #define UDP_SET_EP_FLAGS(endpoint, flags) { \ @@ -233,6 +246,7 @@ const char* getStringDescriptor(uint8_t idx) pUdp->UDP_CSR[(endpoint)] = reg; \ } + /* USB standard request codes */ #define STD_GET_STATUS_ZERO 0x0080 #define STD_GET_STATUS_INTERFACE 0x0081 @@ -260,6 +274,7 @@ const char* getStringDescriptor(uint8_t idx) #define SET_LINE_CODING 0x2021 #define SET_CONTROL_LINE_STATE 0x2221 + typedef struct { unsigned int dwDTERRate; char bCharFormat; @@ -267,6 +282,7 @@ typedef struct { char bDataBits; } AT91S_CDC_LINE_CODING, *AT91PS_CDC_LINE_CODING; + AT91S_CDC_LINE_CODING line = { 115200, // baudrate 0, // 1 Stop Bit @@ -277,9 +293,9 @@ AT91S_CDC_LINE_CODING line = { void AT91F_CDC_Enumerate(); AT91PS_UDP pUdp = AT91C_BASE_UDP; -byte_t btConfiguration = 0; -byte_t btConnection = 0; -byte_t btReceiveBank = AT91C_UDP_RX_DATA_BK0; +uint8_t btConfiguration = 0; +uint8_t btConnection = 0; +uint8_t btReceiveBank = AT91C_UDP_RX_DATA_BK0; //*---------------------------------------------------------------------------- @@ -291,7 +307,7 @@ void usb_disable() { AT91C_BASE_PIOA->PIO_ODR = GPIO_USB_PU; // Clear all lingering interrupts - if(pUdp->UDP_ISR & AT91C_UDP_ENDBUSRES) { + if (pUdp->UDP_ISR & AT91C_UDP_ENDBUSRES) { pUdp->UDP_ICR = AT91C_UDP_ENDBUSRES; } } @@ -322,7 +338,7 @@ void usb_enable() { usb_disable(); // Wait for a short while - for (volatile size_t i=0; i<0x100000; i++); + for (volatile size_t i = 0; i < 0x100000; i++); // Reconnect USB reconnect AT91C_BASE_PIOA->PIO_SODR = GPIO_USB_PU; @@ -354,8 +370,7 @@ bool usb_check() { } -bool usb_poll() -{ +bool usb_poll() { if (!usb_check()) return false; return (pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank); } @@ -369,29 +384,29 @@ bool usb_poll() that the length available to read is non-zero, thus hopefully fixes the bug. **/ -bool usb_poll_validate_length() -{ +bool usb_poll_validate_length() { if (!usb_check()) return false; if (!(pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank)) return false; return (pUdp->UDP_CSR[AT91C_EP_OUT] >> 16) > 0; } + //*---------------------------------------------------------------------------- //* \fn usb_read //* \brief Read available data from Endpoint OUT //*---------------------------------------------------------------------------- -uint32_t usb_read(byte_t* data, size_t len) { - byte_t bank = btReceiveBank; +uint32_t usb_read(uint8_t* data, size_t len) { + uint8_t bank = btReceiveBank; uint32_t packetSize, nbBytesRcv = 0; uint32_t time_out = 0; - + while (len) { if (!usb_check()) break; if ( pUdp->UDP_CSR[AT91C_EP_OUT] & bank ) { packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, len); len -= packetSize; - while(packetSize--) + while (packetSize--) data[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT]; UDP_CLEAR_EP_FLAGS(AT91C_EP_OUT, bank); if (bank == AT91C_UDP_RX_DATA_BK0) { @@ -412,7 +427,7 @@ uint32_t usb_read(byte_t* data, size_t len) { //* \fn usb_write //* \brief Send through endpoint 2 //*---------------------------------------------------------------------------- -uint32_t usb_write(const byte_t* data, const size_t len) { +uint32_t usb_write(const uint8_t* data, const size_t len) { size_t length = len; uint32_t cpt = 0; @@ -439,7 +454,8 @@ uint32_t usb_write(const byte_t* data, const size_t len) { if (!usb_check()) return length; } UDP_CLEAR_EP_FLAGS(AT91C_EP_IN, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP); + while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) + /* wait */; UDP_SET_EP_FLAGS(AT91C_EP_IN, AT91C_UDP_TXPKTRDY); } @@ -449,7 +465,8 @@ uint32_t usb_write(const byte_t* data, const size_t len) { } UDP_CLEAR_EP_FLAGS(AT91C_EP_IN, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP); + while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) + /* wait */; return length; } @@ -475,7 +492,8 @@ static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t leng if (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) { UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); + while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) + /* wait */; } UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXPKTRDY); @@ -487,13 +505,14 @@ static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t leng UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_RX_DATA_BK0); return; } - } while ( !(csr & AT91C_UDP_TXCOMP) ); + } while (!(csr & AT91C_UDP_TXCOMP)); } while (length); if (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) { UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); + while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) + /* wait */; } } @@ -504,9 +523,11 @@ static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint32_t leng //*---------------------------------------------------------------------------- void AT91F_USB_SendZlp(AT91PS_UDP pUdp) { UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXPKTRDY); - while ( !(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) ); + while (!(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP)) + /* wait */; UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP); + while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_TXCOMP) + /* wait */; } @@ -516,9 +537,11 @@ void AT91F_USB_SendZlp(AT91PS_UDP pUdp) { //*---------------------------------------------------------------------------- void AT91F_USB_SendStall(AT91PS_UDP pUdp) { UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_FORCESTALL); - while ( !(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_ISOERROR) ); + while (!(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_ISOERROR)) + /* wait */; UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR); - while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR)); + while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR)) + /* wait */; } @@ -527,10 +550,10 @@ void AT91F_USB_SendStall(AT91PS_UDP pUdp) { //* \brief This function is a callback invoked when a SETUP packet is received //*---------------------------------------------------------------------------- void AT91F_CDC_Enumerate() { - byte_t bmRequestType, bRequest; + uint8_t bmRequestType, bRequest; uint16_t wValue, wIndex, wLength, wStatus; - if ( !(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_RXSETUP) ) + if (!(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_RXSETUP)) return; bmRequestType = pUdp->UDP_FDR[AT91C_EP_CONTROL]; @@ -542,12 +565,14 @@ void AT91F_CDC_Enumerate() { wLength = (pUdp->UDP_FDR[AT91C_EP_CONTROL] & 0xFF); wLength |= (pUdp->UDP_FDR[AT91C_EP_CONTROL] << 8); - if (bmRequestType & 0x80) { // Data Phase Transfer Direction Device to Host + if (bmRequestType & 0x80) { // Data Phase Transfer Direction Device to Host UDP_SET_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_DIR); - while ( !(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_DIR) ); + while (!(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_DIR)) + /* wait */; } UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_RXSETUP); - while ( (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_RXSETUP) ); + while (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_RXSETUP) + /* wait */; // Handle supported standard device request Cf Table 9-3 in USB specification Rev 1.1 switch ((bRequest << 8) | bmRequestType) { @@ -584,11 +609,11 @@ void AT91F_CDC_Enumerate() { AT91F_USB_SendData(pUdp, (char *) &(btConfiguration), sizeof(btConfiguration)); break; case STD_GET_STATUS_ZERO: - wStatus = 0; // Device is Bus powered, remote wakeup disabled + wStatus = 0; // Device is Bus powered, remote wakeup disabled AT91F_USB_SendData(pUdp, (char *) &wStatus, sizeof(wStatus)); break; case STD_GET_STATUS_INTERFACE: - wStatus = 0; // reserved for future use + wStatus = 0; // reserved for future use AT91F_USB_SendData(pUdp, (char *) &wStatus, sizeof(wStatus)); break; case STD_GET_STATUS_ENDPOINT: @@ -597,17 +622,15 @@ void AT91F_CDC_Enumerate() { if ((pUdp->UDP_GLBSTATE & AT91C_UDP_CONFG) && (wIndex <= AT91C_EP_NOTIFY)) { wStatus = (pUdp->UDP_CSR[wIndex] & AT91C_UDP_EPEDS) ? 0 : 1; AT91F_USB_SendData(pUdp, (char *) &wStatus, sizeof(wStatus)); - } - else if ((pUdp->UDP_GLBSTATE & AT91C_UDP_FADDEN) && (wIndex == AT91C_EP_CONTROL)) { + } else if ((pUdp->UDP_GLBSTATE & AT91C_UDP_FADDEN) && (wIndex == AT91C_EP_CONTROL)) { wStatus = (pUdp->UDP_CSR[wIndex] & AT91C_UDP_EPEDS) ? 0 : 1; AT91F_USB_SendData(pUdp, (char *) &wStatus, sizeof(wStatus)); - } - else + } else AT91F_USB_SendStall(pUdp); break; case STD_SET_FEATURE_ZERO: AT91F_USB_SendStall(pUdp); - break; + break; case STD_SET_FEATURE_INTERFACE: AT91F_USB_SendZlp(pUdp); break; @@ -616,13 +639,12 @@ void AT91F_CDC_Enumerate() { if ((wValue == 0) && (wIndex >= AT91C_EP_OUT) && (wIndex <= AT91C_EP_NOTIFY)) { pUdp->UDP_CSR[wIndex] = 0; AT91F_USB_SendZlp(pUdp); - } - else + } else AT91F_USB_SendStall(pUdp); break; case STD_CLEAR_FEATURE_ZERO: AT91F_USB_SendStall(pUdp); - break; + break; case STD_CLEAR_FEATURE_INTERFACE: AT91F_USB_SendZlp(pUdp); break; @@ -643,7 +665,8 @@ void AT91F_CDC_Enumerate() { // handle CDC class requests case SET_LINE_CODING: - while ( !(pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_RX_DATA_BK0) ); + while ( (pUdp->UDP_CSR[AT91C_EP_CONTROL] & AT91C_UDP_RX_DATA_BK0)) + /* wait */; UDP_CLEAR_EP_FLAGS(AT91C_EP_CONTROL, AT91C_UDP_RX_DATA_BK0); AT91F_USB_SendZlp(pUdp); break; @@ -656,6 +679,6 @@ void AT91F_CDC_Enumerate() { break; default: AT91F_USB_SendStall(pUdp); - break; + break; } } diff --git a/common/usb_cdc.h b/armsrc/usb_cdc.h similarity index 79% rename from common/usb_cdc.h rename to armsrc/usb_cdc.h index c42da8db..085b9844 100644 --- a/common/usb_cdc.h +++ b/armsrc/usb_cdc.h @@ -32,18 +32,19 @@ * @brief */ -#ifndef _USB_CDC_H_ -#define _USB_CDC_H_ +#ifndef USB_CDC_H__ +#define USB_CDC_H__ -#include "common.h" +#include +#include +#include -void usb_disable(); -void usb_enable(); -bool usb_check(); -bool usb_poll(); -bool usb_poll_validate_length(); -uint32_t usb_read(byte_t* data, size_t len); -uint32_t usb_write(const byte_t* data, const size_t len); - -#endif // _USB_CDC_H_ +extern void usb_disable(); +extern void usb_enable(); +extern bool usb_check(); +extern bool usb_poll(); +extern bool usb_poll_validate_length(); +extern uint32_t usb_read(uint8_t* data, size_t len); +extern uint32_t usb_write(const uint8_t* data, const size_t len); +#endif // _USB_CDC_H__ diff --git a/armsrc/util.h b/armsrc/util.h index 14ac5e10..bdb7fafd 100644 --- a/armsrc/util.h +++ b/armsrc/util.h @@ -8,12 +8,13 @@ // Utility functions used in many places, not specific to any piece of code. //----------------------------------------------------------------------------- -#ifndef __UTIL_H -#define __UTIL_H +#ifndef UTIL_H__ +#define UTIL_H__ #include #include #include "common.h" +#include "at91sam7s512.h" #define BYTEx(x, n) (((x) >> (n * 8)) & 0xff ) @@ -33,40 +34,40 @@ #define REV32(x) (REV16(x) | (REV16(x >> 16) << 16)) #define REV64(x) (REV32(x) | (REV32(x >> 32) << 32)) -void print_result(char *name, uint8_t *buf, size_t len); -size_t nbytes(size_t nbits); -uint32_t SwapBits(uint32_t value, int nrbits); -void num_to_bytes(uint64_t n, size_t len, uint8_t* dest); -uint64_t bytes_to_num(uint8_t* src, size_t len); -void rol(uint8_t *data, const size_t len); -void lsl (uint8_t *data, size_t len); - -void LED(int led, int ms); -void LEDsoff(); -void LEDson(); -void LEDsinvert(); -int BUTTON_CLICKED(int ms); -int BUTTON_HELD(int ms); -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information); +extern void print_result(char *name, uint8_t *buf, size_t len); +extern size_t nbytes(size_t nbits); +extern uint32_t SwapBits(uint32_t value, int nrbits); +extern void num_to_bytes(uint64_t n, size_t len, uint8_t* dest); +extern uint64_t bytes_to_num(uint8_t* src, size_t len); +extern void rol(uint8_t *data, const size_t len); +extern void lsl (uint8_t *data, size_t len); + +extern void LED(int led, int ms); +extern void LEDsoff(); +extern void LEDson(); +extern void LEDsinvert(); +extern int BUTTON_CLICKED(int ms); +extern int BUTTON_HELD(int ms); +extern void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information); //iceman's ticks.h #ifndef GET_TICKS # define GET_TICKS GetTicks() #endif -void SpinDelay(int ms); -void SpinDelayUs(int us); +extern void SpinDelay(int ms); +extern void SpinDelayUs(int us); -void StartTickCount(); -uint32_t RAMFUNC GetTickCount(); +extern void StartTickCount(); +extern uint32_t RAMFUNC GetTickCount(); -void StartCountUS(); -uint32_t RAMFUNC GetCountUS(); -uint32_t RAMFUNC GetDeltaCountUS(); +extern void StartCountUS(); +extern uint32_t RAMFUNC GetCountUS(); +extern uint32_t RAMFUNC GetDeltaCountUS(); -void StartCountSspClk(); -void ResetSspClk(void); -uint32_t GetCountSspClk(); +extern void StartCountSspClk(); +extern void ResetSspClk(void); +extern uint32_t GetCountSspClk(); extern void StartTicks(void); extern uint32_t GetTicks(void); @@ -78,6 +79,6 @@ extern void ResetTimer(AT91PS_TC timer); extern void StopTicks(void); // end iceman's ticks.h -uint32_t prand(); +extern uint32_t prand(); #endif diff --git a/include/common.h b/include/common.h index 998db64d..89a6cd7e 100644 --- a/include/common.h +++ b/include/common.h @@ -9,13 +9,9 @@ // Interlib Definitions //----------------------------------------------------------------------------- -#ifndef __COMMON_H -#define __COMMON_H +#ifndef COMMON_H__ +#define COMMON_H__ -#include -#include -#include -#include typedef unsigned char byte_t; #ifndef MIN @@ -25,10 +21,9 @@ typedef unsigned char byte_t; # define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef ABS -# define ABS(a) ( ((a)<0) ? -(a) : (a) ) +# define ABS(a) (((a) < 0) ? -(a) : (a)) #endif - #define RAMFUNC __attribute((long_call, section(".ramfunc"))) #endif diff --git a/include/usb_cmd.h b/include/usb_cmd.h index c588328c..082b7d50 100644 --- a/include/usb_cmd.h +++ b/include/usb_cmd.h @@ -10,13 +10,13 @@ // own protocol. //----------------------------------------------------------------------------- -#ifndef __USB_CMD_H -#define __USB_CMD_H +#ifndef USB_CMD_H__ +#define USB_CMD_H__ + #ifdef _MSC_VER typedef DWORD uint32_t; typedef BYTE uint8_t; #define PACKED -// stuff #else #include #include @@ -26,16 +26,17 @@ typedef BYTE uint8_t; #define USB_CMD_DATA_SIZE 512 typedef struct { - uint64_t cmd; - uint64_t arg[3]; - union { - uint8_t asBytes[USB_CMD_DATA_SIZE]; - uint32_t asDwords[USB_CMD_DATA_SIZE/4]; - } d; + uint64_t cmd; + uint64_t arg[3]; + union { + uint8_t asBytes[USB_CMD_DATA_SIZE]; + uint32_t asDwords[USB_CMD_DATA_SIZE/4]; + } d; } PACKED UsbCommand; + // A struct used to send sample-configs over USB -typedef struct{ +typedef struct { uint8_t decimation; uint8_t bits_per_sample; bool averaging; @@ -44,6 +45,7 @@ typedef struct{ int samples_to_skip; } sample_config; + // For the bootloader #define CMD_DEVICE_INFO 0x0000 #define CMD_SETUP_WRITE 0x0001 @@ -165,7 +167,7 @@ typedef struct{ #define CMD_ICLASS_WRITEBLOCK 0x0397 #define CMD_ICLASS_EML_MEMSET 0x0398 #define CMD_ICLASS_CHECK 0x0399 -#define CMD_ICLASS_READCHECK 0x039A +#define CMD_ICLASS_READCHECK 0x039A // For measurements of the antenna tuning #define CMD_MEASURE_ANTENNA_TUNING 0x0400 @@ -208,7 +210,7 @@ typedef struct{ #define CMD_MIFAREU_WRITEBL 0x0722 #define CMD_MIFAREU_WRITEBL_COMPAT 0x0723 #define CMD_MIFAREUC_AUTH 0x0724 -//0x0725 and 0x0726 no longer used +//0x0725 and 0x0726 no longer used #define CMD_MIFAREUC_SETPWD 0x0727 @@ -228,11 +230,11 @@ typedef struct{ // Mifare simulation flags -#define FLAG_INTERACTIVE (1<<0) -#define FLAG_4B_UID_IN_DATA (1<<1) -#define FLAG_7B_UID_IN_DATA (1<<2) -#define FLAG_NR_AR_ATTACK (1<<4) -#define FLAG_RANDOM_NONCE (1<<5) +#define FLAG_INTERACTIVE (1<<0) +#define FLAG_4B_UID_IN_DATA (1<<1) +#define FLAG_7B_UID_IN_DATA (1<<2) +#define FLAG_NR_AR_ATTACK (1<<4) +#define FLAG_RANDOM_NONCE (1<<5) // iCLASS reader flags @@ -266,19 +268,19 @@ typedef struct{ // CMD_DEVICE_INFO response packet has flags in arg[0], flag definitions: /* Whether a bootloader that understands the common_area is present */ -#define DEVICE_INFO_FLAG_BOOTROM_PRESENT (1<<0) +#define DEVICE_INFO_FLAG_BOOTROM_PRESENT (1<<0) /* Whether a osimage that understands the common_area is present */ -#define DEVICE_INFO_FLAG_OSIMAGE_PRESENT (1<<1) +#define DEVICE_INFO_FLAG_OSIMAGE_PRESENT (1<<1) /* Set if the bootloader is currently executing */ -#define DEVICE_INFO_FLAG_CURRENT_MODE_BOOTROM (1<<2) +#define DEVICE_INFO_FLAG_CURRENT_MODE_BOOTROM (1<<2) /* Set if the OS is currently executing */ -#define DEVICE_INFO_FLAG_CURRENT_MODE_OS (1<<3) +#define DEVICE_INFO_FLAG_CURRENT_MODE_OS (1<<3) /* Set if this device understands the extend start flash command */ -#define DEVICE_INFO_FLAG_UNDERSTANDS_START_FLASH (1<<4) +#define DEVICE_INFO_FLAG_UNDERSTANDS_START_FLASH (1<<4) /* CMD_START_FLASH may have three arguments: start of area to flash, end of area to flash, optional magic. -- 2.39.5