4 #include <system_def.h>
11 #include <usb/usb_loader.h>
12 #include <usb/usbdebug.h>
16 #include "appl_defs.h"
17 #include "usb/usb_defs.h"
20 #include "appl_fpga.h"
21 #endif /*APPL_WITH_FPGA*/
26 #include <lpciap_kvpb.h>
27 #include <hal_machperiph.h>
28 #endif /*CONFIG_KEYVAL*/
31 #if __BYTE_ORDER == __BIG_ENDIAN
33 #define SWAP(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
34 #else /*__LITTLE_ENDIAN*/
38 #define USB_VENDOR_TARGET_32BIT 0x04
40 #define USB_CMD_FPGA_CONFIGURE 0xF000
41 #define USB_CMD_FPGA_MEASURE_READ 0xF001
42 #define USB_CMD_FPGA_MEASURE_WRITE 0xF002
44 #define USB_CMD_FPGA_RESET 0xFFFF
46 usb_device_t usb_device;
47 usb_ep_t eps[NUM_ENDPOINTS];
49 #define MASK_EP1RX 0x01
50 #define MASK_EP1TX 0x02
52 unsigned char ep1_rx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
53 unsigned char ep1_tx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
54 unsigned char ep0_buffer[USB_MAX_PACKET0] __attribute__ ((aligned (8)));
56 int ep1_rx_index = 0, ep1_rx_ready = 1;
57 int ep1_tx_index = 0, ep1_tx_chars = 0;
59 #ifdef CONFIG_OC_CMDPROC
61 cmd_io_t cmd_io_usbcon_dev;
63 #define ED_LINE_CHARS 512
65 char ed_line_chars_usbcon_in[ED_LINE_CHARS + 1];
66 char ed_line_chars_usbcon_out[ED_LINE_CHARS + 1];
68 ed_line_buf_t ed_line_buf_usbcon_in =
74 sizeof(ed_line_chars_usbcon_in),
78 ed_line_chars_usbcon_in
81 ed_line_buf_t ed_line_buf_usbcon_out =
87 sizeof(ed_line_chars_usbcon_out),
91 ed_line_chars_usbcon_out
94 cmd_io_t cmd_io_usbcon =
109 &ed_line_buf_usbcon_in,
111 &ed_line_buf_usbcon_out,
120 static int usb_flash_pkt_wr(struct usb_ep_t *ep, int len, int code)
122 unsigned char *ptr = ep->ptr - len;
125 lpcisp_kvpb_copy(NULL, (void *)ep->user_data, ptr, len);
126 #endif /*CONFIG_KEYVAL*/
128 ep->user_data += len;
129 ep->ptr = ep0_buffer;
130 return USB_COMPLETE_OK;
133 static int usb_32bit_pkt_wr(struct usb_ep_t *ep, int len, int code)
135 uint32_t *srcptr = (uint32_t *)(ep->ptr - len);
136 volatile uint32_t *dstptr = (uint32_t *)ep->user_data;
139 for (pos = 0; len - pos >= 4; pos += 4, dstptr++, srcptr++)
142 ep->user_data += len;
143 ep->ptr = ep0_buffer;
144 return USB_COMPLETE_OK;
147 int usb_32bit_pkt_rd(struct usb_ep_t *ep, int len, int code)
149 volatile uint32_t *srcptr;
153 ep->ptr = ep0_buffer;
154 dstptr = (uint32_t *)ep->ptr;
155 srcptr = (uint32_t *)ep->user_data;
157 for (pos = 0; len - pos >= 4; pos += 4, dstptr++, srcptr++)
160 ep->user_data += len;
161 return USB_COMPLETE_OK;
164 static int usb_flash_erase(unsigned addr, unsigned len)
167 lpcisp_erase((void *)addr, len);
168 #endif /*CONFIG_KEYVAL*/
172 static void usb_goto(unsigned address)
175 lpc_watchdog_init(1, 10);
181 #endif /*CONFIG_KEYVAL*/
185 uint16_t vendor_call_ret = 0xFFFF;
187 uint16_t appl_usb_vendor_call(uint16_t command, uint16_t argument)
193 #ifdef APPL_WITH_FPGA
194 case USB_CMD_FPGA_CONFIGURE:
195 return fpga_configure();
197 case USB_CMD_FPGA_MEASURE_READ:
198 return fpga_measure_bus_read();
200 case USB_CMD_FPGA_MEASURE_WRITE:
201 return fpga_measure_bus_write();
203 case USB_CMD_FPGA_RESET:
204 hal_gpio_direction_output(XC_INIT_PIN, 0);
206 for (i = 0; i < 128; i++)
209 hal_gpio_direction_output(XC_INIT_PIN, 1);
210 #endif /*APPL_WITH_FPGA*/
217 int appl_usb_vendor(usb_device_t *udev)
221 USB_DEVICE_REQUEST *dreq;
224 dreq = &udev->request;
228 if (dreq->bRequest != (USB_VENDOR_GET_SET_MEMORY |
229 USB_DATA_DIR_FROM_HOST | USB_VENDOR_TARGET_FLASH))
230 lpcisp_kvpb_flush(NULL);
232 #endif /*CONFIG_KEYVAL*/
234 switch (dreq->bRequest & USB_VENDOR_MASK)
236 case USB_VENDOR_GET_CAPABILITIES:
237 ep0_buffer[0] = 0xAA; // test
238 usb_send_control_data(udev, ep0_buffer, 1);
241 case USB_VENDOR_RESET_DEVICE:
242 usb_send_control_data(udev, NULL, 0);
244 lpc_watchdog_init(1, 10);
250 #endif /*CONFIG_KEYVAL*/
253 case USB_VENDOR_GOTO:
254 usb_send_control_data(udev, NULL, 0);
255 usb_goto(dreq->wValue);
258 case USB_VENDOR_ERASE_MEMORY:
259 usb_send_control_data(udev, NULL, 0);
260 usb_flash_erase(dreq->wValue, dreq->wIndex);
263 case USB_VENDOR_ERASE_1KB_MEMORY: /* erase memory for 1 KB */
264 usb_send_control_data(udev, NULL, 0);
265 usb_flash_erase((uint32_t)dreq->wValue << 10, dreq->wIndex << 10);
268 case USB_VENDOR_CALL:
269 vendor_call_ret = SWAP(appl_usb_vendor_call(dreq->wIndex, dreq->wValue));
270 usb_send_control_data(udev, (unsigned char *) &vendor_call_ret, sizeof(uint16_t));
273 case USB_VENDOR_GET_SET_MEMORY:
274 addr = (dreq->wValue & 0xffff) | (((unsigned long)dreq->wIndex & 0xffff) << 16);
277 if ((dreq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST)
279 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
281 case USB_VENDOR_TARGET_RAM:
282 udev->ep0.ptr = (void *)addr;
285 case USB_VENDOR_TARGET_FLASH:
286 udev->ep0.next_pkt_fnc = usb_flash_pkt_wr;
287 udev->ep0.user_data = addr;
288 udev->ep0.ptr = ep0_buffer;
291 case USB_VENDOR_TARGET_32BIT:
292 udev->ep0.next_pkt_fnc = usb_32bit_pkt_wr;
293 udev->ep0.user_data = addr;
294 udev->ep0.ptr = ep0_buffer;
302 usb_set_control_endfnc(udev, usb_ack_setup);
304 usb_send_control_data(udev, NULL, 0);
310 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
312 case USB_VENDOR_TARGET_RAM:
313 usb_send_control_data(udev, (void *)addr, len);
316 case USB_VENDOR_TARGET_32BIT:
317 udev->ep0.next_pkt_fnc = usb_32bit_pkt_rd;
318 udev->ep0.user_data=addr;
319 usb_send_control_data( udev, ep0_buffer, len);
335 int usb_app_fill_serial_number(uint32_t ul_sn)
337 char *p = usb_devdes_serial_number;
338 int len_max = sizeof(usb_devdes_serial_number);
341 while ((len_max -= 2) >= 2)
344 c = ((ul_sn >> (32 - 4)) & 0xf) + '0';
356 int usb_app_init(void)
358 memset(&usb_device, 0, sizeof(usb_device));
360 eps[0].max_packet_size = USB_MAX_PACKET;
361 eps[1].max_packet_size = USB_MAX_PACKET;
364 eps[0].event_mask = 0x08;
365 eps[1].event_mask = 0x04;
366 eps[0].udev = &usb_device;
367 eps[1].udev = &usb_device;
370 usb_device.devdes_table = &usb_devdes_table;
371 usb_device.init = usb_lpc_init;
372 usb_debug_set_level(DEBUG_LEVEL_NONE);
373 usb_device.cntep = NUM_ENDPOINTS;
375 usb_device.vendor_fnc = appl_usb_vendor;
377 usb_init(&usb_device);
378 usb_connect(&usb_device);
385 if (usb_device.ep_events & MASK_EP1RX)
387 usb_device.ep_events &= ~MASK_EP1RX;
388 //TODO: Use some field in the structure, probably flags
392 /* Respond if there is something to send and RX is ready */
393 if (ep1_rx_ready && ep1_rx_index != 0)
395 usb_udev_write_endpoint(&eps[0], ep1_rx_buff, ep1_rx_index);
398 hal_gpio_set_value(LED2_PIN, 0);
405 int usb_app_poll(void)
407 int active = usb_active;
410 usb_check_events(&usb_device);
411 usb_control_response(&usb_device);
413 /* Check TX endpoint */
414 if (usb_device.ep_events & MASK_EP1TX)
416 ep1_tx_chars = usb_udev_read_endpoint(&eps[1], ep1_tx_buff, USB_MAX_PACKET);
418 usb_device.ep_events &= ~MASK_EP1TX;
419 hal_gpio_set_value(LED2_PIN, 0);
423 /* Check RX endpoint */
424 usb_active |= usb_check_ep1();
429 int usb_app_stop(void)
431 usb_disconnect(&usb_device);
435 #ifdef CONFIG_OC_CMDPROC
437 int cmd_io_getc_usbcon(struct cmd_io *cmd_io)
439 if (ep1_tx_index >= ep1_tx_chars)
442 return ep1_tx_buff[ep1_tx_index++];
445 int cmd_io_putc_usbcon(struct cmd_io *cmd_io, int ch)
447 if (ep1_rx_index >= USB_MAX_PACKET)
449 /* Check EP1 status and return -1 if unavailable */
450 usb_check_events(&usb_device);
453 /* Check again if it wasn't emptied */
454 if (ep1_rx_index >= USB_MAX_PACKET)
458 ep1_rx_buff[ep1_rx_index++] = (unsigned char)ch;
462 cmd_io_t cmd_io_usbcon_dev =
464 .putc = cmd_io_putc_usbcon,
465 .getc = cmd_io_getc_usbcon,
466 .write = cmd_io_write_bychar,
467 .read = cmd_io_read_bychar,