Skip to content

Commit

Permalink
initial import of hidapi netbsd uhid native backend from mainstream
Browse files Browse the repository at this point in the history
  • Loading branch information
sezero committed Nov 14, 2023
1 parent 0c8f207 commit a59e9c1
Show file tree
Hide file tree
Showing 8 changed files with 1,290 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/hidapi/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ elseif(NOT WIN32)
option(HIDAPI_WITH_HIDRAW "Build HIDRAW-based implementation of HIDAPI" ON)
option(HIDAPI_WITH_LIBUSB "Build LIBUSB-based implementation of HIDAPI" ON)
endif()
if(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
option(HIDAPI_WITH_NETBSD "Build NetBSD/UHID implementation of HIDAPI" ON)
endif()
endif()

option(BUILD_SHARED_LIBS "Build shared version of the libraries, otherwise build statically" ON)
Expand Down
2 changes: 2 additions & 0 deletions src/hidapi/SDL_hidapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,8 @@ typedef struct PLATFORM_hid_device_ PLATFORM_hid_device;

#ifdef __LINUX__
#include "SDL_hidapi_linux.h"
#elif defined(__NETBSD__)
#include "SDL_hidapi_netbsd.h"
#elif defined(__MACOS__)
#include "SDL_hidapi_mac.h"
#elif defined(__WINDOWS__) || defined(__WINGDK__)
Expand Down
25 changes: 25 additions & 0 deletions src/hidapi/SDL_hidapi_netbsd.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
Simple DirectMedia Layer
Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/

#undef HIDAPI_H__
#include "netbsd/hid.c"
#define HAVE_PLATFORM_BACKEND 1
#define udev_ctx 1
35 changes: 35 additions & 0 deletions src/hidapi/netbsd/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
cmake_minimum_required(VERSION 3.6.3 FATAL_ERROR)

add_library(hidapi_netbsd
${HIDAPI_PUBLIC_HEADERS}
hid.c
)
target_link_libraries(hidapi_netbsd PUBLIC hidapi_include)

find_package(Threads REQUIRED)

target_link_libraries(hidapi_netbsd PRIVATE Threads::Threads)

set_target_properties(hidapi_netbsd
PROPERTIES
EXPORT_NAME "netbsd"
OUTPUT_NAME "hidapi-netbsd"
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
PUBLIC_HEADER "${HIDAPI_PUBLIC_HEADERS}"
)

# compatibility with find_package()
add_library(hidapi::netbsd ALIAS hidapi_netbsd)
# compatibility with raw library link
add_library(hidapi-netbsd ALIAS hidapi_netbsd)

if(HIDAPI_INSTALL_TARGETS)
install(TARGETS hidapi_netbsd EXPORT hidapi
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hidapi"
)
endif()

hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-netbsd.pc.in")
29 changes: 29 additions & 0 deletions src/hidapi/netbsd/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Implementation Notes
--------------------
NetBSD maps every `uhidev` device to one or more `uhid`
devices. Each `uhid` device only supports one report ID.
The parent device `uhidev` creates one `uhid` device per
report ID found in the hardware's report descriptor.

In the event there are no report ID(s) found within the
report descriptor, only one `uhid` device with a report ID
of `0` is created.

In order to remain compatible with existing `hidapi` APIs,
all the `uhid` devices created by the parent `uhidev` device
must be opened under the same `hid_device` instance to ensure
that we can route reports to their appropriate `uhid` device.

Internally the `uhid` driver will insert the report ID as
needed so we must also omit the report ID in any situation
where the `hidapi` API expects it to be included in the
report data stream.

Given the design of `uhid`, it must be augmented with extra
platform specific APIs to ensure that the exact relationship
between `uhidev` devices and `uhid` devices can be determined.

The NetBSD implementation does this via the `drvctl` kernel
driver. At present there is no known way to do this on OpenBSD
for a `uhid` implementation to be at the same level as the
NetBSD one.
Loading

0 comments on commit a59e9c1

Please sign in to comment.