+int jtagkey_open(int num) {
+ int ret;
+
+ ret = jtagkey_init(config_usb_vid(num), config_usb_pid(num));
+
+ if (ret >= 0)
+ ret = 0xff;
+
+ return ret;
+}
+
+void jtagkey_close(int handle) {
+ if (handle == 0xff) {
+ ftdi_disable_bitbang(&ftdic);
+ ftdi_usb_close(&ftdic);
+ ftdi_deinit(&ftdic);
+ }
+}
+
+#ifndef SLOW_AND_SAFE
+static int jtagkey_set_bbmode(unsigned char mode) {
+ int ret = 0;
+
+ if (bitbang_mode != mode) {
+ DPRINTF("switching bitbang-mode!\n");
+
+ /* Wait for the latency-timer to kick in */
+ usleep(2);
+ if ((ret = ftdi_set_bitmode(&ftdic, JTAGKEY_TCK|JTAGKEY_TDI|JTAGKEY_TMS|JTAGKEY_OEn, mode)) != 0) {
+ fprintf(stderr, "unable to enable bitbang mode: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
+ return ret;
+ }
+ if ((ret = ftdi_usb_purge_buffers(&ftdic)) != 0) {
+ fprintf(stderr, "unable to purge buffers: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
+ return ret;
+ }
+ /* Wait for the FTDI2232 to settle */
+ usleep(2);
+
+ bitbang_mode = mode;
+ }
+
+ return ret;