3 #include <system_def.h>
9 #include <usb/usb_loader.h>
10 #include <usb/usbdebug.h>
14 #include "appl_defs.h"
15 #include "usb/usb_defs.h"
16 #include "appl_fpga.h"
21 #include <lpciap_kvpb.h>
22 #include <hal_machperiph.h>
23 #endif /*CONFIG_KEYVAL*/
26 #if __BYTE_ORDER == __BIG_ENDIAN
28 #define SWAP(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
29 #else /*__LITTLE_ENDIAN*/
33 #define USB_VENDOR_TARGET_TUMBL 0x03
35 #define USB_CMD_FPGA_CONFIGURE 0xF000
36 #define USB_CMD_FPGA_MEASURE_READ 0xF001
37 #define USB_CMD_FPGA_MEASURE_WRITE 0xF002
39 #define USB_CMD_FPGA_IRC_SET_RESET 0xF010
40 #define USB_CMD_FPGA_IRC_DUMP 0xF011
42 #define USB_CMD_FPGA_TUMBL_SET_RESET 0xF100
43 #define USB_CMD_FPGA_TUMBL_SET_HALT 0xF101
44 #define USB_CMD_FPGA_TUMBL_SET_TRACE 0xF102
45 #define USB_CMD_FPGA_TUMBL_KICK_TRACE 0xF103
46 #define USB_CMD_FPGA_TUMBL_GET_PC 0xF104
48 #define USB_CMD_FPGA_TUMBL_DUMP_IMEM 0xF200
49 #define USB_CMD_FPGA_TUMBL_DUMP_DMEM 0xF201
51 #define USB_CMD_FPGA_RESET 0xFFFF
53 usb_device_t usb_device;
54 usb_ep_t eps[NUM_ENDPOINTS];
56 #define MASK_EP1RX 0x01
57 #define MASK_EP1TX 0x02
59 unsigned char ep1_rx_buff[USB_MAX_PACKET];
60 unsigned char ep1_tx_buff[USB_MAX_PACKET];
61 unsigned char ep0_buffer[USB_MAX_PACKET0];
63 int ep1_rx_index = 0, ep1_rx_ready = 1;
64 int ep1_tx_index = 0, ep1_tx_chars = 0;
66 #ifdef CONFIG_OC_CMDPROC
68 cmd_io_t cmd_io_usbcon_dev;
70 #define ED_LINE_CHARS 512
72 char ed_line_chars_usbcon_in[ED_LINE_CHARS + 1];
73 char ed_line_chars_usbcon_out[ED_LINE_CHARS + 1];
75 ed_line_buf_t ed_line_buf_usbcon_in =
81 sizeof(ed_line_chars_usbcon_in),
85 ed_line_chars_usbcon_in
88 ed_line_buf_t ed_line_buf_usbcon_out =
94 sizeof(ed_line_chars_usbcon_out),
98 ed_line_chars_usbcon_out
101 cmd_io_t cmd_io_usbcon =
116 &ed_line_buf_usbcon_in,
118 &ed_line_buf_usbcon_out,
127 static int usb_flash_pkt_wr(struct usb_ep_t *ep, int len, int code)
129 unsigned char *ptr = ep->ptr - len;
132 lpcisp_kvpb_copy(NULL, (void *)ep->user_data, ptr, len);
133 #endif /*CONFIG_KEYVAL*/
135 ep->user_data += len;
136 ep->ptr = ep0_buffer;
137 return USB_COMPLETE_OK;
140 static int usb_tumbl_pkt_wr(struct usb_ep_t *ep, int len, int code)
142 unsigned char *ptr = ep->ptr - len;
144 appl_fpga_tumbl_write(ep->user_data, ptr, len);
146 ep->user_data += len;
147 ep->ptr = ep0_buffer;
148 return USB_COMPLETE_OK;
151 static int usb_flash_erase(unsigned addr, unsigned len)
154 lpcisp_erase((void *)addr, len);
155 #endif /*CONFIG_KEYVAL*/
159 static void usb_goto(unsigned address)
162 lpc_watchdog_init(1, 10);
168 #endif /*CONFIG_KEYVAL*/
172 uint16_t vendor_call_ret = 0xFFFF;
174 uint16_t appl_usb_vendor_call(uint16_t command, uint16_t argument)
180 case USB_CMD_FPGA_CONFIGURE:
181 return appl_fpga_configure();
183 case USB_CMD_FPGA_MEASURE_READ:
184 return appl_fpga_measure_bus_read();
186 case USB_CMD_FPGA_MEASURE_WRITE:
187 return appl_fpga_measure_bus_write();
189 case USB_CMD_FPGA_IRC_SET_RESET:
190 /* When starting, zero out counters */
191 *irc_reset = argument & 0x0001;
194 case USB_CMD_FPGA_IRC_DUMP:
195 printf("IRC1: count = %d, count index = %d, state = 0x%02x\n", (unsigned int) irc1->count, (unsigned int) irc1->count_index, (unsigned int)(*irc1_state));
196 printf("IRC2: count = %d, count index = %d, state = 0x%02x\n", (unsigned int) irc2->count, (unsigned int) irc2->count_index, (unsigned int)(*irc2_state));
197 printf("IRC3: count = %d, count index = %d, state = 0x%02x\n", (unsigned int) irc3->count, (unsigned int) irc3->count_index, (unsigned int)(*irc3_state));
198 printf("IRC4: count = %d, count index = %d, state = 0x%02x\n", (unsigned int) irc4->count, (unsigned int) irc4->count_index, (unsigned int)(*irc4_state));
202 case USB_CMD_FPGA_TUMBL_SET_RESET:
203 return appl_fpga_tumbl_set_reset(argument);
205 case USB_CMD_FPGA_TUMBL_SET_HALT:
206 return appl_fpga_tumbl_set_halt(argument);
208 case USB_CMD_FPGA_TUMBL_SET_TRACE:
209 return appl_fpga_tumbl_set_trace(argument);
211 case USB_CMD_FPGA_TUMBL_KICK_TRACE:
212 return appl_fpga_tumbl_kick_trace();
214 case USB_CMD_FPGA_TUMBL_GET_PC:
215 printf("Tubml PC: 0x%08X\n", (unsigned int) *tumbl_pc);
218 case USB_CMD_FPGA_TUMBL_DUMP_IMEM:
219 printf("TUMBL IMEM:\n");
220 for (i = 0; i < 64; i++)
222 for (j = 0; j < 8; j++)
223 printf("%08X ", (unsigned int) tumbl_imem[i*8 + j]);
229 case USB_CMD_FPGA_TUMBL_DUMP_DMEM:
230 printf("TUMBL DMEM:\n");
231 for (i = 0; i < 128; i++)
233 for (j = 0; j < 8; j++)
234 printf("%08X ", (unsigned int) tumbl_dmem[i*8 + j]);
240 case USB_CMD_FPGA_RESET:
241 hal_gpio_direction_output(XC_INIT_PIN, 0);
243 for (i = 0; i < 128; i++)
246 hal_gpio_direction_output(XC_INIT_PIN, 1);
253 int appl_usb_vendor(usb_device_t *udev)
257 USB_DEVICE_REQUEST *dreq;
260 dreq = &udev->request;
264 if (dreq->bRequest != (USB_VENDOR_GET_SET_MEMORY |
265 USB_DATA_DIR_FROM_HOST | USB_VENDOR_TARGET_FLASH))
266 lpcisp_kvpb_flush(NULL);
268 #endif /*CONFIG_KEYVAL*/
270 switch (dreq->bRequest & USB_VENDOR_MASK)
272 case USB_VENDOR_GET_CAPABILITIES:
273 ep0_buffer[0] = 0xAA; // test
274 usb_send_control_data(udev, ep0_buffer, 1);
277 case USB_VENDOR_RESET_DEVICE:
278 usb_send_control_data(udev, NULL, 0);
280 lpc_watchdog_init(1, 10);
286 #endif /*CONFIG_KEYVAL*/
289 case USB_VENDOR_GOTO:
290 usb_send_control_data(udev, NULL, 0);
291 usb_goto(dreq->wValue);
294 case USB_VENDOR_ERASE_MEMORY:
295 usb_send_control_data(udev, NULL, 0);
296 usb_flash_erase(dreq->wValue, dreq->wIndex);
299 case USB_VENDOR_ERASE_1KB_MEMORY: /* erase memory for 1 KB */
300 usb_send_control_data(udev, NULL, 0);
301 usb_flash_erase((uint32_t)dreq->wValue << 10, dreq->wIndex << 10);
304 case USB_VENDOR_CALL:
305 vendor_call_ret = SWAP(appl_usb_vendor_call(dreq->wIndex, dreq->wValue));
306 usb_send_control_data(udev, (unsigned char *) &vendor_call_ret, sizeof(uint16_t));
309 case USB_VENDOR_GET_SET_MEMORY:
310 addr = (dreq->wValue & 0xffff) | (((unsigned long)dreq->wIndex & 0xffff) << 16);
313 if ((dreq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST)
315 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
317 case USB_VENDOR_TARGET_RAM:
318 udev->ep0.ptr = (void *)addr;
321 case USB_VENDOR_TARGET_FLASH:
322 udev->ep0.next_pkt_fnc = usb_flash_pkt_wr;
323 udev->ep0.user_data = addr;
324 udev->ep0.ptr = ep0_buffer;
327 case USB_VENDOR_TARGET_TUMBL:
328 udev->ep0.next_pkt_fnc = usb_tumbl_pkt_wr;
329 udev->ep0.user_data = addr;
330 udev->ep0.ptr = ep0_buffer;
338 usb_set_control_endfnc(udev, usb_ack_setup);
340 usb_send_control_data(udev, NULL, 0);
346 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
348 case USB_VENDOR_TARGET_RAM:
349 usb_send_control_data(udev, (void *)addr, len);
365 int usb_app_fill_serial_number(uint32_t ul_sn)
367 char *p = usb_devdes_serial_number;
368 int len_max = sizeof(usb_devdes_serial_number);
371 while ((len_max -= 2) >= 2)
374 c = ((ul_sn >> (32 - 4)) & 0xf) + '0';
386 int usb_app_init(void)
388 memset(&usb_device, 0, sizeof(usb_device));
390 eps[0].max_packet_size = USB_MAX_PACKET;
391 eps[1].max_packet_size = USB_MAX_PACKET;
394 eps[0].event_mask = 0x08;
395 eps[1].event_mask = 0x04;
396 eps[0].udev = &usb_device;
397 eps[1].udev = &usb_device;
400 usb_device.devdes_table = &usb_devdes_table;
401 usb_device.init = usb_lpc_init;
402 usb_debug_set_level(DEBUG_LEVEL_NONE);
403 usb_device.cntep = NUM_ENDPOINTS;
405 usb_device.vendor_fnc = appl_usb_vendor;
407 usb_init(&usb_device);
408 usb_connect(&usb_device);
415 if (usb_device.ep_events & MASK_EP1RX)
417 usb_device.ep_events &= ~MASK_EP1RX;
418 //TODO: Use some field in the structure, probably flags
422 /* Respond if there is something to send and RX is ready */
423 if (ep1_rx_ready && ep1_rx_index != 0)
425 usb_udev_write_endpoint(&eps[0], ep1_rx_buff, ep1_rx_index);
428 hal_gpio_set_value(LED2_PIN, 0);
435 int usb_app_poll(void)
437 int active = usb_active;
440 usb_check_events(&usb_device);
441 usb_control_response(&usb_device);
443 /* Check TX endpoint */
444 if (usb_device.ep_events & MASK_EP1TX)
446 ep1_tx_chars = usb_udev_read_endpoint(&eps[1], ep1_tx_buff, USB_MAX_PACKET);
448 usb_device.ep_events &= ~MASK_EP1TX;
449 hal_gpio_set_value(LED2_PIN, 0);
453 /* Check RX endpoint */
454 usb_active |= usb_check_ep1();
459 int usb_app_stop(void)
461 usb_disconnect(&usb_device);
465 #ifdef CONFIG_OC_CMDPROC
467 int cmd_io_getc_usbcon(struct cmd_io *cmd_io)
469 if (ep1_tx_index >= ep1_tx_chars)
472 return ep1_tx_buff[ep1_tx_index++];
475 int cmd_io_putc_usbcon(struct cmd_io *cmd_io, int ch)
477 if (ep1_rx_index >= USB_MAX_PACKET)
479 /* Check EP1 status and return -1 if unavailable */
480 usb_check_events(&usb_device);
483 /* Check again if it wasn't emptied */
484 if (ep1_rx_index >= USB_MAX_PACKET)
488 ep1_rx_buff[ep1_rx_index++] = (unsigned char)ch;
492 cmd_io_t cmd_io_usbcon_dev =
494 .putc = cmd_io_putc_usbcon,
495 .getc = cmd_io_getc_usbcon,
496 .write = cmd_io_write_bychar,
497 .read = cmd_io_read_bychar,