--- a/gr-fcd/lib/hid/hid-libusb.c
+++ b/gr-fcd/lib/hid/hid-libusb.c
@@ -255,7 +255,7 @@
 }
 #endif // INVASIVE_GET_USAGE
 
-
+#ifndef __FreeBSD_kernel__
 /* Get the first language the device says it reports. This comes from
    USB string #0. */
 static uint16_t get_first_language(libusb_device_handle *dev)
@@ -300,7 +300,7 @@
 
 	return 0;
 }
-
+#endif
 
 /* This function returns a newly allocated wide string containing the USB
    device string numbered by the index. The returned string must be freed
@@ -320,6 +320,25 @@
 	char *inptr;
 	char *outptr;
 
+#ifdef __FreeBSD_kernel__
+        /* Get the string from libusb. */
+        len = libusb_get_string_descriptor_ascii(dev,
+                        idx,
+                        (unsigned char*)buf,
+                        sizeof(buf));
+        if (len < 0)
+                return NULL;
+        
+        buf[sizeof(buf)-1] = '\0';
+        
+        if (len+1 < sizeof(buf))
+                buf[len+1] = '\0';
+        
+        /* Initialize iconv. */
+        ic = iconv_open("UTF-32", "ASCII");
+        if (ic == (iconv_t)-1)
+                return NULL;
+#else
 	/* Determine which language to use. */
 	uint16_t lang;
 	lang = get_usb_code_for_current_locale();
@@ -345,6 +364,8 @@
 	if (ic == (iconv_t)-1)
 		return NULL;
 	
+#endif
+
 	/* Convert to UTF-32 (wchar_t on glibc systems).
 	   Skip the first character (2-bytes). */
 	inptr = buf+2;
