3 #include <system_def.h>
9 #include <usb/usb_loader.h>
10 #include <usb/usbdebug.h>
13 #include "appl_defs.h"
14 #include "usb/usb_defs.h"
19 #include <lpciap_kvpb.h>
20 #include <hal_machperiph.h>
21 #endif /*CONFIG_KEYVAL*/
23 usb_device_t usb_device;
24 usb_ep_t eps[NUM_ENDPOINTS];
26 #define MASK_EP1RX 0x01
27 #define MASK_EP1TX 0x02
29 unsigned char ep1_rx_buff[USB_MAX_PACKET];
30 unsigned char ep1_tx_buff[USB_MAX_PACKET];
31 unsigned char ep0_buffer[USB_MAX_PACKET0];
33 int ep1_rx_index = 0, ep1_rx_ready = 1;
34 int ep1_tx_index = 0, ep1_tx_chars = 0;
36 #ifdef CONFIG_OC_CMDPROC
38 cmd_io_t cmd_io_usbcon_dev;
40 #define ED_LINE_CHARS 512
42 char ed_line_chars_usbcon_in[ED_LINE_CHARS + 1];
43 char ed_line_chars_usbcon_out[ED_LINE_CHARS + 1];
45 ed_line_buf_t ed_line_buf_usbcon_in =
51 sizeof(ed_line_chars_usbcon_in),
55 ed_line_chars_usbcon_in
58 ed_line_buf_t ed_line_buf_usbcon_out =
64 sizeof(ed_line_chars_usbcon_out),
68 ed_line_chars_usbcon_out
71 cmd_io_t cmd_io_usbcon =
86 &ed_line_buf_usbcon_in,
88 &ed_line_buf_usbcon_out,
97 static int usb_flash_pkt_wr(struct usb_ep_t *ep, int len, int code)
99 unsigned char *ptr = ep->ptr - len;
102 lpcisp_kvpb_copy(NULL, (void *)ep->user_data, ptr, len);
103 #endif /*CONFIG_KEYVAL*/
105 ep->user_data += len;
106 ep->ptr = ep0_buffer;
107 return USB_COMPLETE_OK;
110 static int usb_flash_erase(unsigned addr, unsigned len)
113 lpcisp_erase((void *)addr, len);
114 #endif /*CONFIG_KEYVAL*/
118 static void usb_goto(unsigned address)
121 lpc_watchdog_init(1, 10);
127 #endif /*CONFIG_KEYVAL*/
130 int appl_usb_vendor(usb_device_t *udev)
134 USB_DEVICE_REQUEST *dreq;
137 dreq = &udev->request;
141 if (dreq->bRequest != (USB_VENDOR_GET_SET_MEMORY |
142 USB_DATA_DIR_FROM_HOST | USB_VENDOR_TARGET_FLASH))
143 lpcisp_kvpb_flush(NULL);
145 #endif /*CONFIG_KEYVAL*/
147 switch (dreq->bRequest & USB_VENDOR_MASK)
150 case USB_VENDOR_GET_CAPABILITIES:
151 ep0_buffer[0] = 0xAA; // test
152 usb_send_control_data(udev, ep0_buffer, 1);
155 case USB_VENDOR_RESET_DEVICE:
156 usb_send_control_data(udev, NULL, 0);
158 lpc_watchdog_init(1, 10);
164 #endif /*CONFIG_KEYVAL*/
167 case USB_VENDOR_GOTO:
168 usb_send_control_data(udev, NULL, 0);
169 usb_goto(dreq->wValue);
172 case USB_VENDOR_ERASE_MEMORY:
173 usb_send_control_data(udev, NULL, 0);
174 usb_flash_erase(dreq->wValue, dreq->wIndex);
177 case USB_VENDOR_ERASE_1KB_MEMORY: /* erase memory for 1 KB */
178 usb_send_control_data(udev, NULL, 0);
179 usb_flash_erase((uint32_t)dreq->wValue << 10, dreq->wIndex << 10);
182 case USB_VENDOR_GET_SET_MEMORY:
183 addr = (dreq->wValue & 0xffff) | (((unsigned long)dreq->wIndex & 0xffff) << 16);
186 if ((dreq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST)
188 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
190 case USB_VENDOR_TARGET_RAM:
191 udev->ep0.ptr = (void *)addr;
194 case USB_VENDOR_TARGET_FLASH:
195 udev->ep0.next_pkt_fnc = usb_flash_pkt_wr;
196 udev->ep0.user_data = addr;
197 udev->ep0.ptr = ep0_buffer;
205 usb_set_control_endfnc(udev, usb_ack_setup);
207 usb_send_control_data(udev, NULL, 0);
213 switch (dreq->bRequest & USB_VENDOR_TARGET_MASK)
215 case USB_VENDOR_TARGET_RAM:
216 usb_send_control_data(udev, (void *)addr, len);
232 int usb_app_fill_serial_number(uint32_t ul_sn)
234 char *p = usb_devdes_serial_number;
235 int len_max = sizeof(usb_devdes_serial_number);
238 while ((len_max -= 2) >= 2)
241 c = ((ul_sn >> (32 - 4)) & 0xf) + '0';
253 int usb_app_init(void)
255 memset(&usb_device, 0, sizeof(usb_device));
257 eps[0].max_packet_size = USB_MAX_PACKET;
258 eps[1].max_packet_size = USB_MAX_PACKET;
261 eps[0].event_mask = 0x08;
262 eps[1].event_mask = 0x04;
263 eps[0].udev = &usb_device;
264 eps[1].udev = &usb_device;
267 usb_device.devdes_table = &usb_devdes_table;
268 usb_device.init = usb_lpc_init;
269 usb_debug_set_level(DEBUG_LEVEL_NONE);
270 usb_device.cntep = NUM_ENDPOINTS;
272 usb_device.vendor_fnc = appl_usb_vendor;
274 usb_init(&usb_device);
275 usb_connect(&usb_device);
280 int usb_app_poll(void)
282 int active = usb_active;
285 usb_check_events(&usb_device);
286 usb_control_response(&usb_device);
288 /* Check if host sent us something */
289 if (usb_device.ep_events & MASK_EP1TX)
291 ep1_tx_chars = usb_udev_read_endpoint(&eps[1], ep1_tx_buff, USB_MAX_PACKET);
293 usb_device.ep_events &= ~MASK_EP1TX;
294 CLR_OUT_PIN(LED_PORT, LED2_BIT);
298 if (usb_device.ep_events & MASK_EP1RX)
300 usb_device.ep_events &= ~MASK_EP1RX;
304 /* Respond if there is something to send and RX is ready */
305 if (ep1_rx_ready && ep1_rx_index != 0)
307 usb_udev_write_endpoint(&eps[0], ep1_rx_buff, ep1_rx_index);
310 CLR_OUT_PIN(LED_PORT, LED2_BIT);
317 int usb_app_stop(void)
319 usb_disconnect(&usb_device);
323 #ifdef CONFIG_OC_CMDPROC
325 int cmd_io_getc_usbcon(struct cmd_io *cmd_io)
327 if (ep1_tx_index >= ep1_tx_chars)
330 return ep1_tx_buff[ep1_tx_index++];
333 int cmd_io_putc_usbcon(struct cmd_io *cmd_io, int ch)
335 if (ep1_rx_index >= USB_MAX_PACKET)
337 /* Poll USB and return -1
338 * FIXME: Ugly and hackish. Should be in ISR of course.
344 ep1_rx_buff[ep1_rx_index++] = (unsigned char)ch;
348 cmd_io_t cmd_io_usbcon_dev =
350 .putc = cmd_io_putc_usbcon,
351 .getc = cmd_io_getc_usbcon,
352 .write = cmd_io_write_bychar,
353 .read = cmd_io_read_bychar,