3 #include <system_def.h>
10 #include <usb/usb_loader.h>
11 #include <usb/usbdebug.h>
15 #include "appl_defs.h"
16 #include "usb/usb_defs.h"
17 #include "appl_fpga.h"
22 #include <lpciap_kvpb.h>
23 #include <hal_machperiph.h>
24 #endif /*CONFIG_KEYVAL*/
27 #if __BYTE_ORDER == __BIG_ENDIAN
29 #define SWAP(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
30 #else /*__LITTLE_ENDIAN*/
34 #define USB_VENDOR_TARGET_TUMBL 0x03
35 #define USB_VENDOR_TARGET_32BIT 0x04
37 #define USB_CMD_FPGA_CONFIGURE 0xF000
38 #define USB_CMD_FPGA_MEASURE_READ 0xF001
39 #define USB_CMD_FPGA_MEASURE_WRITE 0xF002
41 #define USB_CMD_FPGA_IRC_GET_RESET 0xF010
42 #define USB_CMD_FPGA_IRC_SET_RESET 0xF011
43 #define USB_CMD_FPGA_IRC_DUMP 0xF012
45 #define USB_CMD_FPGA_LXMASTER_GET_RESET 0xF020
46 #define USB_CMD_FPGA_LXMASTER_SET_RESET 0xF021
47 #define USB_CMD_FPGA_LXMASTER_TRANSMITTER_GET_REG 0xF022
48 #define USB_CMD_FPGA_LXMASTER_TRANSMITTER_SET_REG 0xF023
49 #define USB_CMD_FPGA_LXMASTER_TRANSMITTER_WRITE 0xF024
50 #define USB_CMD_FPGA_LXMASTER_TRANSMITTER_DUMP 0xF025
52 #define USB_CMD_FPGA_TUMBL_SET_RESET 0xF100
53 #define USB_CMD_FPGA_TUMBL_SET_HALT 0xF101
54 #define USB_CMD_FPGA_TUMBL_SET_TRACE 0xF102
55 #define USB_CMD_FPGA_TUMBL_KICK_TRACE 0xF103
56 #define USB_CMD_FPGA_TUMBL_GET_PC 0xF104
58 #define USB_CMD_FPGA_TUMBL_DUMP_IMEM 0xF200
59 #define USB_CMD_FPGA_TUMBL_DUMP_DMEM 0xF201
61 #define USB_CMD_FPGA_RESET 0xFFFF
63 usb_device_t usb_device;
64 usb_ep_t eps[NUM_ENDPOINTS];
66 #define MASK_EP1RX 0x01
67 #define MASK_EP1TX 0x02
69 unsigned char ep1_rx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
70 unsigned char ep1_tx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
71 unsigned char ep0_buffer[USB_MAX_PACKET0] __attribute__ ((aligned (8)));
73 int ep1_rx_index = 0, ep1_rx_ready = 1;
74 int ep1_tx_index = 0, ep1_tx_chars = 0;
76 #ifdef CONFIG_OC_CMDPROC
78 cmd_io_t cmd_io_usbcon_dev;
80 #define ED_LINE_CHARS 512
82 char ed_line_chars_usbcon_in[ED_LINE_CHARS + 1];
83 char ed_line_chars_usbcon_out[ED_LINE_CHARS + 1];
85 ed_line_buf_t ed_line_buf_usbcon_in =
91 sizeof(ed_line_chars_usbcon_in),
95 ed_line_chars_usbcon_in
98 ed_line_buf_t ed_line_buf_usbcon_out =
104 sizeof(ed_line_chars_usbcon_out),
108 ed_line_chars_usbcon_out
111 cmd_io_t cmd_io_usbcon =
126 &ed_line_buf_usbcon_in,
128 &ed_line_buf_usbcon_out,
137 static int usb_flash_pkt_wr(struct usb_ep_t *ep, int len, int code)
139 unsigned char *ptr = ep->ptr - len;
142 lpcisp_kvpb_copy(NULL, (void *)ep->user_data, ptr, len);
143 #endif /*CONFIG_KEYVAL*/
145 ep->user_data += len;
146 ep->ptr = ep0_buffer;
147 return USB_COMPLETE_OK;
150 static int usb_tumbl_pkt_wr(struct usb_ep_t *ep, int len, int code)
152 unsigned char *ptr = ep->ptr - len;
154 fpga_tumbl_write(ep->user_data, ptr, len);
156 ep->user_data += len;
157 ep->ptr = ep0_buffer;
158 return USB_COMPLETE_OK;
161 static int usb_32bit_pkt_wr(struct usb_ep_t *ep, int len, int code)
163 uint32_t *srcptr = (uint32_t *)(ep->ptr - len);
164 volatile uint32_t *dstptr = (uint32_t *)ep->user_data;
167 for (pos = 0; len - pos >= 4; pos += 4, dstptr++, srcptr++)
170 ep->user_data += len;
171 ep->ptr = ep0_buffer;
172 return USB_COMPLETE_OK;
175 int usb_32bit_pkt_rd(struct usb_ep_t *ep, int len, int code)
177 volatile uint32_t *srcptr;
181 ep->ptr = ep0_buffer;
182 dstptr = (uint32_t *)ep->ptr;
183 srcptr = (uint32_t *)ep->user_data;
185 for (pos = 0; len - pos >= 4; pos += 4, dstptr++, srcptr++)
188 ep->user_data += len;
189 return USB_COMPLETE_OK;
192 static int usb_flash_erase(unsigned addr, unsigned len)
195 lpcisp_erase((void *)addr, len);
196 #endif /*CONFIG_KEYVAL*/
200 static void usb_goto(unsigned address)
203 lpc_watchdog_init(1, 10);
209 #endif /*CONFIG_KEYVAL*/
213 uint16_t vendor_call_ret = 0xFFFF;
215 uint16_t appl_usb_vendor_call(uint16_t command, uint16_t argument)
221 case USB_CMD_FPGA_CONFIGURE:
222 return fpga_configure();
224 case USB_CMD_FPGA_MEASURE_READ:
225 return fpga_measure_bus_read();
227 case USB_CMD_FPGA_MEASURE_WRITE:
228 return fpga_measure_bus_write();
230 case USB_CMD_FPGA_IRC_GET_RESET:
231 printf("IRC RESET: 0x%02x\n", *fpga_irc_reset);
234 case USB_CMD_FPGA_IRC_SET_RESET:
235 /* When starting, zero out counters */
236 *fpga_irc_reset = argument & 0x0001;
239 case USB_CMD_FPGA_IRC_DUMP:
240 for (i = 0; i < 8; i++)
241 printf("IRC%d: count = %d, count index = %d, mark = %d, ab_error = %d, index_event = %d, index = %d\n", i+1,
242 (unsigned int) fpga_irc[i]->count, (unsigned int) fpga_irc[i]->count_index, ((*(fpga_irc_state[i])) & 0x01) != 0,
243 ((*(fpga_irc_state[i])) & 0x02) != 0, ((*(fpga_irc_state[i])) & 0x04) != 0, ((*(fpga_irc_state[i])) & 0x08) != 0);
246 case USB_CMD_FPGA_LXMASTER_GET_RESET:
247 printf("LXMASTER RESET: 0x%02x\n", *fpga_lx_master_reset);
250 case USB_CMD_FPGA_LXMASTER_SET_RESET:
251 /* When starting, zero out counters */
252 *fpga_lx_master_reset = argument & 0x0001;
255 case USB_CMD_FPGA_LXMASTER_TRANSMITTER_GET_REG:
256 printf("LXMASTER TRANSMITTER REG: 0x%02x\n", *fpga_lx_master_transmitter_reg);
259 case USB_CMD_FPGA_LXMASTER_TRANSMITTER_SET_REG:
260 /* When starting, zero out counters */
261 *fpga_lx_master_transmitter_reg = argument & 0x0001;
264 case USB_CMD_FPGA_LXMASTER_TRANSMITTER_WRITE:
265 for (i = 0; i < (argument / 4); i++)
266 fpga_lx_master_transmitter_base[i] = fpga_lx_master_conf[i];
269 case USB_CMD_FPGA_LXMASTER_TRANSMITTER_DUMP:
270 printf("LX MASTER TRANSMITTER MEM:\n");
271 for (i = 0; i < 16; i++)
273 for (j = 0; j < 16; j++)
274 printf("%04X ", (unsigned int) (fpga_lx_master_transmitter_base[i*16 + j] & 0xFFFF));
280 case USB_CMD_FPGA_TUMBL_SET_RESET:
281 return fpga_tumbl_set_reset(argument);
283 case USB_CMD_FPGA_TUMBL_SET_HALT:
284 return fpga_tumbl_set_halt(argument);
286 case USB_CMD_FPGA_TUMBL_SET_TRACE:
287 return fpga_tumbl_set_trace(argument);
289 case USB_CMD_FPGA_TUMBL_KICK_TRACE:
290 return fpga_tumbl_kick_trace();
292 case USB_CMD_FPGA_TUMBL_GET_PC:
293 printf("Tubml PC: 0x%08X\n", (unsigned int) *fpga_tumbl_pc);
296 case USB_CMD_FPGA_TUMBL_DUMP_IMEM:
297 printf("TUMBL IMEM:\n");
298 for (i = 0; i < 64; i++)
300 for (j = 0; j < 8; j++)
301 printf("%08X ", (unsigned int) fpga_tumbl_imem[i*8 + j]);
307 case USB_CMD_FPGA_TUMBL_DUMP_DMEM:
308 printf("TUMBL DMEM:\n");
309 for (i = 0; i < 128; i++)
311 for (j = 0; j < 8; j++)
312 printf("%08X ", (unsigned int) fpga_tumbl_dmem[i*8 + j]);
318 case USB_CMD_FPGA_RESET:
319 hal_gpio_direction_output(XC_INIT_PIN, 0);
321 for (i = 0; i < 128; i++)
324 hal_gpio_direction_output(XC_INIT_PIN, 1);
331 int appl_usb_vendor(usb_device_t *udev)
335 USB_DEVICE_REQUEST *dreq;
338 dreq = &udev->request;
342 if (dreq->bRequest != (USB_VENDOR_GET_SET_MEMORY |
343 USB_DATA_DIR_FROM_HOST | USB_VENDOR_TARGET_FLASH))
344 lpcisp_kvpb_flush(NULL);
346 #endif /*CONFIG_KEYVAL*/
348 switch (dreq->bRequest & USB_VENDOR_MASK)
350 case USB_VENDOR_GET_CAPABILITIES:
351 ep0_buffer[0] = 0xAA; // test
352 usb_send_control_data(udev, ep0_buffer, 1);
355 case USB_VENDOR_RESET_DEVICE:
356 usb_send_control_data(udev, NULL, 0);
358 lpc_watchdog_init(1, 10);
364 #endif /*CONFIG_KEYVAL*/
367 case USB_VENDOR_GOTO:
368 usb_send_control_data(udev, NULL, 0);
369 usb_goto(dreq->wValue);
372 case USB_VENDOR_ERASE_MEMORY:
373 usb_send_control_data(udev, NULL, 0);
374 usb_flash_erase(dreq->wValue, dreq->wIndex);
377 case USB_VENDOR_ERASE_1KB_MEMORY: /* erase memory for 1 KB */
378 usb_send_control_data(udev, NULL, 0);
379 usb_flash_erase((uint32_t)dreq->wValue << 10, dreq->wIndex << 10);
382 case USB_VENDOR_CALL:
383 vendor_call_ret = SWAP(appl_usb_vendor_call(dreq->wIndex, dreq->wValue));
384 usb_send_control_data(udev, (unsigned char *) &vendor_call_ret, sizeof(uint16_t));
387 case USB_VENDOR_GET_SET_MEMORY:
388 addr = (dreq->wValue & 0xffff) | (((unsigned long)dreq->wIndex & 0xffff) << 16);
391 if ((dreq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST)
393 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
395 case USB_VENDOR_TARGET_RAM:
396 udev->ep0.ptr = (void *)addr;
399 case USB_VENDOR_TARGET_FLASH:
400 udev->ep0.next_pkt_fnc = usb_flash_pkt_wr;
401 udev->ep0.user_data = addr;
402 udev->ep0.ptr = ep0_buffer;
405 case USB_VENDOR_TARGET_TUMBL:
406 udev->ep0.next_pkt_fnc = usb_tumbl_pkt_wr;
407 udev->ep0.user_data = addr;
408 udev->ep0.ptr = ep0_buffer;
411 case USB_VENDOR_TARGET_32BIT:
412 udev->ep0.next_pkt_fnc = usb_32bit_pkt_wr;
413 udev->ep0.user_data = addr;
414 udev->ep0.ptr = ep0_buffer;
422 usb_set_control_endfnc(udev, usb_ack_setup);
424 usb_send_control_data(udev, NULL, 0);
430 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
432 case USB_VENDOR_TARGET_RAM:
433 usb_send_control_data(udev, (void *)addr, len);
436 case USB_VENDOR_TARGET_32BIT:
437 udev->ep0.next_pkt_fnc = usb_32bit_pkt_rd;
438 udev->ep0.user_data=addr;
439 usb_send_control_data( udev, ep0_buffer, len);
455 int usb_app_fill_serial_number(uint32_t ul_sn)
457 char *p = usb_devdes_serial_number;
458 int len_max = sizeof(usb_devdes_serial_number);
461 while ((len_max -= 2) >= 2)
464 c = ((ul_sn >> (32 - 4)) & 0xf) + '0';
476 int usb_app_init(void)
478 memset(&usb_device, 0, sizeof(usb_device));
480 eps[0].max_packet_size = USB_MAX_PACKET;
481 eps[1].max_packet_size = USB_MAX_PACKET;
484 eps[0].event_mask = 0x08;
485 eps[1].event_mask = 0x04;
486 eps[0].udev = &usb_device;
487 eps[1].udev = &usb_device;
490 usb_device.devdes_table = &usb_devdes_table;
491 usb_device.init = usb_lpc_init;
492 usb_debug_set_level(DEBUG_LEVEL_NONE);
493 usb_device.cntep = NUM_ENDPOINTS;
495 usb_device.vendor_fnc = appl_usb_vendor;
497 usb_init(&usb_device);
498 usb_connect(&usb_device);
505 if (usb_device.ep_events & MASK_EP1RX)
507 usb_device.ep_events &= ~MASK_EP1RX;
508 //TODO: Use some field in the structure, probably flags
512 /* Respond if there is something to send and RX is ready */
513 if (ep1_rx_ready && ep1_rx_index != 0)
515 usb_udev_write_endpoint(&eps[0], ep1_rx_buff, ep1_rx_index);
518 hal_gpio_set_value(LED2_PIN, 0);
525 int usb_app_poll(void)
527 int active = usb_active;
530 usb_check_events(&usb_device);
531 usb_control_response(&usb_device);
533 /* Check TX endpoint */
534 if (usb_device.ep_events & MASK_EP1TX)
536 ep1_tx_chars = usb_udev_read_endpoint(&eps[1], ep1_tx_buff, USB_MAX_PACKET);
538 usb_device.ep_events &= ~MASK_EP1TX;
539 hal_gpio_set_value(LED2_PIN, 0);
543 /* Check RX endpoint */
544 usb_active |= usb_check_ep1();
549 int usb_app_stop(void)
551 usb_disconnect(&usb_device);
555 #ifdef CONFIG_OC_CMDPROC
557 int cmd_io_getc_usbcon(struct cmd_io *cmd_io)
559 if (ep1_tx_index >= ep1_tx_chars)
562 return ep1_tx_buff[ep1_tx_index++];
565 int cmd_io_putc_usbcon(struct cmd_io *cmd_io, int ch)
567 if (ep1_rx_index >= USB_MAX_PACKET)
569 /* Check EP1 status and return -1 if unavailable */
570 usb_check_events(&usb_device);
573 /* Check again if it wasn't emptied */
574 if (ep1_rx_index >= USB_MAX_PACKET)
578 ep1_rx_buff[ep1_rx_index++] = (unsigned char)ch;
582 cmd_io_t cmd_io_usbcon_dev =
584 .putc = cmd_io_putc_usbcon,
585 .getc = cmd_io_getc_usbcon,
586 .write = cmd_io_write_bychar,
587 .read = cmd_io_read_bychar,