Skip to content

Commit 84897ff

Browse files
committed
Enable support for CH347F
FIx a Windows issue
1 parent 63a4234 commit 84897ff

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

src/ch347jtag.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
208212
usb_release:
209-
libusb_release_interface(dev_handle, CH347JTAG_INTF);
213+
libusb_release_interface(dev_handle, _jtagIntf);
210214
usb_close:
211215
libusb_close(dev_handle);
212216
usb_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
}

src/ch347jtag.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class CH347Jtag : public JtagInterface {
3333
private:
3434
bool _verbose;
3535
bool _is_largerPack;
36+
int _jtagIntf;
3637
int setClk(const uint8_t &factor);
3738

3839
libusb_device_handle *dev_handle;

0 commit comments

Comments
 (0)