]> sigrok.org Git - sigrok-firmware-fx2lafw.git/blobdiff - fx2lafw.c
Implemented sample rate control
[sigrok-firmware-fx2lafw.git] / fx2lafw.c
index ab6d55fa2b76071c567c271d76c698697eb8e797..574e09109b1e7bcc86ce16e6fa1b3619e63e5fb5 100644 (file)
--- a/fx2lafw.c
+++ b/fx2lafw.c
 #include <eputils.h>
 #include <gpif.h>
 
+#include <command.h>
 #include <fx2lafw.h>
 #include <gpif-acquisition.h>
 
-/* Protocol commands */
-#define CMD_SET_SAMPLERATE     0xb0
-#define CMD_START              0xb1
-#define CMD_STOP               0xb2
-#define CMD_GET_FW_VERSION     0xb3
-
 /* ... */
 volatile bit got_sud;
+BYTE vendor_command;
 
 static void setup_endpoints(void)
 {
@@ -117,22 +113,13 @@ static void setup_endpoints(void)
 BOOL handle_vendorcommand(BYTE cmd)
 {
        /* Protocol implementation */
-
        switch (cmd) {
-       case CMD_SET_SAMPLERATE:
-               /* TODO */
-               break;
        case CMD_START:
-               gpif_acquisition_start();
-               return TRUE;
-       case CMD_STOP:
-               GPIFABORT = 0xff;
-               /* TODO */
-               return TRUE;
-               break;
+               /* There is data to receive - arm EP0 */
+               EP0BCL = 0;
        case CMD_GET_FW_VERSION:
-               /* TODO */
-               break;
+               vendor_command = cmd;
+               return TRUE;
        default:
                /* Unimplemented command. */
                break;
@@ -222,6 +209,7 @@ void fx2lafw_init(void)
        REVCTL = bmNOAUTOARM | bmSKIPCOMMIT;
 
        got_sud = FALSE;
+       vendor_command = 0;
 
        /* Renumerate. */
        RENUMERATE_UNCOND();
@@ -252,4 +240,33 @@ void fx2lafw_run(void)
                handle_setupdata();
                got_sud = FALSE;
        }
+
+       if (vendor_command) {
+               switch (vendor_command) {
+               case CMD_GET_FW_VERSION:
+                       /* TODO */
+
+                       /* Acknowledge the vendor command. */
+                       vendor_command = 0;
+                       break;
+
+               case CMD_START:
+                       if((EP0CS & bmEPBUSY) != 0)
+                               break;
+
+                       if(EP0BCL == 2) {
+                               gpif_acquisition_start(
+                                       (const struct cmd_start_acquisition*)EP0BUF);
+                       }
+
+                       /* Acknowledge the vendor command. */
+                       vendor_command = 0;
+                       break;
+
+               default:
+                       /* Unimplemented command. */
+                       vendor_command = 0;
+                       break;
+               }
+       }
 }