annotate usb.c @ 35:fed32b382de2

Tidy up, hide details behind macros to make it more obvious what we talk to do do things. Convert constants to my preferred format.
author darius
date Tue, 23 Oct 2007 10:54:01 +0930
parents 4e417d84365e
children 5898fba6593c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1 #include <stdlib.h>
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
2 #include <avr/io.h>
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
3 #include <avr/pgmspace.h>
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
4 #include <avr/interrupt.h>
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
5 #include <avr/eeprom.h>
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
6 #include <util/delay.h>
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
7
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
8 #include "usb.h"
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
9 #include "1wire.h"
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
10
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
11 /* Maximum FIFO sizes for each endpoint */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
12 #define EP0_FIFO_SZ 16
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
13 #define EP1_FIFO_SZ 16
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
14 #define EP2_FIFO_SZ 64
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
15
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
16 /* PDIUSBD12 mode */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
17 #define D12_MODE_0 0x14 /* Endpoint config = 0, SoftConnect = 1, IRQ Mode = 1,
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
18 * Clock running = 0, No Lazy Clock = 0
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
19 */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
20 #define D12_MODE_1 0x02 /* SOF mode = 0, Set-to-one = 0, Clock div = 2 (16Mhz) */
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
21
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
22 /* Debugging stuff */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
23 void uart_putsP(const char *addr);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
24 void uart_puts(const char *addr);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
25 int uart_putc(char c);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
26 void uart_puts_dec(uint8_t a, uint8_t l);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
27 void uart_puts_hex(uint8_t a);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
28
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
29 void parsebuf(uint8_t *buffer, uint8_t ep);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
30
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
31 /* USB administrivia */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
32 uint8_t deviceaddress;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
33 uint8_t deviceconfigured;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
34
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
35 /* Endpoint buffers and such */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
36 /* EP0 in */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
37 static const uint8_t *sendbuffer0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
38 static uint8_t sendbytes0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
39
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
40 /* EP0 out */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
41 /* This is unbuffered as we don't handle packets > EP0_FIFO_SZ */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
42
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
43 /* EP1 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
44 /* Unbuffered as yet */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
45 static uint8_t packet1[270];
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
46 static uint16_t packetlen1;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
47
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
48 /* EP2 in */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
49 static const uint8_t *sendbuffer2;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
50 static uint8_t sendbytes2;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
51
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
52 /* EP2 out */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
53 static uint8_t packet2[270];
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
54 static uint16_t packetlen2;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
55
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
56 /* XXX: Not actually used */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
57 void (*bootloader)(void) = (void*)0xe000;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
58
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
59 /* Device/endpoint/etc descriptions */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
60 const USB_DEVICE_DESCRIPTOR DeviceDescriptor = {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
61 sizeof(USB_DEVICE_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
62 TYPE_DEVICE_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
63 0x0110, /* bcdUSB USB Version 1.1 */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
64 0, /* bDeviceClass */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
65 0, /* bDeviceSubclass */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
66 0, /* bDeviceProtocol */
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
67 EP0_FIFO_SZ, /* bMaxPacketSize in Bytes */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
68 0x4753, /* idVendor (unofficial GS) */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
69 0x0001, /* idProduct */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
70 0x0100, /* bcdDevice */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
71 1, /* iManufacturer String Index */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
72 2, /* iProduct String Index */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
73 3, /* iSerialNumber String Index */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
74 1 /* bNumberConfigurations */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
75 };
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
76
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
77 const USB_CONFIG_DATA ConfigurationDescriptor = {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
78 { /* configuration descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
79 sizeof(USB_CONFIGURATION_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
80 TYPE_CONFIGURATION_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
81 sizeof(USB_CONFIG_DATA), /* wTotalLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
82 2, /* bNumInterfaces */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
83 1, /* bConfigurationValue */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
84 0, /* iConfiguration String Index */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
85 0x80, /* bmAttributes Bus Powered, No Remote Wakeup */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
86 100/2 /* bMaxPower in mA */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
87 },
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
88 { /* interface descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
89 sizeof(USB_INTERFACE_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
90 TYPE_INTERFACE_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
91 0, /* bInterface Number */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
92 0, /* bAlternateSetting */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
93 2, /* bNumEndpoints */
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
94 0xff, /* bInterfaceClass (Vendor specific) */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
95 0x02, /* bInterfaceSubClass */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
96 0x00, /* bInterfaceProtocol */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
97 0 /* iInterface String Index */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
98 },
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
99 { /* endpoint descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
100 sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
101 TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
102 0x02, /* bEndpoint Address EP2 OUT */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
103 0x02, /* bmAttributes - Bulk */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
104 0x0040, /* wMaxPacketSize */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
105 0x00 /* bInterval */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
106 },
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
107 { /* endpoint descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
108 sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
109 TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
110 0x82, /* bEndpoint Address EP2 IN */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
111 0x02, /* bmAttributes - Bulk */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
112 0x0040, /* wMaxPacketSize */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
113 0x00 /* bInterval */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
114 },
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
115 { /* interface descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
116 sizeof(USB_INTERFACE_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
117 TYPE_INTERFACE_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
118 1, /* bInterface Number */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
119 0, /* bAlternateSetting */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
120 2, /* bNumEndpoints */
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
121 0xff, /* bInterfaceClass (Vendor specific) */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
122 0x02, /* bInterfaceSubClass */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
123 0x00, /* bInterfaceProtocol */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
124 0 /* iInterface String Index */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
125 },
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
126 { /* endpoint descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
127 sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
128 TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
129 0x01, /* bEndpoint Address EP1 OUT */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
130 0x02, /* bmAttributes - Bulk */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
131 0x0010, /* wMaxPacketSize */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
132 0x00 /* bInterval */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
133 },
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
134 { /* endpoint descriptor */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
135 sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
136 TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
137 0x81, /* bEndpoint Address EP1 IN */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
138 0x02, /* bmAttributes - Bulk */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
139 0x0010, /* wMaxPacketSize */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
140 0x00 /* bInterval */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
141 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
142 };
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
143 const LANGID_DESCRIPTOR LANGID_Descriptor = { /* LANGID String Descriptor
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
144 * Zero */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
145 sizeof(LANGID_DESCRIPTOR), /* bLength - must match string below */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
146 TYPE_STRING_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
147 0x0409 /* LANGID US English */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
148 };
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
149
26
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
150 STRING_DESCRIPTOR Manufacturer_Descriptor = {
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
151 sizeof(STRING_DESCRIPTOR) + 32, /* bLength */
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
152 TYPE_STRING_DESCRIPTOR, /* bDescriptorType */
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
153 "G\0e\0n\0e\0s\0i\0s\0 \0S\0o\0f\0t\0w\0a\0r\0e\0" /* ManufacturerString in
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
154 * UNICODE */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
155 };
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
156
26
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
157 STRING_DESCRIPTOR Product_Descriptor = {
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
158 sizeof(STRING_DESCRIPTOR) + 48, /* bLength */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
159 TYPE_STRING_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
160 /* ProductString in
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
161 * UNICODE */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
162 "R\0S\0""-\0""4\0""8\0""5\0"" \0M\0u\0l\0t\0i\0d\0r\0o\0p\0 \0A\0d\0a\0p\0t\0e\0r\0"
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
163 /* XXX: dunno why I need the double quote magic above.. */
26
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
164 };
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
165
26
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
166 STRING_DESCRIPTOR Serial_Descriptor;
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
167 STRING_DESCRIPTOR EE_Serial_Descriptor __attribute__ ((section (".eeprom"))) = { /* SerialString 3 */
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
168 sizeof(STRING_DESCRIPTOR) + 20, /* bLength - must match string below */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
169 TYPE_STRING_DESCRIPTOR, /* bDescriptorType */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
170 "1\02\03\0"
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
171 };
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
172
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
173 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
174 ** d12_get_data
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
175 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
176 ** Read a data byte
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
177 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
178 uint8_t
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
179 d12_get_data(void) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
180 uint8_t data;
26
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
181
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
182 _delay_us(1);
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
183 PDICTL &= ~_BV(PDIA0); /* Data phase */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
184 PDIDDR = 0x00; /* Set to input */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
185 PDICTL &= ~_BV(PDIRD); /* Pull RD_N low */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
186 PDICTL &= ~_BV(PDIRD); /* Delay 40ns */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
187 PDICTL &= ~_BV(PDIRD);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
188 PDICTL &= ~_BV(PDIRD);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
189 data = PINA; /* Read the data */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
190 PDICTL |= _BV(PDIRD); /* Pull RD_N high */
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
191
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
192 return(data);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
193 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
194
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
195 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
196 ** d12_set_data
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
197 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
198 ** Write a data byte
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
199 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
200 void
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
201 d12_set_data(uint8_t data) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
202 _delay_us(1);
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
203 PDICTL &= ~_BV(PDIA0); /* Data phase */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
204 PDIDDR = 0xff; /* Set to output */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
205 PDIPORT = data; /* Put the data on the bus */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
206 PDICTL &= ~_BV(PDIWR); /* Pull WR_N low */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
207 PDICTL &= ~_BV(PDIWR); /* Delay 40ns */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
208 PDICTL &= ~_BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
209 PDICTL &= ~_BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
210 PDICTL |= _BV(PDIWR); /* Pull WR_N high */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
211 PDICTL |= _BV(PDIWR); /* Delay 40 ns */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
212 PDICTL |= _BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
213 PDICTL |= _BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
214 PDIDDR = 0x00; /* Back to input */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
215 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
216
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
217 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
218 ** d12_set_cmd
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
219 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
220 ** Start a command
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
221 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
222 void
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
223 d12_set_cmd(uint8_t cmd) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
224 _delay_us(1);
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
225 PDICTL |= _BV(PDIA0); /* Command phase */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
226 PDIDDR = 0xff; /* Set to output */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
227 PDIPORT = cmd; /* Put the data on the bus */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
228 PDICTL &= ~_BV(PDIWR); /* Pull WR_N low */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
229 PDICTL &= ~_BV(PDIWR); /* Delay 40ns */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
230 PDICTL &= ~_BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
231 PDICTL &= ~_BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
232 PDICTL |= _BV(PDIWR); /* Pull WR_N high */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
233 PDICTL |= _BV(PDIWR); /* Delay 40ns */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
234 PDICTL |= _BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
235 PDICTL |= _BV(PDIWR);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
236 PDIDDR = 0x00; /* Back to input */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
237 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
238
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
239 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
240 ** d12_write_cmd
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
241 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
242 ** Issue a command with associated data
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
243 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
244 void
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
245 d12_write_cmd(uint8_t command, const uint8_t *buffer, uint8_t count) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
246 uint8_t i;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
247
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
248 d12_set_cmd(command);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
249 if (count) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
250 for (i = 0; i < count; i++) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
251 d12_set_data(buffer[i]);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
252 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
253 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
254 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
255
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
256 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
257 ** d12_read_cmd
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
258 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
259 ** Issue a command and read back the data
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
260 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
261 void
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
262 d12_read_cmd(uint8_t command, uint8_t *buffer, uint8_t count) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
263 uint8_t i;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
264
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
265 d12_set_cmd(command);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
266 if (count) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
267 for (i = 0; i < count; i++) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
268 buffer[i] = d12_get_data();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
269 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
270 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
271 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
272
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
273 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
274 ** usb_init
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
275 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
276 ** Configure the PDIUSBD12
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
277 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
278 void
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
279 usb_init(void) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
280 uint8_t buffer[2];
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
281
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
282 /* Check the device is present */
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
283 d12_read_cmd(D12_READ_CHIP_ID, buffer, 2);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
284 if (buffer[0] != 0x12 || buffer[1] != 0x10) {
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
285 uart_putsP(PSTR("PDIUSBD12 does not appear to be present/working, chip ID = 0x"));
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
286 uart_puts_hex(buffer[0]);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
287 uart_puts_hex(buffer[1]);
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
288 uart_putsP(PSTR(", expected 0x1210\n\r"));
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
289 return;
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
290 }
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
291
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
292 /* pull EE_Serial_Descriptor into RAM */
26
350e8655cbb7 - Remove some #if'd out code.
darius
parents: 23
diff changeset
293 eeprom_read_block(&Serial_Descriptor, &EE_Serial_Descriptor, EE_Serial_Descriptor.bLength);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
294
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
295 /* Set Address to zero (default) and enable function */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
296 buffer[0] = 0x80;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
297 d12_write_cmd(D12_SET_ADDRESS_ENABLE, buffer, 1);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
298
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
299 /* Enable function generic endpoints */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
300 buffer[0] = 0x01;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
301 d12_write_cmd(D12_SET_ENDPOINT_ENABLE, buffer, 1);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
302
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
303 /* Configure the device (soft connect off) */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
304 buffer[0] = D12_MODE_0 & 0xef;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
305 buffer[1] = D12_MODE_1;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
306 d12_write_cmd(D12_SET_MODE, buffer, 2);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
307
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
308 /* Delay long enough for the PC to notice the disconnect */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
309 _delay_us(1000);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
310
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
311 buffer[0] |= 0x10; /* Soft connect on */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
312 d12_write_cmd(D12_SET_MODE, buffer, 2);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
313
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
314 /* Endpoint 2 IN/OUT IRQ enable */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
315 buffer[0] = 0xc0;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
316 d12_write_cmd(D12_SET_DMA, buffer, 1);
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
317
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
318 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
319
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
320 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
321 ** usb_intr
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
322 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
323 ** Process any pending interrupts
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
324 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
325 void
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
326 usb_intr(void) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
327 uint8_t irq[2];
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
328 uint8_t buffer[8];
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
329
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
330 d12_read_cmd(D12_READ_INTERRUPT_REGISTER, irq, 2);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
331
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
332 /* Why do we get interrupts when this is 0? */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
333 if (irq[0] == 0)
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
334 return;
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
335
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
336 uart_putsP(PSTR("usb_intr() called\n\r"));
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
337
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
338 if (irq[0] & D12_INT_BUS_RESET) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
339 uart_putsP(PSTR("Bus reset\n\r"));
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
340 usb_init();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
341 return;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
342 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
343
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
344 if (irq[0] & D12_INT_SUSPEND) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
345 uart_putsP(PSTR("Suspend change\n\r"));
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
346 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
347
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
348 if (irq[0] & D12_INT_EP0_IN) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
349 d12_read_cmd(D12_READ_LAST_TRANSACTION + D12_ENDPOINT_EP0_IN, buffer, 1);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
350 if ((buffer[0] & D12_LAST_TRAN_ERRMSK) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
351 uart_putsP(PSTR("EP0_IN error "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
352 uart_puts_hex((buffer[0] & D12_LAST_TRAN_ERRMSK) >> 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
353 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
354 }
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
355
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
356 /* Handle any outgoing data for EP0 */
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
357 d12_send_data_ep0();
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
358 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
359
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
360 /* Handle configuration and misc stuff */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
361 if (irq[0] & D12_INT_EP0_OUT) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
362 d12_read_cmd(D12_READ_LAST_TRANSACTION + D12_ENDPOINT_EP0_OUT, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
363 if ((buffer[0] & D12_LAST_TRAN_ERRMSK) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
364 uart_putsP(PSTR("EP0_OUT error "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
365 uart_puts_hex((buffer[0] & D12_LAST_TRAN_ERRMSK) >> 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
366 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
367 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
368
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
369 if (buffer[0] & D12_LAST_TRAN_SETUP)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
370 d12_handle_setup();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
371 else {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
372 /* Data packet */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
373 }
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
374 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
375
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
376 /* EPx_IN is when the host has had a packet of data and is expecting more */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
377 if (irq[0] & D12_INT_EP1_IN) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
378 d12_read_cmd(D12_READ_LAST_TRANSACTION + D12_ENDPOINT_EP1_IN, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
379 if ((buffer[0] & D12_LAST_TRAN_ERRMSK) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
380 uart_putsP(PSTR("EP1_IN error "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
381 uart_puts_hex((buffer[0] & D12_LAST_TRAN_ERRMSK) >> 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
382 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
383 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
384
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
385 /* Select endpoint */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
386 d12_read_cmd(D12_ENDPOINT_EP1_IN, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
387
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
388 if (buffer[0] & 0x01)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
389 uart_putsP(PSTR("EP1_IN is full\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
390
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
391 if (buffer[0] & 0x02)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
392 uart_putsP(PSTR("EP1_IN is stalled\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
393
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
394 d12_write_endpt(D12_ENDPOINT_EP1_IN, NULL, 0);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
395 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
396
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
397 /* EPx_OUT is when we have gotten a packet from the host */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
398 if (irq[0] & D12_INT_EP1_OUT) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
399 d12_read_cmd(D12_READ_LAST_TRANSACTION + D12_ENDPOINT_EP1_OUT, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
400 if ((buffer[0] & D12_LAST_TRAN_ERRMSK) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
401 uart_putsP(PSTR("EP1_OUT error "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
402 uart_puts_hex((buffer[0] & D12_LAST_TRAN_ERRMSK) >> 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
403 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
404 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
405
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
406 d12_receive_data_ep1();
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
407 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
408
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
409 if (irq[0] & D12_INT_EP2_IN) {
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
410 d12_read_cmd(D12_READ_LAST_TRANSACTION + D12_ENDPOINT_EP2_IN, buffer, 1);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
411 if ((buffer[0] & D12_LAST_TRAN_ERRMSK) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
412 uart_putsP(PSTR("EP2_IN error "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
413 uart_puts_hex((buffer[0] & D12_LAST_TRAN_ERRMSK) >> 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
414 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
415 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
416
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
417 d12_send_data_ep2();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
418 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
419
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
420 if (irq[0] & D12_INT_EP2_OUT) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
421 d12_read_cmd(D12_READ_LAST_TRANSACTION + D12_ENDPOINT_EP2_OUT, buffer, 1);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
422 if ((buffer[0] & D12_LAST_TRAN_ERRMSK) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
423 uart_putsP(PSTR("EP2_OUT error "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
424 uart_puts_hex((buffer[0] & D12_LAST_TRAN_ERRMSK) >> 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
425 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
426 }
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
427 d12_receive_data_ep2();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
428 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
429 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
430
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
431 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
432 ** usb_gendata
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
433 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
434 ** Fake up some data for testing purposes
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
435 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
436 void
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
437 usb_gendata(void) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
438 packet2[0] = 'a';
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
439 packet2[1] = 'b';
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
440 packet2[2] = 'c';
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
441 packet2[3] = '\n';
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
442 packet2[4] = '\r';
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
443 sendbytes2 = 5;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
444 sendbuffer2 = (uint8_t *)&packet2[0];
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
445
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
446 /* Kick off the data transfer */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
447 d12_send_data_ep2();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
448 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
449
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
450 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
451 ** d12_handle_setup
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
452 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
453 ** Handle setup packet stuff for endpoint 0
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
454 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
455 void
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
456 d12_handle_setup(void) {
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
457 uint8_t buffer[2];
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
458 USB_SETUP_REQUEST setuppkt;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
459
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
460 /* Read the setup packet */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
461 d12_read_endpt(D12_ENDPOINT_EP0_OUT, (uint8_t *)&setuppkt);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
462
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
463 /* Ack the packet to EP0_OUT */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
464 d12_write_cmd(D12_ENDPOINT_EP0_OUT, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
465 d12_write_cmd(D12_ACK_SETUP, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
466 d12_write_cmd(D12_CLEAR_BUFFER, NULL, 0);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
467
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
468 /* Ack the packet to EP0_IN */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
469 d12_write_cmd(D12_ENDPOINT_EP0_IN, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
470 d12_write_cmd(D12_ACK_SETUP, NULL, 0);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
471
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
472 /* Parse request type */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
473 switch (setuppkt.bmRequestType & 0x7f) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
474 case STANDARD_DEVICE_REQUEST:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
475 switch (setuppkt.bRequest) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
476 case GET_STATUS:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
477 /* Get status request should return remote
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
478 * wakeup and self powered status
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
479 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
480 buffer[0] = 0x01;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
481 buffer[1] = 0x00;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
482 d12_write_endpt(D12_ENDPOINT_EP0_IN, buffer, 2);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
483 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
484 case CLEAR_FEATURE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
485 case SET_FEATURE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
486 /* We don't support DEVICE_REMOTE_WAKEUP or
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
487 * TEST_MODE
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
488 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
489
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
490 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
491 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
492 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
493
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
494 case SET_ADDRESS:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
495 deviceaddress = setuppkt.wValue | 0x80;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
496 d12_write_cmd(D12_SET_ADDRESS_ENABLE, &deviceaddress, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
497 d12_write_endpt(D12_ENDPOINT_EP0_IN, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
498 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
499
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
500 case GET_DESCRIPTOR:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
501 d12_getdescriptor(&setuppkt);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
502 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
503
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
504 case GET_CONFIGURATION:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
505 d12_write_endpt(D12_ENDPOINT_EP0_IN, &deviceconfigured, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
506 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
507
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
508 case SET_CONFIGURATION:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
509 deviceconfigured = setuppkt.wValue & 0xff;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
510 d12_write_endpt(D12_ENDPOINT_EP0_IN, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
511 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
512
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
513
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
514 case SET_DESCRIPTOR:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
515 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
516 /* Unsupported, stall */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
517 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
518 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
519 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
520 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
521 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
522
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
523 case STANDARD_INTERFACE_REQUEST:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
524 switch (setuppkt.bRequest) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
525 case GET_STATUS:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
526 /* Should return 0, 0 (reserved) */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
527 buffer[0] = 0x00;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
528 buffer[1] = 0x00;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
529 d12_write_endpt(D12_ENDPOINT_EP0_IN, buffer, 2);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
530 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
531
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
532 case SET_INTERFACE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
533 if (setuppkt.wIndex == 0 && setuppkt.wValue == 0)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
534 d12_write_endpt(D12_ENDPOINT_EP0_IN, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
535 else {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
536 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
537 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
538 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
539
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
540 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
541
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
542 case GET_INTERFACE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
543 /* Can only handle interface 0 ... */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
544 if (setuppkt.wIndex == 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
545 buffer[0] = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
546 d12_write_endpt(D12_ENDPOINT_EP0_IN, buffer, 1);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
547 break;
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
548 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
549 /* .. otherwise fall through to error */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
550
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
551 case CLEAR_FEATURE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
552 case SET_FEATURE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
553 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
554 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
555 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
556 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
557 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
558 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
559
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
560 case STANDARD_ENDPOINT_REQUEST:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
561 switch (setuppkt.bRequest) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
562 case CLEAR_FEATURE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
563 case SET_FEATURE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
564 /* Halt(stall) is required to be implemented on
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
565 * interrupt and bulk endpoints.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
566 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
567 if (setuppkt.wValue == ENDPOINT_HALT) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
568 if (setuppkt.bRequest == CLEAR_FEATURE)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
569 buffer[0] = 0x00;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
570 else
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
571 buffer[0] = 0x01;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
572 switch (setuppkt.wIndex & 0xFF) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
573 case 0x01:
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
574 d12_write_cmd(D12_SET_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
575 D12_ENDPOINT_EP1_OUT, buffer, 1);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
576 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
577 case 0x81:
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
578 d12_write_cmd(D12_SET_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
579 D12_ENDPOINT_EP1_IN, buffer, 1);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
580 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
581 case 0x02:
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
582 d12_write_cmd(D12_SET_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
583 D12_ENDPOINT_EP2_OUT, buffer, 1);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
584 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
585 case 0x82:
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
586 d12_write_cmd(D12_SET_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
587 D12_ENDPOINT_EP2_IN, buffer, 1);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
588 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
589 default: /* Invalid Endpoint -
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
590 * RequestError */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
591 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
592 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
593 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
594 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
595 d12_write_endpt(D12_ENDPOINT_EP0_IN, NULL, 0);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
596 } else {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
597 /*
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
598 * No other Features for Endpoint -
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
599 * Request Error
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
600 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
601 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
602 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
603 }
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
604 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
605
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
606 case GET_STATUS:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
607 /*
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
608 * Get Status Request to Endpoint should
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
609 * return Halt Status in D0 for Interrupt and Bulk
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
610 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
611 switch (setuppkt.wIndex & 0xFF) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
612 case 0x01:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
613 d12_read_cmd(D12_READ_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
614 D12_ENDPOINT_EP1_OUT, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
615 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
616 case 0x81:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
617 d12_read_cmd(D12_READ_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
618 D12_ENDPOINT_EP1_IN, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
619 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
620 case 0x02:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
621 d12_read_cmd(D12_READ_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
622 D12_ENDPOINT_EP2_OUT, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
623 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
624 case 0x82:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
625 d12_read_cmd(D12_READ_ENDPOINT_STATUS + \
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
626 D12_ENDPOINT_EP2_IN, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
627 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
628 default: /* Invalid Endpoint -
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
629 * RequestError */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
630 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
631 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
632 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
633 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
634 if (buffer[0] & 0x08)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
635 buffer[0] = 0x01;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
636 else
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
637 buffer[0] = 0x00;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
638 buffer[1] = 0x00;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
639 d12_write_endpt(D12_ENDPOINT_EP0_IN, buffer, 2);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
640 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
641
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
642 default:
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
643 /* Unsupported - Request Error - Stall */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
644 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
645 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
646 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
647 }
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
648 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
649 case VENDOR_DEVICE_REQUEST:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
650 case VENDOR_ENDPOINT_REQUEST:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
651 switch (setuppkt.bRequest) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
652 case VENDOR_RESET:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
653 d12_write_endpt(D12_ENDPOINT_EP0_IN, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
654 _delay_us(1000);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
655 /* disconnect from USB */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
656 buffer[0] = D12_MODE_0 & 0xef;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
657 buffer[1] = D12_MODE_1;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
658 d12_write_cmd(D12_SET_MODE, buffer, 2);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
659 _delay_us(1000);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
660 cli();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
661 reset();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
662 /* NOT REACHED */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
663 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
664
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
665 case VENDOR_UPDATE:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
666 d12_write_endpt(D12_ENDPOINT_EP0_IN, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
667 _delay_us(1000);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
668 /* disconnect from USB */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
669 buffer[0] = D12_MODE_0 & 0xef;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
670 buffer[1] = D12_MODE_1;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
671 d12_write_cmd(D12_SET_MODE, buffer, 2);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
672 _delay_us(1000);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
673 cli();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
674 bootloader();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
675 /* NOT REACHED */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
676 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
677
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
678 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
679 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
680 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
681 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
682 }
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
683 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
684 case VENDOR_INTERFACE_REQUEST:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
685 switch (setuppkt.bRequest) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
686 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
687 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
688 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
689 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
690 }
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
691 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
692 default:
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
693 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
694 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
695 break;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
696 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
697 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
698
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
699
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
700 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
701 ** reset
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
702 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
703 ** Reset the micro by triggering the watchdog timer.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
704 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
705 */
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
706 void
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
707 reset(void) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
708 uart_putsP(PSTR("Resetting!\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
709 _delay_us(1000);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
710
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
711 /* Disable the interrupts */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
712 MCUCR = _BV(IVCE);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
713 MCUCR = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
714
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
715 /* Enable watchdog, smallest prescaler */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
716 WDTCR = _BV(WDE);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
717
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
718 /* Wait for oblivion! */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
719 for (;;)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
720 ;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
721 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
722
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
723 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
724 ** d12_getdescriptor
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
725 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
726 ** Handle returning the various descriptor to the host
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
727 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
728 ** Note: that we need to truncate the request because the host first
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
729 ** requests the first 2 bytes to find out then size, then requests the
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
730 ** rest.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
731 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
732 void
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
733 d12_getdescriptor(USB_SETUP_REQUEST *setuppkt) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
734 switch ((setuppkt->wValue & 0xff00) >> 8) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
735 case TYPE_DEVICE_DESCRIPTOR:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
736 sendbuffer0 = (const uint8_t *)&DeviceDescriptor;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
737 sendbytes0 = DeviceDescriptor.bLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
738 if (sendbytes0 >= setuppkt->wLength)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
739 sendbytes0 = setuppkt->wLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
740
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
741 d12_send_data_ep0();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
742 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
743
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
744 case TYPE_CONFIGURATION_DESCRIPTOR:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
745 sendbuffer0 = (const uint8_t *)&ConfigurationDescriptor;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
746 sendbytes0 = sizeof(ConfigurationDescriptor);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
747 if (sendbytes0 >= setuppkt->wLength)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
748 sendbytes0 = setuppkt->wLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
749
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
750 d12_send_data_ep0();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
751 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
752
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
753 case TYPE_STRING_DESCRIPTOR:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
754 switch (setuppkt->wValue & 0xFF) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
755 case 0:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
756 sendbuffer0 = (const uint8_t *)&LANGID_Descriptor;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
757 sendbytes0 = LANGID_Descriptor.bLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
758 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
759
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
760 case 1:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
761 sendbuffer0 = (const uint8_t *)&Manufacturer_Descriptor;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
762 sendbytes0 = Manufacturer_Descriptor.bLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
763 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
764
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
765 case 2:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
766 sendbuffer0 = (const uint8_t *)&Product_Descriptor;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
767 sendbytes0 = Product_Descriptor.bLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
768 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
769
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
770 case 3:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
771 sendbuffer0 = (const uint8_t *)&Serial_Descriptor;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
772 sendbytes0 = Serial_Descriptor.bLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
773 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
774
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
775 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
776 sendbuffer0 = NULL;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
777 sendbytes0 = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
778 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
779 if (sendbytes0 >= setuppkt->wLength)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
780 sendbytes0 = setuppkt->wLength;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
781
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
782 d12_send_data_ep0();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
783 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
784
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
785 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
786 d12_stallendpt(D12_ENDPOINT_EP0_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
787 d12_stallendpt(D12_ENDPOINT_EP0_OUT);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
788 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
789 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
790 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
791
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
792 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
793 ** d12_stallendpt
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
794 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
795 ** Stall the nominated endpoint.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
796 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
797 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
798 void
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
799 d12_stallendpt(uint8_t ep) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
800 uint8_t buffer[] = {0x01};
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
801
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
802 d12_write_cmd(D12_SET_ENDPOINT_STATUS + ep, buffer, 1);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
803 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
804
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
805 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
806 ** d12_read_cmd
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
807 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
808 ** Read data from the nominated endpoint if it's full.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
809 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
810 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
811 uint8_t
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
812 d12_read_endpt(uint8_t endpt, uint8_t *buffer) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
813 uint8_t d12header[2], status, i;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
814
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
815 d12header[1] = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
816
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
817 /* Select Endpoint */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
818 d12_read_cmd(endpt, &status, 1);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
819
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
820 /* Check if buffer is Full */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
821 if (status & 0x01) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
822 d12_set_cmd(D12_READ_BUFFER);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
823 d12header[0] = d12_get_data();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
824 d12header[1] = d12_get_data();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
825 if (d12header[1]) {
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
826 for (i = 0; i < d12header[1]; i++)
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
827 buffer[i] = d12_get_data();
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
828 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
829 /* Allow new packets to be accepted */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
830 d12_write_cmd(D12_CLEAR_BUFFER, NULL, 0);
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
831
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
832 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
833 return d12header[1];
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
834 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
835
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
836 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
837 ** d12_read_cmd
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
838 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
839 ** Write data to the nominated endpoint.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
840 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
841 */
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
842 void
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
843 d12_write_endpt(uint8_t endpt, const uint8_t *buffer, uint8_t bytes) {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
844 uint8_t status, i;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
845
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
846 /* Select Endpoint */
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
847 d12_read_cmd(endpt, &status, 1);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
848 if ((status & 0x01) != 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
849 uart_putsP(PSTR("Endpoint "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
850 uart_puts_dec(endpt / 2, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
851 uart_putsP(PSTR(" IN is full..\n\r"));
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
852 return;
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
853 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
854
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
855 /* Write Header */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
856 d12_set_cmd(D12_WRITE_BUFFER);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
857 d12_set_data(0x00);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
858 d12_set_data(bytes);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
859 /* Write Packet */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
860 if (bytes) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
861 for (i = 0; i < bytes; i++)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
862 d12_set_data(buffer[i]);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
863 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
864 /* Validate buffer */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
865 d12_write_cmd(D12_VALIDATE_BUFFER, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
866 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
867
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
868 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
869 ** d12_send_data_ep0
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
870 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
871 ** Send the next FIFOs worth of data to the endpoint and update the
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
872 ** pointer and counters.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
873 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
874 ** d12_send_data_epX should be collapsed together but it's more
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
875 ** complex than it looks.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
876 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
877 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
878 void
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
879 d12_send_data_ep0(void) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
880 uint8_t status;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
881
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
882 /* Select endpoint */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
883 d12_read_cmd(D12_ENDPOINT_EP0_IN, &status, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
884
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
885 if (status & 0x01) /* Bail if the buffer is full */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
886 return;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
887
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
888 if (sendbytes0 == 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
889 /* Nothing to do */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
890 } else if (sendbytes0 >= EP0_FIFO_SZ) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
891 /* Write another EP0_FIFO_SZ Bytes to buffer and send */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
892 d12_write_endpt(D12_ENDPOINT_EP0_IN, sendbuffer0, EP0_FIFO_SZ);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
893 sendbuffer0 += EP0_FIFO_SZ;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
894 sendbytes0 -= EP0_FIFO_SZ;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
895 } else {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
896 /* Buffer must have less than EP0_FIFO_SZ bytes left */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
897 d12_write_endpt(D12_ENDPOINT_EP0_IN, sendbuffer0, sendbytes0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
898 sendbytes0 = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
899 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
900 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
901
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
902 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
903 ** d12_send_data_ep2
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
904 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
905 ** Send the next FIFOs worth of data to the endpoint and update the
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
906 ** pointer and counters.
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
907 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
908 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
909 void
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
910 d12_send_data_ep2(void) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
911 uint8_t status;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
912
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
913 /* Select endpoint */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
914 d12_read_cmd(D12_ENDPOINT_EP2_IN, &status, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
915
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
916 if (status & 0x01) /* Bail if the buffer is full */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
917 return;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
918
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
919 if (sendbytes2 == 0) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
920 /* Nothing to do */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
921 } else if (sendbytes2 >= EP2_FIFO_SZ) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
922 /* Write another EP2_FIFO_SZ Bytes to buffer and send */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
923 d12_write_endpt(D12_ENDPOINT_EP2_IN, sendbuffer2, EP2_FIFO_SZ);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
924 sendbuffer2 += EP2_FIFO_SZ;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
925 sendbytes2 -= EP2_FIFO_SZ;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
926 } else {
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
927 /* Buffer must have less than EP2_FIFO_SZ bytes left */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
928 d12_write_endpt(D12_ENDPOINT_EP2_IN, sendbuffer2, sendbytes2);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
929 sendbytes2 = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
930 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
931 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
932
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
933 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
934 ** d12_receive_data_ep2
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
935 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
936 ** Get the next FIFOs worth of data from the endpoint
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
937 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
938 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
939 void
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
940 d12_receive_data_ep2(void) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
941 uint8_t d12header[2], bytes, i, status;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
942
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
943 /* Select Endpoint */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
944 d12_read_cmd(D12_ENDPOINT_EP2_OUT, &status, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
945
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
946 if (!(status & 0x01)) /* Bail if the buffer is empty */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
947 return;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
948
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
949 /* Read header */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
950 d12_set_cmd(D12_READ_BUFFER);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
951 d12header[0] = d12_get_data();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
952 d12header[1] = d12_get_data();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
953 bytes = d12header[1];
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
954
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
955 packetlen2 = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
956
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
957 for (i = 0; i < bytes; i++)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
958 packet2[i] = d12_get_data();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
959
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
960 packetlen2 += bytes;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
961
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
962 /* Allow new packets to be accepted */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
963 d12_write_cmd(D12_CLEAR_BUFFER, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
964
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
965 uart_putsP(PSTR("Got "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
966 uart_puts_dec(bytes, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
967 uart_putsP(PSTR(" bytes from the host\n\r"));
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
968
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
969 parsebuf(packet2, D12_ENDPOINT_EP2_IN);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
970
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
971 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
972
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
973 /*******************************************************************************
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
974 ** d12_receive_data_ep1
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
975 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
976 ** Get the next FIFOs worth of data from the endpoint
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
977 **
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
978 */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
979 void
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
980 d12_receive_data_ep1(void) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
981 uint8_t d12header[2], bytes, i, status;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
982
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
983 /* Select Endpoint */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
984 d12_read_cmd(D12_ENDPOINT_EP1_OUT, &status, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
985
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
986 /* Check if Buffer is Full */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
987 if (!(status & 0x01))
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
988 return;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
989
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
990 /* Read header */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
991 d12_set_cmd(D12_READ_BUFFER);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
992 d12header[0] = d12_get_data();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
993 d12header[1] = d12_get_data();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
994 bytes = d12header[1];
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
995
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
996 packetlen1 = 0;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
997
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
998 for (i = 0; i < bytes; i++)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
999 packet1[i] = d12_get_data();
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1000
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1001 packetlen1 += bytes;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1002
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1003 uart_putsP(PSTR("Got "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1004 uart_puts_dec(bytes, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1005 uart_putsP(PSTR(" bytes from the host\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1006
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1007 /* Allow new packets to be accepted */
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1008 d12_write_cmd(D12_CLEAR_BUFFER, NULL, 0);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1009
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1010 parsebuf(packet1, D12_ENDPOINT_EP1_IN);
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1011 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1012
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1013 void
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1014 parsebuf(uint8_t *buffer, uint8_t ep) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1015 int i;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1016
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1017 switch (buffer[0]) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1018 case 0x00:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1019 uart_putsP(PSTR("OWTouchReset()\n\r"));
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
1020 buffer[0] = OWTouchReset();
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1021 d12_write_endpt(ep, buffer, 1);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1022 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1023
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1024 case 0x01:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1025 uart_putsP(PSTR("OWFirst()\n\r"));
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
1026 buffer[0] = OWFirst(&buffer[1], 1, 0);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1027 for (i = 0; i < 9; i++) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1028 uart_puts_hex(buffer[i + 1]);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1029 uart_putsP(PSTR(" "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1030 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1031 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1032 d12_write_endpt(ep, buffer, 9);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1033 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1034
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1035 case 0x02:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1036 uart_putsP(PSTR("OWNext()\n\r"));
35
fed32b382de2 Tidy up, hide details behind macros to make it more obvious what we
darius
parents: 31
diff changeset
1037 buffer[0] = OWNext(&buffer[1], 1, 0);
31
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1038 d12_write_endpt(ep, buffer, 9);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1039 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1040
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1041 case 0x03:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1042 uart_putsP(PSTR(" bytes, asked to do temperature conversion for "));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1043 for (i = 0; i < 8; i++) {
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1044 uart_puts_hex(buffer[i + 1]);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1045 if (i != 7)
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1046 uart_putsP(PSTR(":"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1047 }
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1048
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1049 uart_putsP(PSTR("\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1050 d12_write_endpt(ep, buffer, 9);
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1051
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1052 break;
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1053
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1054 default:
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1055 uart_putsP(PSTR("Unknown command on endpoint 1\n\r"));
4e417d84365e - Rename some more functions to be consistent.
darius
parents: 26
diff changeset
1056 break;
23
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1057 }
845934a4e7fe Add code to talk to a Phillips PDIUSBB12.
darius
parents:
diff changeset
1058 }