More CRLF -> LF cleanup

This commit is contained in:
marcansoft 2010-02-20 21:56:33 +00:00
parent c062856a74
commit fdcc61d318
3 changed files with 540 additions and 540 deletions

View file

@ -1,14 +1,14 @@
#include "crc16.h" #include "crc16.h"
unsigned short update_crc16( unsigned short crc, unsigned char c ) unsigned short update_crc16( unsigned short crc, unsigned char c )
{ {
unsigned short i, v, tcrc = 0; unsigned short i, v, tcrc = 0;
v = (crc ^ c) & 0xff; v = (crc ^ c) & 0xff;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
tcrc = ( (tcrc ^ v) & 1 ) ? ( tcrc >> 1 ) ^ 0x8408 : tcrc >> 1; tcrc = ( (tcrc ^ v) & 1 ) ? ( tcrc >> 1 ) ^ 0x8408 : tcrc >> 1;
v >>= 1; v >>= 1;
} }
return ((crc >> 8) ^ tcrc)&0xffff; return ((crc >> 8) ^ tcrc)&0xffff;
} }

View file

@ -1,31 +1,31 @@
#include "iso14443crc.h" #include "iso14443crc.h"
static unsigned short UpdateCrc14443(unsigned char ch, unsigned short *lpwCrc) static unsigned short UpdateCrc14443(unsigned char ch, unsigned short *lpwCrc)
{ {
ch = (ch ^ (unsigned char) ((*lpwCrc) & 0x00FF)); ch = (ch ^ (unsigned char) ((*lpwCrc) & 0x00FF));
ch = (ch ^ (ch << 4)); ch = (ch ^ (ch << 4));
*lpwCrc = (*lpwCrc >> 8) ^ ((unsigned short) ch << 8) ^ *lpwCrc = (*lpwCrc >> 8) ^ ((unsigned short) ch << 8) ^
((unsigned short) ch << 3) ^ ((unsigned short) ch >> 4); ((unsigned short) ch << 3) ^ ((unsigned short) ch >> 4);
return (*lpwCrc); return (*lpwCrc);
} }
void ComputeCrc14443(int CrcType, void ComputeCrc14443(int CrcType,
unsigned char *Data, int Length, unsigned char *Data, int Length,
unsigned char *TransmitFirst, unsigned char *TransmitFirst,
unsigned char *TransmitSecond) unsigned char *TransmitSecond)
{ {
unsigned char chBlock; unsigned char chBlock;
unsigned short wCrc=CrcType; unsigned short wCrc=CrcType;
do { do {
chBlock = *Data++; chBlock = *Data++;
UpdateCrc14443(chBlock, &wCrc); UpdateCrc14443(chBlock, &wCrc);
} while (--Length); } while (--Length);
if (CrcType == CRC_14443_B) if (CrcType == CRC_14443_B)
wCrc = ~wCrc; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */ wCrc = ~wCrc; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
*TransmitFirst = (unsigned char) (wCrc & 0xFF); *TransmitFirst = (unsigned char) (wCrc & 0xFF);
*TransmitSecond = (unsigned char) ((wCrc >> 8) & 0xFF); *TransmitSecond = (unsigned char) ((wCrc >> 8) & 0xFF);
return; return;
} }

View file

@ -1,495 +1,495 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// My USB driver. This has to be common, because it exists in both the // My USB driver. This has to be common, because it exists in both the
// bootrom and the application. // bootrom and the application.
// Jonathan Westhues, split Aug 14 2005 // Jonathan Westhues, split Aug 14 2005
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include <proxmark3.h> #include <proxmark3.h>
#define min(a, b) (((a) > (b)) ? (b) : (a)) #define min(a, b) (((a) > (b)) ? (b) : (a))
#define USB_REPORT_PACKET_SIZE 64 #define USB_REPORT_PACKET_SIZE 64
typedef struct PACKED { typedef struct PACKED {
BYTE bmRequestType; BYTE bmRequestType;
BYTE bRequest; BYTE bRequest;
WORD wValue; WORD wValue;
WORD wIndex; WORD wIndex;
WORD wLength; WORD wLength;
} UsbSetupData; } UsbSetupData;
#define USB_REQUEST_GET_STATUS 0 #define USB_REQUEST_GET_STATUS 0
#define USB_REQUEST_CLEAR_FEATURE 1 #define USB_REQUEST_CLEAR_FEATURE 1
#define USB_REQUEST_SET_FEATURE 3 #define USB_REQUEST_SET_FEATURE 3
#define USB_REQUEST_SET_ADDRESS 5 #define USB_REQUEST_SET_ADDRESS 5
#define USB_REQUEST_GET_DESCRIPTOR 6 #define USB_REQUEST_GET_DESCRIPTOR 6
#define USB_REQUEST_SET_DESCRIPTOR 7 #define USB_REQUEST_SET_DESCRIPTOR 7
#define USB_REQUEST_GET_CONFIGURATION 8 #define USB_REQUEST_GET_CONFIGURATION 8
#define USB_REQUEST_SET_CONFIGURATION 9 #define USB_REQUEST_SET_CONFIGURATION 9
#define USB_REQUEST_GET_INTERFACE 10 #define USB_REQUEST_GET_INTERFACE 10
#define USB_REQUEST_SET_INTERFACE 11 #define USB_REQUEST_SET_INTERFACE 11
#define USB_REQUEST_SYNC_FRAME 12 #define USB_REQUEST_SYNC_FRAME 12
#define USB_DESCRIPTOR_TYPE_DEVICE 1 #define USB_DESCRIPTOR_TYPE_DEVICE 1
#define USB_DESCRIPTOR_TYPE_CONFIGURATION 2 #define USB_DESCRIPTOR_TYPE_CONFIGURATION 2
#define USB_DESCRIPTOR_TYPE_STRING 3 #define USB_DESCRIPTOR_TYPE_STRING 3
#define USB_DESCRIPTOR_TYPE_INTERFACE 4 #define USB_DESCRIPTOR_TYPE_INTERFACE 4
#define USB_DESCRIPTOR_TYPE_ENDPOINT 5 #define USB_DESCRIPTOR_TYPE_ENDPOINT 5
#define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 6 #define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 6
#define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONF 7 #define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONF 7
#define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 8 #define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 8
#define USB_DESCRIPTOR_TYPE_HID 0x21 #define USB_DESCRIPTOR_TYPE_HID 0x21
#define USB_DESCRIPTOR_TYPE_HID_REPORT 0x22 #define USB_DESCRIPTOR_TYPE_HID_REPORT 0x22
#define USB_DEVICE_CLASS_HID 0x03 #define USB_DEVICE_CLASS_HID 0x03
static const BYTE HidReportDescriptor[] = { static const BYTE HidReportDescriptor[] = {
0x06,0xA0,0xFF, // Usage Page (vendor defined) FFA0 0x06,0xA0,0xFF, // Usage Page (vendor defined) FFA0
0x09,0x01, // Usage (vendor defined) 0x09,0x01, // Usage (vendor defined)
0xA1,0x01, // Collection (Application) 0xA1,0x01, // Collection (Application)
0x09,0x02, // Usage (vendor defined) 0x09,0x02, // Usage (vendor defined)
0xA1,0x00, // Collection (Physical) 0xA1,0x00, // Collection (Physical)
0x06,0xA1,0xFF, // Usage Page (vendor defined) 0x06,0xA1,0xFF, // Usage Page (vendor defined)
//The,input report //The,input report
0x09,0x03, // usage - vendor defined 0x09,0x03, // usage - vendor defined
0x09,0x04, // usage - vendor defined 0x09,0x04, // usage - vendor defined
0x15,0x80, // Logical Minimum (-128) 0x15,0x80, // Logical Minimum (-128)
0x25,0x7F, // Logical Maximum (127) 0x25,0x7F, // Logical Maximum (127)
0x35,0x00, // Physical Minimum (0) 0x35,0x00, // Physical Minimum (0)
0x45,0xFF, // Physical Maximum (255) 0x45,0xFF, // Physical Maximum (255)
0x75,0x08, // Report Size (8) (bits) 0x75,0x08, // Report Size (8) (bits)
0x95,0x40, // Report Count (64) (fields) 0x95,0x40, // Report Count (64) (fields)
0x81,0x02, // Input (Data,Variable,Absolute) 0x81,0x02, // Input (Data,Variable,Absolute)
//The,output report //The,output report
0x09,0x05, // usage - vendor defined 0x09,0x05, // usage - vendor defined
0x09,0x06, // usage - vendor defined 0x09,0x06, // usage - vendor defined
0x15,0x80, // Logical Minimum (-128) 0x15,0x80, // Logical Minimum (-128)
0x25,0x7F, // Logical Maximum (127) 0x25,0x7F, // Logical Maximum (127)
0x35,0x00, // Physical Minimum (0) 0x35,0x00, // Physical Minimum (0)
0x45,0xFF, // Physical Maximum (255) 0x45,0xFF, // Physical Maximum (255)
0x75,0x08, // Report Size (8) (bits) 0x75,0x08, // Report Size (8) (bits)
0x95,0x40, // Report Count (64) (fields) 0x95,0x40, // Report Count (64) (fields)
0x91,0x02, // Output (Data,Variable,Absolute) 0x91,0x02, // Output (Data,Variable,Absolute)
0xC0, // End Collection 0xC0, // End Collection
0xC0, // End Collection 0xC0, // End Collection
}; };
static const BYTE DeviceDescriptor[] = { static const BYTE DeviceDescriptor[] = {
0x12, // Descriptor length (18 bytes) 0x12, // Descriptor length (18 bytes)
0x01, // Descriptor type (Device) 0x01, // Descriptor type (Device)
0x10,0x01, // Complies with USB Spec. Release (0110h = release 1.10) 0x10,0x01, // Complies with USB Spec. Release (0110h = release 1.10)
0x00, // Class code (0) 0x00, // Class code (0)
0x00, // Subclass code (0) 0x00, // Subclass code (0)
0x00, // Protocol (No specific protocol) 0x00, // Protocol (No specific protocol)
0x08, // Maximum packet size for Endpoint 0 (8 bytes) 0x08, // Maximum packet size for Endpoint 0 (8 bytes)
0xc4,0x9a, // Vendor ID (random numbers) 0xc4,0x9a, // Vendor ID (random numbers)
0x8f,0x4b, // Product ID (random numbers) 0x8f,0x4b, // Product ID (random numbers)
0x01,0x00, // Device release number (0001) 0x01,0x00, // Device release number (0001)
0x01, // Manufacturer string descriptor index 0x01, // Manufacturer string descriptor index
0x02, // Product string descriptor index 0x02, // Product string descriptor index
0x00, // Serial Number string descriptor index (None) 0x00, // Serial Number string descriptor index (None)
0x01, // Number of possible configurations (1) 0x01, // Number of possible configurations (1)
}; };
static const BYTE ConfigurationDescriptor[] = { static const BYTE ConfigurationDescriptor[] = {
0x09, // Descriptor length (9 bytes) 0x09, // Descriptor length (9 bytes)
0x02, // Descriptor type (Configuration) 0x02, // Descriptor type (Configuration)
0x29,0x00, // Total data length (41 bytes) 0x29,0x00, // Total data length (41 bytes)
0x01, // Interface supported (1) 0x01, // Interface supported (1)
0x01, // Configuration value (1) 0x01, // Configuration value (1)
0x00, // Index of string descriptor (None) 0x00, // Index of string descriptor (None)
0x80, // Configuration (Bus powered) 0x80, // Configuration (Bus powered)
250, // Maximum power consumption (500mA) 250, // Maximum power consumption (500mA)
//interface //interface
0x09, // Descriptor length (9 bytes) 0x09, // Descriptor length (9 bytes)
0x04, // Descriptor type (Interface) 0x04, // Descriptor type (Interface)
0x00, // Number of interface (0) 0x00, // Number of interface (0)
0x00, // Alternate setting (0) 0x00, // Alternate setting (0)
0x02, // Number of interface endpoint (2) 0x02, // Number of interface endpoint (2)
0x03, // Class code (HID) 0x03, // Class code (HID)
0x00, // Subclass code () 0x00, // Subclass code ()
0x00, // Protocol code () 0x00, // Protocol code ()
0x00, // Index of string() 0x00, // Index of string()
// class // class
0x09, // Descriptor length (9 bytes) 0x09, // Descriptor length (9 bytes)
0x21, // Descriptor type (HID) 0x21, // Descriptor type (HID)
0x00,0x01, // HID class release number (1.00) 0x00,0x01, // HID class release number (1.00)
0x00, // Localized country code (None) 0x00, // Localized country code (None)
0x01, // # of HID class dscrptr to follow (1) 0x01, // # of HID class dscrptr to follow (1)
0x22, // Report descriptor type (HID) 0x22, // Report descriptor type (HID)
// Total length of report descriptor // Total length of report descriptor
sizeof(HidReportDescriptor),0x00, sizeof(HidReportDescriptor),0x00,
// endpoint 1 // endpoint 1
0x07, // Descriptor length (7 bytes) 0x07, // Descriptor length (7 bytes)
0x05, // Descriptor type (Endpoint) 0x05, // Descriptor type (Endpoint)
0x01, // Encoded address (Respond to OUT) 0x01, // Encoded address (Respond to OUT)
0x03, // Endpoint attribute (Interrupt transfer) 0x03, // Endpoint attribute (Interrupt transfer)
0x08,0x00, // Maximum packet size (8 bytes) 0x08,0x00, // Maximum packet size (8 bytes)
0x01, // Polling interval (1 ms) 0x01, // Polling interval (1 ms)
// endpoint 2 // endpoint 2
0x07, // Descriptor length (7 bytes) 0x07, // Descriptor length (7 bytes)
0x05, // Descriptor type (Endpoint) 0x05, // Descriptor type (Endpoint)
0x82, // Encoded address (Respond to IN) 0x82, // Encoded address (Respond to IN)
0x03, // Endpoint attribute (Interrupt transfer) 0x03, // Endpoint attribute (Interrupt transfer)
0x08,0x00, // Maximum packet size (8 bytes) 0x08,0x00, // Maximum packet size (8 bytes)
0x01, // Polling interval (1 ms) 0x01, // Polling interval (1 ms)
}; };
static const BYTE StringDescriptor0[] = { static const BYTE StringDescriptor0[] = {
0x04, // Length 0x04, // Length
0x03, // Type is string 0x03, // Type is string
0x09, // English 0x09, // English
0x04, // US 0x04, // US
}; };
static const BYTE StringDescriptor1[] = { static const BYTE StringDescriptor1[] = {
24, // Length 24, // Length
0x03, // Type is string 0x03, // Type is string
'J', 0x00, 'J', 0x00,
'.', 0x00, '.', 0x00,
' ', 0x00, ' ', 0x00,
'W', 0x00, 'W', 0x00,
'e', 0x00, 'e', 0x00,
's', 0x00, 's', 0x00,
't', 0x00, 't', 0x00,
'h', 0x00, 'h', 0x00,
'u', 0x00, 'u', 0x00,
'e', 0x00, 'e', 0x00,
's', 0x00, 's', 0x00,
}; };
static const BYTE StringDescriptor2[] = { static const BYTE StringDescriptor2[] = {
54, // Length 54, // Length
0x03, // Type is string 0x03, // Type is string
'P', 0x00, 'P', 0x00,
'r', 0x00, 'r', 0x00,
'o', 0x00, 'o', 0x00,
'x', 0x00, 'x', 0x00,
'M', 0x00, 'M', 0x00,
'a', 0x00, 'a', 0x00,
'r', 0x00, 'r', 0x00,
'k', 0x00, 'k', 0x00,
'-', 0x00, '-', 0x00,
'3', 0x00, '3', 0x00,
' ', 0x00, ' ', 0x00,
'R', 0x00, 'R', 0x00,
'F', 0x00, 'F', 0x00,
'I', 0x00, 'I', 0x00,
'D', 0x00, 'D', 0x00,
' ', 0x00, ' ', 0x00,
'I', 0x00, 'I', 0x00,
'n', 0x00, 'n', 0x00,
's', 0x00, 's', 0x00,
't', 0x00, 't', 0x00,
'r', 0x00, 'r', 0x00,
'u', 0x00, 'u', 0x00,
'm', 0x00, 'm', 0x00,
'e', 0x00, 'e', 0x00,
'n', 0x00, 'n', 0x00,
't', 0x00, 't', 0x00,
}; };
static const BYTE * const StringDescriptors[] = { static const BYTE * const StringDescriptors[] = {
StringDescriptor0, StringDescriptor0,
StringDescriptor1, StringDescriptor1,
StringDescriptor2, StringDescriptor2,
}; };
static BYTE UsbBuffer[64]; static BYTE UsbBuffer[64];
static int UsbSoFarCount; static int UsbSoFarCount;
static BYTE CurrentConfiguration; static BYTE CurrentConfiguration;
static void UsbSendEp0(const BYTE *data, int len) static void UsbSendEp0(const BYTE *data, int len)
{ {
int thisTime, i; int thisTime, i;
do { do {
thisTime = min(len, 8); thisTime = min(len, 8);
len -= thisTime; len -= thisTime;
for(i = 0; i < thisTime; i++) { for(i = 0; i < thisTime; i++) {
AT91C_BASE_UDP->UDP_FDR[0] = *data; AT91C_BASE_UDP->UDP_FDR[0] = *data;
data++; data++;
} }
if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) { if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_TXCOMP; AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_TXCOMP;
while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP)
; ;
} }
AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY; AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
do { do {
if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RX_DATA_BK0) { if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RX_DATA_BK0) {
// This means that the host is trying to write to us, so // This means that the host is trying to write to us, so
// abandon our write to them. // abandon our write to them.
AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_RX_DATA_BK0; AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_RX_DATA_BK0;
return; return;
} }
} while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP)); } while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP));
} while(len > 0); } while(len > 0);
if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) { if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_TXCOMP; AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_TXCOMP;
while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP)
; ;
} }
} }
static void UsbSendZeroLength(void) static void UsbSendZeroLength(void)
{ {
AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY; AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP)) while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP))
; ;
AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_TXCOMP; AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_TXCOMP;
while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP) while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_TXCOMP)
; ;
} }
static void UsbSendStall(void) static void UsbSendStall(void)
{ {
AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_FORCESTALL; AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_FORCESTALL;
while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_STALLSENT)) while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_STALLSENT))
; ;
AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_STALLSENT; AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_STALLSENT;
while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_STALLSENT) while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_STALLSENT)
; ;
} }
static void HandleRxdSetupData(void) static void HandleRxdSetupData(void)
{ {
int i; int i;
UsbSetupData usd; UsbSetupData usd;
for(i = 0; i < sizeof(usd); i++) { for(i = 0; i < sizeof(usd); i++) {
((BYTE *)&usd)[i] = AT91C_BASE_UDP->UDP_FDR[0]; ((BYTE *)&usd)[i] = AT91C_BASE_UDP->UDP_FDR[0];
} }
if(usd.bmRequestType & 0x80) { if(usd.bmRequestType & 0x80) {
AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_DIR; AT91C_BASE_UDP->UDP_CSR[0] |= AT91C_UDP_DIR;
while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_DIR)) while(!(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_DIR))
; ;
} }
AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_RXSETUP; AT91C_BASE_UDP->UDP_CSR[0] &= ~AT91C_UDP_RXSETUP;
while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) while(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP)
; ;
switch(usd.bRequest) { switch(usd.bRequest) {
case USB_REQUEST_GET_DESCRIPTOR: case USB_REQUEST_GET_DESCRIPTOR:
if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_DEVICE) { if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_DEVICE) {
UsbSendEp0((BYTE *)&DeviceDescriptor, UsbSendEp0((BYTE *)&DeviceDescriptor,
min(sizeof(DeviceDescriptor), usd.wLength)); min(sizeof(DeviceDescriptor), usd.wLength));
} else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_CONFIGURATION) { } else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_CONFIGURATION) {
UsbSendEp0((BYTE *)&ConfigurationDescriptor, UsbSendEp0((BYTE *)&ConfigurationDescriptor,
min(sizeof(ConfigurationDescriptor), usd.wLength)); min(sizeof(ConfigurationDescriptor), usd.wLength));
} else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_STRING) { } else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_STRING) {
const BYTE *s = StringDescriptors[usd.wValue & 0xff]; const BYTE *s = StringDescriptors[usd.wValue & 0xff];
UsbSendEp0(s, min(s[0], usd.wLength)); UsbSendEp0(s, min(s[0], usd.wLength));
} else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_HID_REPORT) { } else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_HID_REPORT) {
UsbSendEp0((BYTE *)&HidReportDescriptor, UsbSendEp0((BYTE *)&HidReportDescriptor,
min(sizeof(HidReportDescriptor), usd.wLength)); min(sizeof(HidReportDescriptor), usd.wLength));
} else { } else {
*((DWORD *)0x00200000) = usd.wValue; *((DWORD *)0x00200000) = usd.wValue;
} }
break; break;
case USB_REQUEST_SET_ADDRESS: case USB_REQUEST_SET_ADDRESS:
UsbSendZeroLength(); UsbSendZeroLength();
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN | usd.wValue ; AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN | usd.wValue ;
if(usd.wValue != 0) { if(usd.wValue != 0) {
AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN; AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN;
} else { } else {
AT91C_BASE_UDP->UDP_GLBSTATE = 0; AT91C_BASE_UDP->UDP_GLBSTATE = 0;
} }
break; break;
case USB_REQUEST_GET_CONFIGURATION: case USB_REQUEST_GET_CONFIGURATION:
UsbSendEp0(&CurrentConfiguration, sizeof(CurrentConfiguration)); UsbSendEp0(&CurrentConfiguration, sizeof(CurrentConfiguration));
break; break;
case USB_REQUEST_GET_STATUS: { case USB_REQUEST_GET_STATUS: {
if(usd.bmRequestType & 0x80) { if(usd.bmRequestType & 0x80) {
WORD w = 0; WORD w = 0;
UsbSendEp0((BYTE *)&w, sizeof(w)); UsbSendEp0((BYTE *)&w, sizeof(w));
} }
break; break;
} }
case USB_REQUEST_SET_CONFIGURATION: case USB_REQUEST_SET_CONFIGURATION:
CurrentConfiguration = usd.wValue; CurrentConfiguration = usd.wValue;
if(CurrentConfiguration) { if(CurrentConfiguration) {
AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_CONFG; AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_CONFG;
AT91C_BASE_UDP->UDP_CSR[1] = AT91C_UDP_EPEDS | AT91C_BASE_UDP->UDP_CSR[1] = AT91C_UDP_EPEDS |
AT91C_UDP_EPTYPE_INT_OUT; AT91C_UDP_EPTYPE_INT_OUT;
AT91C_BASE_UDP->UDP_CSR[2] = AT91C_UDP_EPEDS | AT91C_BASE_UDP->UDP_CSR[2] = AT91C_UDP_EPEDS |
AT91C_UDP_EPTYPE_INT_IN; AT91C_UDP_EPTYPE_INT_IN;
} else { } else {
AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN; AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN;
AT91C_BASE_UDP->UDP_CSR[1] = 0; AT91C_BASE_UDP->UDP_CSR[1] = 0;
AT91C_BASE_UDP->UDP_CSR[2] = 0; AT91C_BASE_UDP->UDP_CSR[2] = 0;
} }
UsbSendZeroLength(); UsbSendZeroLength();
break; break;
case USB_REQUEST_GET_INTERFACE: { case USB_REQUEST_GET_INTERFACE: {
BYTE b = 0; BYTE b = 0;
UsbSendEp0(&b, sizeof(b)); UsbSendEp0(&b, sizeof(b));
break; break;
} }
case USB_REQUEST_SET_INTERFACE: case USB_REQUEST_SET_INTERFACE:
UsbSendZeroLength(); UsbSendZeroLength();
break; break;
case USB_REQUEST_CLEAR_FEATURE: case USB_REQUEST_CLEAR_FEATURE:
case USB_REQUEST_SET_FEATURE: case USB_REQUEST_SET_FEATURE:
UsbSendStall(); UsbSendStall();
break; break;
case USB_REQUEST_SET_DESCRIPTOR: case USB_REQUEST_SET_DESCRIPTOR:
case USB_REQUEST_SYNC_FRAME: case USB_REQUEST_SYNC_FRAME:
default: default:
break; break;
} }
} }
void UsbSendPacket(BYTE *packet, int len) void UsbSendPacket(BYTE *packet, int len)
{ {
int i, thisTime; int i, thisTime;
while(len > 0) { while(len > 0) {
thisTime = min(len, 8); thisTime = min(len, 8);
for(i = 0; i < thisTime; i++) { for(i = 0; i < thisTime; i++) {
AT91C_BASE_UDP->UDP_FDR[2] = packet[i]; AT91C_BASE_UDP->UDP_FDR[2] = packet[i];
} }
AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY; AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY;
while(!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)) while(!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP))
; ;
AT91C_BASE_UDP->UDP_CSR[2] &= ~AT91C_UDP_TXCOMP; AT91C_BASE_UDP->UDP_CSR[2] &= ~AT91C_UDP_TXCOMP;
while(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP) while(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)
; ;
len -= thisTime; len -= thisTime;
packet += thisTime; packet += thisTime;
} }
} }
static void HandleRxdData(void) static void HandleRxdData(void)
{ {
int i, len; int i, len;
if(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK0) { if(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK0) {
len = UDP_CSR_BYTES_RECEIVED(AT91C_BASE_UDP->UDP_CSR[1]); len = UDP_CSR_BYTES_RECEIVED(AT91C_BASE_UDP->UDP_CSR[1]);
for(i = 0; i < len; i++) { for(i = 0; i < len; i++) {
UsbBuffer[UsbSoFarCount] = AT91C_BASE_UDP->UDP_FDR[1]; UsbBuffer[UsbSoFarCount] = AT91C_BASE_UDP->UDP_FDR[1];
UsbSoFarCount++; UsbSoFarCount++;
} }
AT91C_BASE_UDP->UDP_CSR[1] &= ~AT91C_UDP_RX_DATA_BK0; AT91C_BASE_UDP->UDP_CSR[1] &= ~AT91C_UDP_RX_DATA_BK0;
while(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK0) while(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK0)
; ;
if(UsbSoFarCount >= 64) { if(UsbSoFarCount >= 64) {
UsbPacketReceived(UsbBuffer, UsbSoFarCount); UsbPacketReceived(UsbBuffer, UsbSoFarCount);
UsbSoFarCount = 0; UsbSoFarCount = 0;
} }
} }
if(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK1) { if(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK1) {
len = UDP_CSR_BYTES_RECEIVED(AT91C_BASE_UDP->UDP_CSR[1]); len = UDP_CSR_BYTES_RECEIVED(AT91C_BASE_UDP->UDP_CSR[1]);
for(i = 0; i < len; i++) { for(i = 0; i < len; i++) {
UsbBuffer[UsbSoFarCount] = AT91C_BASE_UDP->UDP_FDR[1]; UsbBuffer[UsbSoFarCount] = AT91C_BASE_UDP->UDP_FDR[1];
UsbSoFarCount++; UsbSoFarCount++;
} }
AT91C_BASE_UDP->UDP_CSR[1] &= ~AT91C_UDP_RX_DATA_BK1; AT91C_BASE_UDP->UDP_CSR[1] &= ~AT91C_UDP_RX_DATA_BK1;
while(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK1) while(AT91C_BASE_UDP->UDP_CSR[1] & AT91C_UDP_RX_DATA_BK1)
; ;
if(UsbSoFarCount >= 64) { if(UsbSoFarCount >= 64) {
UsbPacketReceived(UsbBuffer, UsbSoFarCount); UsbPacketReceived(UsbBuffer, UsbSoFarCount);
UsbSoFarCount = 0; UsbSoFarCount = 0;
} }
} }
} }
void UsbStart(void) void UsbStart(void)
{ {
volatile int i; volatile int i;
UsbSoFarCount = 0; UsbSoFarCount = 0;
USB_D_PLUS_PULLUP_OFF(); USB_D_PLUS_PULLUP_OFF();
for(i = 0; i < 1000000; i++) for(i = 0; i < 1000000; i++)
; ;
USB_D_PLUS_PULLUP_ON(); USB_D_PLUS_PULLUP_ON();
if(AT91C_BASE_UDP->UDP_ISR & AT91C_UDP_ENDBUSRES) { if(AT91C_BASE_UDP->UDP_ISR & AT91C_UDP_ENDBUSRES) {
AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES; AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
} }
} }
BOOL UsbConnected() BOOL UsbConnected()
{ {
if (AT91C_BASE_UDP->UDP_GLBSTATE & AT91C_UDP_CONFG) if (AT91C_BASE_UDP->UDP_GLBSTATE & AT91C_UDP_CONFG)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
} }
BOOL UsbPoll(BOOL blinkLeds) BOOL UsbPoll(BOOL blinkLeds)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
if(AT91C_BASE_UDP->UDP_ISR & AT91C_UDP_ENDBUSRES) { if(AT91C_BASE_UDP->UDP_ISR & AT91C_UDP_ENDBUSRES) {
AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES; AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
// following a reset we should be ready to receive a setup packet // following a reset we should be ready to receive a setup packet
AT91C_BASE_UDP->UDP_RSTEP = 0xf; AT91C_BASE_UDP->UDP_RSTEP = 0xf;
AT91C_BASE_UDP->UDP_RSTEP = 0; AT91C_BASE_UDP->UDP_RSTEP = 0;
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS; AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS;
CurrentConfiguration = 0; CurrentConfiguration = 0;
ret = TRUE; ret = TRUE;
} }
if(AT91C_BASE_UDP->UDP_ISR & UDP_INTERRUPT_ENDPOINT(0)) { if(AT91C_BASE_UDP->UDP_ISR & UDP_INTERRUPT_ENDPOINT(0)) {
if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) { if(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) {
HandleRxdSetupData(); HandleRxdSetupData();
ret = TRUE; ret = TRUE;
} }
} }
if(AT91C_BASE_UDP->UDP_ISR & UDP_INTERRUPT_ENDPOINT(1)) { if(AT91C_BASE_UDP->UDP_ISR & UDP_INTERRUPT_ENDPOINT(1)) {
HandleRxdData(); HandleRxdData();
ret = TRUE; ret = TRUE;
} }
return ret; return ret;
} }