-#include <types.h>
+#include <inttypes.h>
#include <cpu_def.h>
#include <system_def.h>
#include <string.h>
#include <stdio.h>
+#include <stdint.h>
#include <endian.h>
#include <usb/lpc.h>
#include <usb/usb.h>
#include <hal_machperiph.h>
#endif /*CONFIG_KEYVAL*/
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+#include <mtd_spi_drv.h>
+#endif
+
#include <endian.h>
#if __BYTE_ORDER == __BIG_ENDIAN
#include <byteswap.h>
#endif
#define USB_VENDOR_TARGET_TUMBL 0x03
+#define USB_VENDOR_TARGET_32BIT 0x04
+#define USB_VENDOR_TARGET_SPI_FLASH 0x05
#define USB_CMD_FPGA_CONFIGURE 0xF000
#define USB_CMD_FPGA_MEASURE_READ 0xF001
#define MASK_EP1RX 0x01
#define MASK_EP1TX 0x02
-unsigned char ep1_rx_buff[USB_MAX_PACKET];
-unsigned char ep1_tx_buff[USB_MAX_PACKET];
-unsigned char ep0_buffer[USB_MAX_PACKET0];
+unsigned char ep1_rx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
+unsigned char ep1_tx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
+unsigned char ep0_buffer[USB_MAX_PACKET0] __attribute__ ((aligned (8)));
int usb_active = 0;
int ep1_rx_index = 0, ep1_rx_ready = 1;
int ep1_tx_index = 0, ep1_tx_chars = 0;
return USB_COMPLETE_OK;
}
+static int usb_32bit_pkt_wr(struct usb_ep_t *ep, int len, int code)
+{
+ uint32_t *srcptr = (uint32_t *)(ep->ptr - len);
+ volatile uint32_t *dstptr = (uint32_t *)ep->user_data;
+ int pos;
+
+ for (pos = 0; len - pos >= 4; pos += 4, dstptr++, srcptr++)
+ *dstptr = *srcptr;
+
+ ep->user_data += len;
+ ep->ptr = ep0_buffer;
+ return USB_COMPLETE_OK;
+}
+
+int usb_32bit_pkt_rd(struct usb_ep_t *ep, int len, int code)
+{
+ volatile uint32_t *srcptr;
+ uint32_t *dstptr;
+ int pos;
+
+ ep->ptr = ep0_buffer;
+ dstptr = (uint32_t *)ep->ptr;
+ srcptr = (uint32_t *)ep->user_data;
+
+ for (pos = 0; len - pos >= 4; pos += 4, dstptr++, srcptr++)
+ *dstptr = *srcptr;
+
+ ep->user_data += len;
+ return USB_COMPLETE_OK;
+}
+
static int usb_flash_erase(unsigned addr, unsigned len)
{
#ifdef CONFIG_KEYVAL
return 0;
}
+static int usb_spi_flash_pkt_wr(struct usb_ep_t *ep, int len, int code)
+{
+ unsigned char *ptr = ep->ptr - len;
+
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+ mtd_spi_write(&mtd_spi_state, ptr, len, ep->user_data, 0);
+#endif /*CONFIG_KEYVAL*/
+
+ ep->user_data += len;
+ ep->ptr = ep0_buffer;
+ return USB_COMPLETE_OK;
+}
+
+int usb_spi_flash_pkt_rd(struct usb_ep_t *ep, int len, int code)
+{
+ ep->ptr = ep0_buffer;
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+ mtd_spi_read(&mtd_spi_state, ep->ptr, len, ep->user_data, 0);
+#endif /*CONFIG_KEYVAL*/
+
+ ep->user_data += len;
+ return USB_COMPLETE_OK;
+}
+
+int usb_spi_flash_mass_erase(int mode)
+{
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+ mtd_spi_set_protect_mode(&mtd_spi_state, 0, 0);
+ mtd_spi_chip_erase(&mtd_spi_state, mode, 0);
+#endif /*CONFIG_KEYVAL*/
+ return 0;
+}
+
static void usb_goto(unsigned address)
{
#ifdef CONFIG_KEYVAL
case USB_CMD_FPGA_IRC_DUMP:
for (i = 0; i < 8; i++)
- printf("IRC%d: count = %d, count index = %d, state = 0x%02x\n", i+1, (unsigned int) fpga_irc[i]->count, (unsigned int) fpga_irc[i]->count_index, (unsigned int)(*(fpga_irc_state[i])));
+ printf("IRC%d: count = %d, count index = %d, mark = %d, ab_error = %d, index_event = %d, index = %d\n", i+1,
+ (unsigned int) fpga_irc[i]->count, (unsigned int) fpga_irc[i]->count_index, ((*(fpga_irc_state[i])) & 0x01) != 0,
+ ((*(fpga_irc_state[i])) & 0x02) != 0, ((*(fpga_irc_state[i])) & 0x04) != 0, ((*(fpga_irc_state[i])) & 0x08) != 0);
return 0;
case USB_CMD_FPGA_LXMASTER_GET_RESET:
- printf("LXMASTER RESET: 0x%02x\n", *fpga_lx_master_reset);
+ printf("LXMASTER RESET: 0x%02"PRIx32"\n", *fpga_lx_master_reset);
return 0;
case USB_CMD_FPGA_LXMASTER_SET_RESET:
return 0;
case USB_CMD_FPGA_LXMASTER_TRANSMITTER_GET_REG:
- printf("LXMASTER TRANSMITTER REG: 0x%02x\n", *fpga_lx_master_transmitter_reg);
+ printf("LXMASTER TRANSMITTER REG: 0x%02"PRIx32"\n", *fpga_lx_master_transmitter_reg);
return 0;
case USB_CMD_FPGA_LXMASTER_TRANSMITTER_SET_REG:
return 0;
case USB_CMD_FPGA_LXMASTER_TRANSMITTER_DUMP:
- printf("LX MASTER MEM:\n");
+ printf("LX MASTER TRANSMITTER MEM:\n");
for (i = 0; i < 16; i++)
{
for (j = 0; j < 16; j++)
usb_flash_erase((uint32_t)dreq->wValue << 10, dreq->wIndex << 10);
return 1;
+ case USB_VENDOR_MASS_ERASE:
+ usb_send_control_data(udev, NULL, 0);
+ if (dreq->wIndex == 5)
+ usb_spi_flash_mass_erase(dreq->wValue);
+ return 1;
+
case USB_VENDOR_CALL:
vendor_call_ret = SWAP(appl_usb_vendor_call(dreq->wIndex, dreq->wValue));
usb_send_control_data(udev, (unsigned char *) &vendor_call_ret, sizeof(uint16_t));
udev->ep0.ptr = ep0_buffer;
break;
+ case USB_VENDOR_TARGET_32BIT:
+ udev->ep0.next_pkt_fnc = usb_32bit_pkt_wr;
+ udev->ep0.user_data = addr;
+ udev->ep0.ptr = ep0_buffer;
+ break;
+
+ case USB_VENDOR_TARGET_SPI_FLASH:
+ udev->ep0.next_pkt_fnc = usb_spi_flash_pkt_wr;
+ udev->ep0.user_data = addr;
+ udev->ep0.ptr = ep0_buffer;
+ break;
+
default:
return -1;
}
usb_send_control_data(udev, (void *)addr, len);
break;
+ case USB_VENDOR_TARGET_32BIT:
+ udev->ep0.next_pkt_fnc = usb_32bit_pkt_rd;
+ udev->ep0.user_data=addr;
+ usb_send_control_data( udev, ep0_buffer, len);
+ break;
+
+ case USB_VENDOR_TARGET_SPI_FLASH:
+ udev->ep0.next_pkt_fnc = usb_spi_flash_pkt_rd;
+ udev->ep0.user_data=addr;
+ usb_send_control_data( udev, ep0_buffer, len);
+ break;
+
default:
return -1;
}
{
ep1_tx_chars = usb_udev_read_endpoint(&eps[1], ep1_tx_buff, USB_MAX_PACKET);
ep1_tx_index = 0;
- printf("USBCON - recv'd %d chars\n", ep1_tx_chars);
usb_device.ep_events &= ~MASK_EP1TX;
hal_gpio_set_value(LED2_PIN, 0);
usb_active = 1;
if (ep1_tx_index >= ep1_tx_chars)
return -1;
- printf("USBCON - getc: %c\n", ep1_tx_buff[ep1_tx_index]);
return ep1_tx_buff[ep1_tx_index++];
}