]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blobdiff - sw/app/rocon/appl_usb.c
RoCoN: MTD SPI Flash support tested and finished.
[fpga/lx-cpu1/lx-rocon.git] / sw / app / rocon / appl_usb.c
index f3aff84796d2b70343be0be48f0bb18545504934..1bdc8b009ac7a0977daaec2c238d3b29b31a1aaf 100644 (file)
@@ -1,4 +1,4 @@
-#include <types.h>
+#include <inttypes.h>
 #include <cpu_def.h>
 #include <system_def.h>
 #include <string.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>
@@ -33,6 +37,7 @@
 
 #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
@@ -197,6 +202,39 @@ static int usb_flash_erase(unsigned addr, unsigned len)
   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
@@ -244,7 +282,7 @@ uint16_t appl_usb_vendor_call(uint16_t command, uint16_t argument)
       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:
@@ -253,7 +291,7 @@ uint16_t appl_usb_vendor_call(uint16_t command, uint16_t argument)
       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:
@@ -379,6 +417,12 @@ int appl_usb_vendor(usb_device_t *udev)
       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));
@@ -414,6 +458,12 @@ int appl_usb_vendor(usb_device_t *udev)
             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;
         }
@@ -439,6 +489,12 @@ int appl_usb_vendor(usb_device_t *udev)
             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;
         }