@@ -29,7 +29,8 @@ using namespace std;
2929#define MHZ (n ) (uint32_t )((n)*UINT32_C (1000000 ))
3030#define GHZ (n ) (uint32_t )((n)*UINT32_C (1000000000 ))
3131
32- #define CH347JTAG_INTF 2
32+ #define CH347TJTAG_INTF 2
33+ #define CH347FJTAG_INTF 4
3334#define CH347JTAG_WRITE_EP 0x06
3435#define CH347JTAG_READ_EP 0x86
3536
@@ -55,7 +56,7 @@ int CH347Jtag::usb_xfer(unsigned wlen, unsigned rlen, unsigned *ract, bool defer
5556{
5657 int actual_length = 0 ;
5758 if (_verbose) {
58- fprintf (stderr, " usb_xfer: deferred: %ld \n " , obuf - _obuf);
59+ fprintf (stderr, " usb_xfer: deferred: %lld \n " , obuf - _obuf);
5960 }
6061 if (defer && !rlen && obuf - _obuf + wlen < (MAX_BUFFER - 12 )) {
6162 obuf += wlen;
@@ -156,7 +157,7 @@ CH347Jtag::CH347Jtag(uint32_t clkHZ, int8_t verbose, int vid, int pid, uint8_t b
156157 while ((dev = devs[i++]) != NULL ) {
157158 if (libusb_get_device_descriptor (dev, &desc) < 0 )
158159 continue ;
159- if (desc.idVendor != vid || desc.idProduct != pid)
160+ if (desc.idVendor != vid || ( desc.idProduct != pid && desc. idProduct != CH347F_JTAG_PID && desc. idProduct != CH347T_JTAG_PID) )
160161 continue ;
161162 if (bus_addr != 0 && dev_addr != 0 && (libusb_get_bus_number (dev) != bus_addr || libusb_get_device_address (dev) != dev_addr))
162163 continue ;
@@ -179,19 +180,22 @@ CH347Jtag::CH347Jtag(uint32_t clkHZ, int8_t verbose, int vid, int pid, uint8_t b
179180 printError (" failed to get device descriptor" );
180181 goto usb_exit;
181182 }
183+ _jtagIntf = (desc.idProduct == CH347T_JTAG_PID) ? CH347TJTAG_INTF : CH347FJTAG_INTF;
182184
183- if (desc.bcdDevice < 0x241 && pid == CH347T_JTAG_PID) {
185+ if (desc.bcdDevice < 0x241 && desc. idProduct == CH347T_JTAG_PID) {
184186 _is_largerPack = false ;
185187 printWarn (" Old version of the chip, JTAG might not work" );
186188 }else {
187189 _is_largerPack = true ;
188190 }
189-
190- if (libusb_set_auto_detach_kernel_driver (dev_handle, true )) {
191+ #if (!defined(WIN32) && !defined(_WIN64))
192+ // Windows will fails this API call
193+ if (libusb_set_auto_detach_kernel_driver (dev_handle, true ) != LIBUSB_SUCCESS) {
191194 printError (" libusb error wrile setting auto-detach of kernel driver" );
192195 goto usb_exit;
193196 }
194- if (libusb_claim_interface (dev_handle, CH347JTAG_INTF)) {
197+ #endif
198+ if (libusb_claim_interface (dev_handle, _jtagIntf)) {
195199 printError (" libusb error while claiming CH347JTAG interface" );
196200 goto usb_close;
197201 }
@@ -206,7 +210,7 @@ CH347Jtag::CH347Jtag(uint32_t clkHZ, int8_t verbose, int vid, int pid, uint8_t b
206210 _setClkFreq (clkHZ);
207211 return ;
208212usb_release:
209- libusb_release_interface (dev_handle, CH347JTAG_INTF );
213+ libusb_release_interface (dev_handle, _jtagIntf );
210214usb_close:
211215 libusb_close (dev_handle);
212216usb_exit:
@@ -221,7 +225,7 @@ CH347Jtag::~CH347Jtag()
221225 if (wtrans) libusb_free_transfer (wtrans);
222226
223227 if (dev_handle) {
224- libusb_release_interface (dev_handle, CH347JTAG_INTF );
228+ libusb_release_interface (dev_handle, _jtagIntf );
225229 libusb_close (dev_handle);
226230 dev_handle = 0 ;
227231 }
0 commit comments