Skip to content

Commit 715994b

Browse files
committed
Add hidraw backend for FreeBSD
FreeBSD support hidraw in Kernel from 13.0. By using libusb only, we can only see the HID device from usb. To address this, we implement hidraw backend for FreeBSD. Just like Linux use libudev to handle usb specified HID stuff (like Manufacture), we use libusb to handle it. Sponsored-by: FreeBSD Foundation Sponsored-by: Framework Laptop. Inc
1 parent 0ab6c14 commit 715994b

13 files changed

+1336
-11
lines changed

CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ elseif(NOT WIN32)
4242
option(HIDAPI_WITH_HIDRAW "Build HIDRAW-based implementation of HIDAPI" ON)
4343
option(HIDAPI_WITH_LIBUSB "Build LIBUSB-based implementation of HIDAPI" ON)
4444
endif()
45+
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
46+
option(HIDAPI_WITH_HIDRAW "Build HIDRAW-based implementation of HIDAPI" ON)
47+
option(HIDAPI_WITH_LIBUSB "Build LIBUSB-based implementation of HIDAPI" ON)
48+
endif()
4549
if(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
4650
option(HIDAPI_WITH_NETBSD "Build NetBSD/UHID implementation of HIDAPI" ON)
4751
endif()

Makefile.am

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ endif
1010
if OS_LINUX
1111
pkgconfig_DATA=pc/hidapi-hidraw.pc pc/hidapi-libusb.pc
1212
else
13+
if OS_FREEBSD
14+
pkgconfig_DATA=pc/hidapi-hidraw.pc pc/hidapi-libusb.pc
15+
else
1316
pkgconfig_DATA=pc/hidapi.pc
1417
endif
18+
endif
1519

1620
SUBDIRS=
1721

@@ -24,7 +28,7 @@ SUBDIRS += mac
2428
endif
2529

2630
if OS_FREEBSD
27-
SUBDIRS += libusb
31+
SUBDIRS += freebsd libusb
2832
endif
2933

3034
if OS_KFREEBSD
@@ -70,6 +74,7 @@ SCMCLEAN_TARGETS= \
7074
libusb/Makefile.in \
7175
Makefile.in \
7276
linux/Makefile.in \
77+
freebsd/Makefile.in \
7378
windows/Makefile.in \
7479
m4/libtool.m4 \
7580
m4/lt~obsolete.m4 \

configure.ac

+7-2
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,18 @@ case $host in
8080
AC_MSG_RESULT([ (FreeBSD back-end)])
8181
AC_DEFINE(OS_FREEBSD, 1, [FreeBSD implementation])
8282
AC_SUBST(OS_FREEBSD)
83-
backend="libusb"
83+
backend="freebsd"
8484
os="freebsd"
8585
threads="pthreads"
8686

8787
CFLAGS="$CFLAGS -I/usr/local/include"
8888
LDFLAGS="$LDFLAGS -L/usr/local/lib"
8989
LIBS="${LIBS}"
9090
PKG_CHECK_MODULES([libusb], [libusb-1.0 >= 1.0.9], true, [hidapi_lib_error libusb-1.0])
91+
# HIDAPI/hidraw libs
92+
LIBS_HIDRAW_PR="${LIBS_HIDRAW_PR} $libusb_LIBS"
93+
CFLAGS_HIDRAW="${CFLAGS_HIDRAW} $libusb_CFLAGS"
94+
# HIDAPI/libusb libs
9195
LIBS_LIBUSB_PRIVATE="${LIBS_LIBUSB_PRIVATE} $libusb_LIBS"
9296
CFLAGS_LIBUSB="${CFLAGS_LIBUSB} $libusb_CFLAGS"
9397
AC_CHECK_LIB([iconv], [iconv_open], [LIBS_LIBUSB_PRIVATE="${LIBS_LIBUSB_PRIVATE} -liconv"], [hidapi_lib_error libiconv])
@@ -237,7 +241,7 @@ AM_CONDITIONAL(OS_WINDOWS, test "x$os" = xwindows)
237241

238242
AC_CONFIG_HEADERS([config.h])
239243

240-
if test "x$os" = "xlinux"; then
244+
if test "x$os" = xlinux; then
241245
AC_CONFIG_FILES([pc/hidapi-hidraw.pc])
242246
AC_CONFIG_FILES([pc/hidapi-libusb.pc])
243247
else
@@ -250,6 +254,7 @@ AC_CONFIG_FILES([Makefile \
250254
hidtest/Makefile \
251255
libusb/Makefile \
252256
linux/Makefile \
257+
freebsd/Makefile \
253258
mac/Makefile \
254259
testgui/Makefile \
255260
windows/Makefile])

freebsd/.gitignore

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Debug
2+
Release
3+
*.exp
4+
*.ilk
5+
*.lib
6+
*.suo
7+
*.vcproj.*
8+
*.ncb
9+
*.suo
10+
*.dll
11+
*.pdb
12+
*.o
13+
*.so
14+
hidtest-hidraw
15+
.deps
16+
.libs
17+
*.lo
18+
*.la

freebsd/CMakeLists.txt

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
cmake_minimum_required(VERSION 3.6.3...3.25 FATAL_ERROR)
2+
3+
add_library(hidapi_hidraw
4+
${HIDAPI_PUBLIC_HEADERS}
5+
hid.c
6+
)
7+
target_link_libraries(hidapi_hidraw PUBLIC hidapi_include)
8+
9+
find_package(Threads REQUIRED)
10+
11+
include(FindPkgConfig)
12+
pkg_check_modules(libusb-1.0 REQUIRED IMPORTED_TARGET libusb-1.0>=1.0.9)
13+
14+
target_link_libraries(hidapi_hidraw PRIVATE PkgConfig::libusb-1.0 Threads::Threads)
15+
16+
set_target_properties(hidapi_hidraw
17+
PROPERTIES
18+
EXPORT_NAME "hidraw"
19+
OUTPUT_NAME "hidapi-hidraw"
20+
VERSION ${PROJECT_VERSION}
21+
SOVERSION ${PROJECT_VERSION_MAJOR}
22+
PUBLIC_HEADER "${HIDAPI_PUBLIC_HEADERS}"
23+
)
24+
25+
# compatibility with find_package()
26+
add_library(hidapi::hidraw ALIAS hidapi_hidraw)
27+
# compatibility with raw library link
28+
add_library(hidapi-hidraw ALIAS hidapi_hidraw)
29+
30+
if(HIDAPI_INSTALL_TARGETS)
31+
install(TARGETS hidapi_hidraw EXPORT hidapi
32+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
33+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
34+
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hidapi"
35+
)
36+
endif()
37+
38+
hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-hidraw.pc.in")

freebsd/Makefile-manual

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
###########################################
2+
# Simple Makefile for HIDAPI test program
3+
#
4+
# Alan Ott
5+
# Signal 11 Software
6+
# 2010-06-01
7+
###########################################
8+
9+
all: hidtest-hidraw libs
10+
11+
libs: libhidapi-hidraw.so
12+
13+
CC ?= gcc
14+
CFLAGS ?= -Wall -g -fpic
15+
16+
LDFLAGS ?= -Wall -g
17+
18+
19+
COBJS = hid.o ../hidtest/test.o
20+
OBJS = $(COBJS)
21+
LIBS_USB = `pkg-config libusb-1.0 --libs`
22+
LIBS = $(LIBS_USB)
23+
INCLUDES ?= -I../hidapi `pkg-config libusb-1.0 --cflags`
24+
25+
26+
# Console Test Program
27+
hidtest-hidraw: $(COBJS)
28+
$(CC) $(LDFLAGS) $^ $(LIBS_USB) -o $@
29+
30+
# Shared Libs
31+
libhidapi-hidraw.so: $(COBJS)
32+
$(CC) $(LDFLAGS) $(LIBS_USB) -shared -fpic -Wl,-soname,[email protected] $^ -o $@
33+
34+
# Objects
35+
$(COBJS): %.o: %.c
36+
$(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@
37+
38+
39+
clean:
40+
rm -f $(OBJS) hidtest-hidraw libhidapi-hidraw.so $(COBJS)
41+
42+
.PHONY: clean libs

freebsd/Makefile.am

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
lib_LTLIBRARIES = libhidapi-hidraw.la
2+
libhidapi_hidraw_la_SOURCES = hid.c
3+
libhidapi_hidraw_la_LDFLAGS = $(LTLDFLAGS)
4+
AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ $(CFLAGS_HIDRAW)
5+
libhidapi_hidraw_la_LIBADD = $(LIBS_HIDRAW)
6+
7+
hdrdir = $(includedir)/hidapi
8+
hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h
9+
10+
EXTRA_DIST = Makefile-manual

0 commit comments

Comments
 (0)