]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/commitdiff
RoCoN: initial unfinished support for SPI connected Flash.
authorPavel Pisa <ppisa@pikron.com>
Tue, 21 Apr 2015 23:09:40 +0000 (01:09 +0200)
committerPavel Pisa <ppisa@pikron.com>
Tue, 21 Apr 2015 23:09:40 +0000 (01:09 +0200)
Signed-off-by: Pavel Pisa <ppisa@pikron.com>
sw/app/rocon/Makefile.omk
sw/app/rocon/appl_defs.h
sw/app/rocon/appl_main.c
sw/app/rocon/appl_tests.c
sw/app/rocon/appl_usb.c
sw/config.omk
sw/libs4c/Makefile.omk
sw/libs4c/mtd [new symlink]

index c1a7af92229628a55afe31f8f06d3433849529ea..201eaab25d64e24510221933df674f0972cf1bf3 100644 (file)
@@ -9,6 +9,7 @@ default_CONFIG += CONFIG_OC_UL_DRV_SYSLESS=x
 default_CONFIG += CONFIG_OC_I2C_DRV_SYSLESS=x CONFIG_OC_SPI_DRV_SYSLESS=x
 default_CONFIG += CONFIG_APP_ROCON_WITH_USB=x CONFIG_KEYVAL=x CONFIG_LIB_U2U_V2=x
 default_CONFIG += CONFIG_OC_CMDPROC=x CONFIG_PXMC=x CONFIG_PXMC_COORDMV=x
+default_CONFIG += CONFIG_OC_MTD_DRV_SYSLESS=x
 
 ifeq ($(CONFIG_APP_ROCON),y)
 
@@ -113,6 +114,9 @@ endif
 ifeq ($(CONFIG_OC_I2C_DRV_SYSLESS),y)
 lib_LOADLIBES += i2c_drv
 endif
+ifeq ($(CONFIG_OC_MTD_DRV_SYSLESS),y)
+lib_LOADLIBES += mtd_drv
+endif
 ifeq ($(CONFIG_OC_SPI_DRV_SYSLESS),y)
 lib_LOADLIBES += spi_drv
 endif
index 9ca032fa0cd75b2a309cf8a069eca506fcd9f481..9de199116fc38024eff81ae2752d767dbbdcf2f4 100644 (file)
@@ -90,6 +90,10 @@ int setup_distore_store(void);
 */
 #endif /*CONFIG_KEYVAL*/
 
+struct mtd_spi_state_t;
+
+extern struct mtd_spi_state_t mtd_spi_state;
+
 LT_TIMER_DEC(lt_10msec)
 
 #ifdef APPL_WITH_ULAN
index b5775ece756c3839abd8bbf2f1ef8d539981c62e..c7a146a23430d6c65b396d544b637df50bb448f8 100644 (file)
@@ -6,6 +6,10 @@
 #include "appl_version.h"
 #include "appl_fpga.h"
 
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+#include <mtd_spi_drv.h>
+#endif
+
 #ifndef APPL_WITH_SIM_POSIX
 #include <hal_machperiph.h>
 #endif /*APPL_WITH_SIM_POSIX*/
@@ -63,6 +67,13 @@ ul_fd_t ul_fd4timeprog;
 #endif
 #endif /*APPL_WITH_ULAN*/
 
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+struct mtd_spi_state_t mtd_spi_state = {
+  .spi_addr = 0x08,
+  .page_size = 256,
+};
+#endif
+
 uint32_t usn; /* uLAN/USB device serial number */
 
 int usb_enable_flag = 1;
@@ -411,6 +422,12 @@ int main()
   appl_distore_init();
 #endif /* APPL_WITH_DISTORE_EEPROM_USER */
 
+  /***********************************/
+  // SPI connected FLASH
+#ifdef CONFIG_OC_MTD_DRV_SYSLESS
+  mtd_spi_state.spi_drv = spi_find_drv(NULL, 0);
+#endif
+
   /***********************************/
   // Micro Windows GUI
 
index 81e366e3039f01553eaee632ef16d6d1601db6f1..30279f6dcdcedf6320b350602919b48fc14835e2 100644 (file)
@@ -171,6 +171,12 @@ int cmd_do_spimst_blocking(cmd_io_t *cmd_io, const struct cmd_des *des, char *pa
   return 0;
 }
 
+int cmd_do_mtdspitest(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
+{
+  mtd_spi_test();
+  return 0;
+}
+
 #ifdef SDRAM_BASE
 int sdram_access_test(void)
 {
@@ -674,6 +680,11 @@ cmd_des_t const cmd_des_spimstx = {0, CDESM_OPCHR | CDESM_WR,
                                    cmd_do_spimst_blocking, {(void *) - 1}
                                   };
 
+cmd_des_t const cmd_des_mtdspitest = {0, 0,
+                                   "mtdspitest", "test SPI connected Flash",
+                                   cmd_do_mtdspitest, {(void *) - 1}
+                                  };
+
 #ifdef SDRAM_BASE
 cmd_des_t const cmd_des_testsdram = {0, 0,
                                      "testsdram", "test SDRAM",
@@ -738,6 +749,7 @@ cmd_des_t const *const cmd_appl_tests[] =
   &cmd_des_test_loglevel,
   &cmd_des_spimst,
   &cmd_des_spimstx,
+  &cmd_des_mtdspitest,
 #ifdef SDRAM_BASE
   &cmd_des_testsdram,
 #endif /*SDRAM_BASE*/
index f3aff84796d2b70343be0be48f0bb18545504934..38dcd1389767768264de56523af4d499d4824460 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,30 @@ 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;
+}
+
 static void usb_goto(unsigned address)
 {
 #ifdef CONFIG_KEYVAL
@@ -244,7 +273,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 +282,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:
@@ -414,6 +443,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 +474,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;
         }
index 0da0eb0a9d8e4259803107fc8f12cf46e40bfffe..75313bf0493d5e51bbd497d7a7b41a51adf7fc79 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_OC_I2C_CHIP_C552=y
 CONFIG_OC_SPI_DRV_SYSLESS=y
 CONFIG_OC_SPI_CHIP_LPCSSP=y
 
+CONFIG_OC_MTD_DRV_SYSLESS=y
+
 CONFIG_USB_BASE=y
 CONFIG_USB_LPCUSB=y
 CONFIG_USB_MORE=y
index b5fd9963af5880f1fc7e522d141ec2168fe42f47..1431dd419dced93d1e02fecbbc0300b876398388 100644 (file)
@@ -1,3 +1,3 @@
 # -*- makefile -*-
 
-SUBDIRS = cmdproc kbd keyval i2c misc spi usb ulut
+SUBDIRS = cmdproc kbd keyval i2c misc spi usb ulut mtd
diff --git a/sw/libs4c/mtd b/sw/libs4c/mtd
new file mode 120000 (symlink)
index 0000000..40e79b2
--- /dev/null
@@ -0,0 +1 @@
+../../submodule/sysless/libs4c/mtd
\ No newline at end of file