+ uint8_t reg_val;
+ uint8_t dummy[8];
+ uint8_t serial[8];
+ uint8_t magic[16];
+ int8_t temperature;
+ int ret, i;
+
+ ret = reseed(sdi);
+ if (ret != SR_OK)
+ return ret;
+
+ ret = get_firmware_version(sdi);
+ if (ret != SR_OK)
+ return ret;
+
+ sr_dbg("read serial");
+ ret = read_eeprom_serial(sdi, serial);
+ if (ret != SR_OK)
+ return ret;
+
+ /* Check if we need to upload the bitstream. */
+ ret = read_reg(sdi, 0x7f, ®_val);
+ if (ret != SR_OK)
+ return ret;
+ if (reg_val == 0xaa) {
+ sr_info("Skipping bitstream upload.");
+ } else {
+ ret = upload_bitstream(sdi, "saleae-logicpro16-fpga.bitstream");
+ if (ret != SR_OK)
+ return ret;
+ }
+
+ /* Reset the ADC? */
+ sr_dbg("reset ADC");
+ ret = write_reg(sdi, 0x00, 0x00);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_reg(sdi, 0x00, 0x80);
+ if (ret != SR_OK)
+ return ret;
+
+ sr_dbg("init ADC");
+ ret = write_adc(sdi, 0x11, 0x0444);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x12, 0x0777);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x25, 0x0000);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x45, 0x0000);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x2a, 0x1111);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x2b, 0x1111);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x46, 0x0004);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x50, 0x0000);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x55, 0x0020);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_adc(sdi, 0x56, 0x0000);
+ if (ret != SR_OK)
+ return ret;
+
+ ret = write_reg(sdi, 0x15, 0x00);
+ if (ret != SR_OK)
+ return ret;
+
+ ret = write_adc(sdi, 0x0f, 0x0100);
+ if (ret != SR_OK)
+ return ret;
+
+ /* Resets? */
+ sr_dbg("resets");
+ ret = write_reg(sdi, 0x00, 0x02); /* bit 1 */
+ if (ret != SR_OK)
+ return ret;
+ ret = write_reg(sdi, 0x00, 0x00);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_reg(sdi, 0x00, 0x04); /* bit 2 */
+ if (ret != SR_OK)
+ return ret;
+ ret = write_reg(sdi, 0x00, 0x00);
+ if (ret != SR_OK)
+ return ret;
+ ret = write_reg(sdi, 0x00, 0x08); /* bit 3 */
+ if (ret != SR_OK)
+ return ret;
+ ret = write_reg(sdi, 0x00, 0x00);
+ if (ret != SR_OK)
+ return ret;
+
+ sr_dbg("read dummy");
+ for (i = 0; i < 8; i++) {
+ ret = read_reg(sdi, 0x41 + i, &dummy[i]);
+ if (ret != SR_OK)
+ return ret;
+ }
+
+ /* Read and write back magic EEPROM value. */
+ sr_dbg("read/write magic");
+ ret = read_eeprom_magic(sdi, magic);
+ if (ret != SR_OK)
+ return ret;
+ for (i = 0; i < 16; i++) {
+ ret = write_reg(sdi, 0x17, magic[i]);
+ if (ret != SR_OK)
+ return ret;
+ }
+
+ ret = read_temperature(sdi, &temperature);
+ if (ret != SR_OK)
+ return ret;
+ sr_dbg("temperature = %d", temperature);
+