aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/fx3
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/fx3')
-rw-r--r--firmware/fx3/README.md10
-rw-r--r--firmware/fx3/b200/b200_main.c35
-rw-r--r--firmware/fx3/b200/b200_main.h4
-rw-r--r--firmware/fx3/b200/b200_usb_descriptors.c84
4 files changed, 125 insertions, 8 deletions
diff --git a/firmware/fx3/README.md b/firmware/fx3/README.md
index 84a895059..29d72a9ad 100644
--- a/firmware/fx3/README.md
+++ b/firmware/fx3/README.md
@@ -19,16 +19,16 @@ distributed by the FX3 manufacturer, Cypress Semiconductor. You can download the
[FX3 SDK from here](http://www.cypress.com/?rID=57990).
*Note*: You *must* use SDK version 1.2.3!
-Once you have downloaded it, extract the ARM cross-compiler sub-directory from
-the zip file and put it somewhere useful. The highest level directory you need
-is `arm-2011.03/`.
+Once you have downloaded it, extract the ARM cross-compiler from the tarball
+`ARM_GCC.tar.gz` and put it somewhere useful. The highest level directory you
+need is `arm-2013.03/`.
Now that you have extracted the cross compilation toolchain, you need to set up
some environment variables to tell the B2xx `makefile` where to look for the
tools. These variables are:
```
- $ export ARMGCC_INSTALL_PATH=<your path>/arm-2011.03
+ $ export ARMGCC_INSTALL_PATH=<your path>/arm-2013.03
$ export ARMGCC_VERSION=4.5.2
```
@@ -61,7 +61,7 @@ into the `common/` directory you just copied from the Cypress SDK, and apply the
patch `b200/fx3_mem_map.patch`.
```
- # cd uhd.git/firmware/common/
+ # cd uhd.git/firmware/fx3/common/
$ patch -p2 < ../b200/fx3_mem_map.patch
```
diff --git a/firmware/fx3/b200/b200_main.c b/firmware/fx3/b200/b200_main.c
index 077ee251b..cb0172af3 100644
--- a/firmware/fx3/b200/b200_main.c
+++ b/firmware/fx3/b200/b200_main.c
@@ -2034,6 +2034,7 @@ void b200_usb_init(void) {
/* Check to see if a VID/PID is in the EEPROM that we should use. */
uint8_t valid[4];
+ uint8_t vidpid[4];
CyU3PMemSet(valid, 0, 4);
CyFxUsbI2cTransfer(0x0, 0xA0, 4, valid, CyTrue);
if(*((uint32_t *) &(valid[0])) == 0xB2145943) {
@@ -2041,7 +2042,6 @@ void b200_usb_init(void) {
/* Pull the programmed device serial out of the i2c EEPROM, and copy the
* characters into the device serial string, which is then advertised as
* part of the USB descriptors. */
- uint8_t vidpid[4];
CyU3PMemSet(vidpid, 0, 4);
CyFxUsbI2cTransfer(0x4, 0xA0, 4, vidpid, CyTrue);
b200_usb2_dev_desc[8] = vidpid[2];
@@ -2055,6 +2055,35 @@ void b200_usb_init(void) {
b200_usb3_dev_desc[11] = vidpid[1];
}
+ /* We support two VIDs:
+ * Ettus Research: 0x2500
+ * National Instruments: 0x3923
+ *
+ * We support three PIDs:
+ * Ettus B200/B210: 0x0020
+ * NI USRP-2900: 0x7813
+ * NI USRP-2901: 0x7814
+ */
+ uint8_t *mfr_string = NULL;
+ uint8_t *product_string = NULL;
+ if((vidpid[3] == 0x25) && (vidpid[2] == 0x00)) {
+ mfr_string = b200_usb_manufacture_desc;
+ product_string = b200_usb_product_desc;
+ } else if((vidpid[3] == 0x39) && (vidpid[2] == 0x23)) {
+ mfr_string = niusrp_usb_manufacture_desc;
+
+ if((vidpid[1] == 0x78) && (vidpid[0] == 0x13)) {
+ product_string = niusrp_2900_usb_product_desc;
+ } else if((vidpid[1] == 0x78) && (vidpid[0] == 0x14)) {
+ product_string = niusrp_2901_usb_product_desc;
+ } else {
+ product_string = unknown_desc;
+ }
+ } else {
+ mfr_string = unknown_desc;
+ product_string = unknown_desc;
+ }
+
uint8_t ascii_serial[9];
CyU3PMemSet(ascii_serial, 0, 9);
CyFxUsbI2cTransfer(0x4f7, 0xA0, 9, ascii_serial, CyTrue);
@@ -2101,10 +2130,10 @@ void b200_usb_init(void) {
(uint8_t *) b200_string_lang_id_desc);
CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 1,
- (uint8_t *) b200_usb_manufacture_desc);
+ (uint8_t *) mfr_string);
CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 2,
- (uint8_t *) b200_usb_product_desc);
+ (uint8_t *) product_string);
CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 3,
(uint8_t *) dev_serial);
diff --git a/firmware/fx3/b200/b200_main.h b/firmware/fx3/b200/b200_main.h
index 2c6f178ec..61048abc9 100644
--- a/firmware/fx3/b200/b200_main.h
+++ b/firmware/fx3/b200/b200_main.h
@@ -128,6 +128,10 @@ extern const uint8_t b200_usb_ss_config_desc[];
extern const uint8_t b200_string_lang_id_desc[];
extern const uint8_t b200_usb_manufacture_desc[];
extern const uint8_t b200_usb_product_desc[];
+extern const uint8_t niusrp_usb_manufacture_desc[];
+extern const uint8_t niusrp_2900_usb_product_desc[];
+extern const uint8_t niusrp_2901_usb_product_desc[];
+extern const uint8_t unknown_desc[];
extern uint8_t dev_serial[];
diff --git a/firmware/fx3/b200/b200_usb_descriptors.c b/firmware/fx3/b200/b200_usb_descriptors.c
index e8a765b24..03dbce74a 100644
--- a/firmware/fx3/b200/b200_usb_descriptors.c
+++ b/firmware/fx3/b200/b200_usb_descriptors.c
@@ -458,6 +458,39 @@ const uint8_t b200_usb_manufacture_desc[] __attribute__ ((aligned (32))) =
'C',0x00
};
+/* NI Manufacturer String Descriptor */
+const uint8_t niusrp_usb_manufacture_desc[] __attribute__ ((aligned (32))) =
+ {
+ 0x36, /* Descriptor Size */
+ CY_U3P_USB_STRING_DESCR, /* Device Descriptor Type */
+ 'N',0x00,
+ 'a',0x00,
+ 't',0x00,
+ 'i',0x00,
+ 'o',0x00,
+ 'n',0x00,
+ 'a',0x00,
+ 'l',0x00,
+ ' ',0x00,
+ 'I',0x00,
+ 'n',0x00,
+ 's',0x00,
+ 't',0x00,
+ 'r',0x00,
+ 'u',0x00,
+ 'm',0x00,
+ 'e',0x00,
+ 'n',0x00,
+ 't',0x00,
+ 's',0x00,
+ ' ',0x00,
+ 'C',0x00,
+ 'o',0x00,
+ 'r',0x00,
+ 'p',0x00,
+ '.',0x00
+ };
+
/* Standard Product String Descriptor */
const uint8_t b200_usb_product_desc[] __attribute__ ((aligned (32))) =
@@ -475,6 +508,57 @@ const uint8_t b200_usb_product_desc[] __attribute__ ((aligned (32))) =
'0',0x00
};
+/* NI-USRP 2900 Product String Descriptor */
+const uint8_t niusrp_2900_usb_product_desc[] __attribute__ ((aligned (32))) =
+ {
+ 0x1A, /* Descriptor Size */
+ CY_U3P_USB_STRING_DESCR, /* Device Descriptor Type */
+ 'N',0x00,
+ 'I',0x00,
+ ' ',0x00,
+ 'U',0x00,
+ 'S',0x00,
+ 'R',0x00,
+ 'P',0x00,
+ '-',0x00,
+ '2',0x00,
+ '9',0x00,
+ '0',0x00,
+ '0',0x00
+ };
+
+/* NI-USRP 2901 Product String Descriptor */
+const uint8_t niusrp_2901_usb_product_desc[] __attribute__ ((aligned (32))) =
+ {
+ 0x1A, /* Descriptor Size */
+ CY_U3P_USB_STRING_DESCR, /* Device Descriptor Type */
+ 'N',0x00,
+ 'I',0x00,
+ ' ',0x00,
+ 'U',0x00,
+ 'S',0x00,
+ 'R',0x00,
+ 'P',0x00,
+ '-',0x00,
+ '2',0x00,
+ '9',0x00,
+ '0',0x00,
+ '1',0x00
+ };
+
+const uint8_t unknown_desc[] __attribute__ ((aligned (32))) =
+ {
+ 0x10, /* Descriptor Size */
+ CY_U3P_USB_STRING_DESCR, /* Device Descriptor Type */
+ 'U',0x00,
+ 'n',0x00,
+ 'k',0x00,
+ 'n',0x00,
+ 'o',0x00,
+ 'w',0x00,
+ 'n',0x00
+ };
+
/* Microsoft OS Descriptor. */
const uint8_t CyFxUsbOSDscr[] __attribute__ ((aligned (32))) =
{