diff options
Diffstat (limited to 'host/lib/transport/nirio/nirio_driver_iface_win.cpp')
-rw-r--r-- | host/lib/transport/nirio/nirio_driver_iface_win.cpp | 118 |
1 files changed, 72 insertions, 46 deletions
diff --git a/host/lib/transport/nirio/nirio_driver_iface_win.cpp b/host/lib/transport/nirio/nirio_driver_iface_win.cpp index 6a5513ebe..e50473e99 100644 --- a/host/lib/transport/nirio/nirio_driver_iface_win.cpp +++ b/host/lib/transport/nirio/nirio_driver_iface_win.cpp @@ -8,20 +8,31 @@ #include <uhd/transport/nirio/nirio_driver_iface.h> #include <process.h> -#define NIRIO_IOCTL_MAP_MEMORY CTL_CODE(FILE_DEVICE_UNKNOWN, 0xF00, METHOD_BUFFERED, (FILE_READ_ACCESS | FILE_WRITE_ACCESS)) -#define NIRIO_IOCTL_UNMAP_MEMORY CTL_CODE(FILE_DEVICE_UNKNOWN, 0xF01, METHOD_BUFFERED, (FILE_READ_ACCESS | FILE_WRITE_ACCESS)) +#define NIRIO_IOCTL_MAP_MEMORY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, \ + 0xF00, \ + METHOD_BUFFERED, \ + (FILE_READ_ACCESS | FILE_WRITE_ACCESS)) +#define NIRIO_IOCTL_UNMAP_MEMORY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, \ + 0xF01, \ + METHOD_BUFFERED, \ + (FILE_READ_ACCESS | FILE_WRITE_ACCESS)) namespace nirio_driver_iface { -nirio_status rio_open( - const std::string& device_path, - rio_dev_handle_t& device_handle) +nirio_status rio_open(const std::string& device_path, rio_dev_handle_t& device_handle) { - device_handle = CreateFileA(device_path.c_str(), GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, /* default security */ - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL /* template file */); - - return (device_handle == INVALID_HANDLE_VALUE) ? NiRio_Status_InvalidParameter : NiRio_Status_Success; + device_handle = CreateFileA(device_path.c_str(), + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, /* default security */ + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, + NULL /* template file */); + + return (device_handle == INVALID_HANDLE_VALUE) ? NiRio_Status_InvalidParameter + : NiRio_Status_Success; } void rio_close(rio_dev_handle_t& device_handle) @@ -35,27 +46,30 @@ bool rio_isopen(rio_dev_handle_t device_handle) return (device_handle != INVALID_HANDLE_VALUE); } -nirio_status rio_ioctl( - rio_dev_handle_t device_handle, +nirio_status rio_ioctl(rio_dev_handle_t device_handle, uint32_t ioctl_code, - const void *write_buf, + const void* write_buf, size_t write_buf_len, - void *read_buf, + void* read_buf, size_t read_buf_len) { - if (!rio_isopen(device_handle)) return NiRio_Status_ResourceNotInitialized; + if (!rio_isopen(device_handle)) + return NiRio_Status_ResourceNotInitialized; /* Note, if the file handle was opened with the OVERLAPPED flag, you must - * supply an OVERLAPPED structure to ReadFile, WriteFile, and - * DeviceIoControl, even when doing synchronous IO. */ + * supply an OVERLAPPED structure to ReadFile, WriteFile, and + * DeviceIoControl, even when doing synchronous IO. */ OVERLAPPED zeroedOverlapped = {0}; - DWORD outLen = 0; - - if (!(DeviceIoControl(device_handle, ioctl_code, - const_cast<void*>(write_buf), static_cast<DWORD>(write_buf_len), - read_buf, static_cast<DWORD>(read_buf_len), - &outLen, &zeroedOverlapped ))) - { + DWORD outLen = 0; + + if (!(DeviceIoControl(device_handle, + ioctl_code, + const_cast<void*>(write_buf), + static_cast<DWORD>(write_buf_len), + read_buf, + static_cast<DWORD>(read_buf_len), + &outLen, + &zeroedOverlapped))) { UHD_UNUSED(int_fast32_t lastError) = GetLastError(); return NiRio_Status_SoftwareFault; } @@ -63,42 +77,48 @@ nirio_status rio_ioctl( return NiRio_Status_Success; } -unsigned int __stdcall memory_map_thread_routine(void *context) +unsigned int __stdcall memory_map_thread_routine(void* context) { - rio_mmap_threadargs_t *args = (rio_mmap_threadargs_t*)context; - args->status = rio_ioctl(args->device_handle, NIRIO_IOCTL_MAP_MEMORY, &(args->params), sizeof(args->params), NULL, 0); - if (nirio_status_fatal(args->status)) - { + rio_mmap_threadargs_t* args = (rio_mmap_threadargs_t*)context; + args->status = rio_ioctl(args->device_handle, + NIRIO_IOCTL_MAP_MEMORY, + &(args->params), + sizeof(args->params), + NULL, + 0); + if (nirio_status_fatal(args->status)) { SetEvent(reinterpret_cast<HANDLE>(args->params.map_ready_event_handle)); } return 0; } -nirio_status rio_mmap( - rio_dev_handle_t device_handle, +nirio_status rio_mmap(rio_dev_handle_t device_handle, uint16_t memory_type, size_t size, bool writable, - rio_mmap_t &map) + rio_mmap_t& map) { - if (!rio_isopen(device_handle)) return NiRio_Status_ResourceNotInitialized; + if (!rio_isopen(device_handle)) + return NiRio_Status_ResourceNotInitialized; access_mode_t access_mode = writable ? ACCESS_MODE_WRITE : ACCESS_MODE_READ; - uint64_t mapped_addr = 0; - map.map_thread_args.device_handle = device_handle; - map.map_thread_args.status = NiRio_Status_Success; - map.map_thread_args.params.memoryType = memory_type; - map.map_thread_args.params.size = (uint32_t)size; + uint64_t mapped_addr = 0; + map.map_thread_args.device_handle = device_handle; + map.map_thread_args.status = NiRio_Status_Success; + map.map_thread_args.params.memoryType = memory_type; + map.map_thread_args.params.size = (uint32_t)size; map.map_thread_args.params.mapped_va_ptr = reinterpret_cast<uintptr_t>(&mapped_addr); - map.map_thread_args.params.access_mode = (uint8_t)access_mode; - HANDLE map_ready_event_handle = CreateEventA(NULL, TRUE, FALSE, NULL); + map.map_thread_args.params.access_mode = (uint8_t)access_mode; + HANDLE map_ready_event_handle = CreateEventA(NULL, TRUE, FALSE, NULL); if (map_ready_event_handle == NULL) { map.addr = NULL; return NiRio_Status_SoftwareFault; } - map.map_thread_args.params.map_ready_event_handle = reinterpret_cast<uint64_t>(map_ready_event_handle); - map.map_thread_handle = (HANDLE) _beginthreadex(NULL, 0, memory_map_thread_routine, &(map.map_thread_args), 0, NULL); + map.map_thread_args.params.map_ready_event_handle = + reinterpret_cast<uint64_t>(map_ready_event_handle); + map.map_thread_handle = (HANDLE)_beginthreadex( + NULL, 0, memory_map_thread_routine, &(map.map_thread_args), 0, NULL); nirio_status status = NiRio_Status_Success; if (map.map_thread_handle == NULL) { @@ -117,14 +137,20 @@ nirio_status rio_mmap( return status; } -nirio_status rio_munmap(rio_mmap_t &map) +nirio_status rio_munmap(rio_mmap_t& map) { - if (!rio_isopen(map.map_thread_args.device_handle)) return NiRio_Status_ResourceNotInitialized; + if (!rio_isopen(map.map_thread_args.device_handle)) + return NiRio_Status_ResourceNotInitialized; nirio_status status = NiRio_Status_Success; if (map.addr != NULL) { uint64_t mapped_addr = reinterpret_cast<uintptr_t>(map.addr); - status = rio_ioctl(map.map_thread_args.device_handle, NIRIO_IOCTL_UNMAP_MEMORY, &mapped_addr, sizeof(mapped_addr), NULL, 0); + status = rio_ioctl(map.map_thread_args.device_handle, + NIRIO_IOCTL_UNMAP_MEMORY, + &mapped_addr, + sizeof(mapped_addr), + NULL, + 0); if (nirio_status_not_fatal(status)) { WaitForSingleObject(map.map_thread_handle, INFINITE); } @@ -134,4 +160,4 @@ nirio_status rio_munmap(rio_mmap_t &map) return status; } -} +} // namespace nirio_driver_iface |