fix bmTransferAttributes in REQUEST_DEV_DEP_MSG_IN
[rigol] / usbtmc.c
index 419d100069b25111e57c7ab9b94abea9d81fe11f..2ccbf897ca4617a51e514a65c03f4d6804c8ed73 100644 (file)
--- a/usbtmc.c
+++ b/usbtmc.c
@@ -17,6 +17,7 @@
 #error BYTE_ORDER not defined/known!
 #endif
 
+/* TODO: fix memory leak here: */
 #define USB_ERROR(s, x) do { if (x < 0) { fprintf(stderr, "usb %s: %s\n", s, usb_strerror()); usb_reset(sc->usb.dev); return 0; } } while(0)
 
 /* This routine locates a scope by VID/PID and returns a struct scope* for it */
@@ -47,8 +48,8 @@ static struct scope* usbtmc_find_scope() {
 
                                /* TODO: FIXME */
                                sc->usb.brokenRigol = 1;
-                               sc->usb.ep_bulk_out = 1;
-                               sc->usb.ep_bulk_in = 2;
+                               sc->usb.ep_bulk_out = 0x01;
+                               sc->usb.ep_bulk_in = 0x82;
                                sc->usb.wMaxPacketSize_in = 0x40;
                                
                                return sc;
@@ -59,14 +60,18 @@ static struct scope* usbtmc_find_scope() {
        return NULL;
 }
 
-unsigned char usbtmc_status(struct scope *sc)
+static unsigned char usbtmc_status(struct scope *sc)
 {
        int r;
        unsigned char status[3];
 
        sc->usb.bTag++;
 
-       r = usb_control_msg(sc->usb.dev, 0xA1, 128, (sc->usb.bTag & 0x7f), 0, (char*)status, 3, USB_TIMEOUT);
+       r = usb_control_msg(sc->usb.dev, 0xA1,
+               USB488_CTL_READ_STATUS_BYTE,
+               (sc->usb.bTag & 0x7f), 0, (char*)status, 3,
+               USB_TIMEOUT);
+
        if ((r != 3) || (status[0] != 0x01) || (status[1] != (sc->usb.bTag & 0x7f))) {
                printf("READ_STATUS_BYTE failed: %d 0x%x 0x%x 0x%x\n", r, status[0], status[1], status[2]);
                return 0xff;
@@ -75,6 +80,59 @@ unsigned char usbtmc_status(struct scope *sc)
        return status[2];
 }
 
+static struct usbtmc_capabilities* usbtmc_get_capabilities(struct scope *sc)
+{
+       int r;
+       static struct usbtmc_capabilities res;
+
+       r = usb_control_msg(sc->usb.dev, 0xA1, 
+               USBTMC_CTL_GET_CAPABILITIES,
+               0, 0, (char*)&res, sizeof(struct usbtmc_capabilities),
+               USB_TIMEOUT);
+       if (r != sizeof(struct usbtmc_capabilities)) {
+               printf("GET_CAPABILITIES failed: %s\n", usb_strerror());
+               return NULL;
+       }
+
+       printf("USBTMC Version %x.%x Capabilities:\n", res.bcdUSBTMC[0], res.bcdUSBTMC[1]);
+       if (res.USBTMCIFcapabilities & USBTMC_CAP_IF_INDICATOR_PULSE)
+               printf("\tInterface supports indicator pulse\n");
+
+       if (res.USBTMCIFcapabilities & USBTMC_CAP_IF_TALKONLY)
+               printf("\tInterface is talk only\n");
+
+       if (res.USBTMCIFcapabilities & USBTMC_CAP_IF_LISTENONLY)
+               printf("\tInterface is listen only\n");
+
+       if (res.USBTMCDEVcapabilities & USBTMC_CAP_DEV_TERMCHAR_SUPP)
+               printf("\tDevice supports Termchar\n");
+
+       printf("USB488 Version %x.%x Capabilities:\n", res.bcdUSB488[0], res.bcdUSB488[1]);
+
+       if (res.USB488IFcapabilities & USB488_CAP_IF_4882)
+               printf("\tInterface is 488.2 compliant\n");
+
+       if (res.USB488IFcapabilities & USB488_CAP_IF_LOCKOUT)
+               printf("\tInterface supports local lockout\n");
+
+       if (res.USB488IFcapabilities & USB488_CAP_IF_TRIGGER)
+               printf("\tInterface supports TRIGGER\n");
+
+       if (res.USB488DEVcapabilities & USB488_CAP_DEV_SCPI)
+               printf("\tDevice is SCPI compliant\n");
+
+       if (res.USB488DEVcapabilities & USB488_CAP_DEV_SR1)
+               printf("\tDevice is SR1 capable\n");
+
+       if (res.USB488DEVcapabilities & USB488_CAP_DEV_RL1)
+               printf("\tDevice is RL1 capable\n");
+
+       if (res.USB488DEVcapabilities & USB488_CAP_DEV_DT1)
+               printf("\tDevice is DT1 capable\n");
+
+       return &res;
+}
+
 /*
  * Send a scpi-command to the scope. The response goes into the buffer
  * called resp, with a size of resplen. If resp==NULL, no response
@@ -140,7 +198,7 @@ int usbtmc_sendscpi(struct scope *sc, char* cmd,
                req->bTag = sc->usb.bTag;
                req->bTagInverse = ~sc->usb.bTag;
                req->TransferSize = LE32(sc->usb.wMaxPacketSize_in);
-               req->bmTransferAttributes = USBTMC_TRANSFERATTRIB_EOM;
+               req->bmTransferAttributes = 0;
                req->TermChar = 0;
 
                /* send read command */
@@ -212,10 +270,10 @@ void usbtmc_release(struct scope *sc)
        usb_release_interface(sc->usb.dev, 0);
 }
 
-//Initialize the scope.
+/* Initialize the scope. */
 struct scope* usbtmc_initscope(void) {
        int r;
-       unsigned char buff[10];
+       uint32_t vidpid;
        struct scope *sc;
 
        /* Init libusb */
@@ -227,9 +285,11 @@ struct scope* usbtmc_initscope(void) {
        }
 
        usbtmc_claim(sc);
+       sc->usb.cap = usbtmc_get_capabilities(sc);
+       printf("Device status: 0x%x\n", usbtmc_status(sc));
        /* The following code isn't really necessary, the program works
           OK without it too. */
-       r=usb_control_msg(sc->usb.dev, 0xC8, 9, 0, 0, (char*)buff, 4, USB_TIMEOUT);
+       r=usb_control_msg(sc->usb.dev, 0xC8, 9, 0, 0, (char*)&vidpid, 4, USB_TIMEOUT);
        usbtmc_release(sc);
        if (r < 0) {
                fprintf (stderr, "Error %d sending init message: %s\n", 
@@ -237,8 +297,8 @@ struct scope* usbtmc_initscope(void) {
                fprintf (stderr, "Do you have permission on the USB device?\n");
                exit (1);
        }
-       if (LE32((*(uint32_t*)buff))!=0x40005dc) {
-               fprintf(stderr,"Init: buff[%i]=%x\n",r,LE32((*(uint32_t*)buff)));
+       if (LE32(vidpid)!=0x40005dc) {
+               fprintf(stderr,"Init: buff[%i]=%x\n",r,LE32(vidpid));
        }
        return sc;
 }
Impressum, Datenschutz