From 3deb5484eb227c268579f3b595e6ffb9d1b4b54c Mon Sep 17 00:00:00 2001 From: Ashish Chaudhari Date: Fri, 14 Aug 2015 15:34:20 -0700 Subject: nirio: Changes to kernel proxy to work with RIO 15.0 on linux - Implemented IOCTL macro for linux and macosx - Refactored v1 and v2 proxy code --- .../uhd/transport/nirio/nirio_driver_iface.h | 101 +++-- host/include/uhd/transport/nirio/niriok_proxy.h | 29 +- .../uhd/transport/nirio/niriok_proxy_impl_v1.h | 339 +---------------- .../uhd/transport/nirio/niriok_proxy_impl_v2.h | 269 ------------- .../transport/nirio/nirio_driver_iface_linux.cpp | 10 - host/lib/transport/nirio/niriok_proxy_impl_v1.cpp | 421 +++++++++++++++++++-- host/lib/transport/nirio/niriok_proxy_impl_v2.cpp | 270 ++++++++++++- 7 files changed, 721 insertions(+), 718 deletions(-) diff --git a/host/include/uhd/transport/nirio/nirio_driver_iface.h b/host/include/uhd/transport/nirio/nirio_driver_iface.h index 2668c10b9..6804f6171 100644 --- a/host/include/uhd/transport/nirio/nirio_driver_iface.h +++ b/host/include/uhd/transport/nirio/nirio_driver_iface.h @@ -34,51 +34,74 @@ #endif #elif defined(UHD_PLATFORM_MACOS) #include +#elif defined(UHD_PLATFORM_LINUX) + #include #endif -// CTL_CODE macro for non-win OSes -#ifndef UHD_PLATFORM_WIN32 - #define CTL_CODE(a,controlCode,b,c) (controlCode) +#if __GNUC__ + typedef uint64_t aligned_uint64_t __attribute__ ((aligned(8))); +#else + typedef uint64_t aligned_uint64_t; #endif -namespace nirio_driver_iface { +//IOCTL Definitions + +#if defined(UHD_PLATFORM_WIN32) + + #define IOCTL_ACCESS_ANY (FILE_ANY_ACCESS) + #define IOCTL_ACCESS_READ (FILE_READ_ACCESS) + #define IOCTL_ACCESS_WRITE (FILE_WRITE_ACCESS) + #define IOCTL_ACCESS_RW (FILE_READ_ACCESS | FILE_WRITE_ACCESS) -const uint32_t NIRIO_IOCTL_BASE = 0x800; - -const uint32_t NIRIO_IOCTL_SYNCOP = - CTL_CODE(FILE_DEVICE_UNKNOWN, - NIRIO_IOCTL_BASE + 4, - METHOD_OUT_DIRECT, - FILE_READ_DATA | FILE_WRITE_DATA); - ///< The synchronous operation code. Note: We - /// must use METHOD_OUT_DIRECT on the syncOp() - /// IOCTL to ensure the contents of the output - /// block are available in the kernel. - -const uint32_t NIRIO_IOCTL_GET_IFACE_NUM = - CTL_CODE(FILE_DEVICE_UNKNOWN, - NIRIO_IOCTL_BASE + 6, - METHOD_BUFFERED, - FILE_READ_DATA); ///< Get the interface number for a device - -const uint32_t NIRIO_IOCTL_GET_SESSION = - CTL_CODE(FILE_DEVICE_UNKNOWN, - NIRIO_IOCTL_BASE + 8, - METHOD_BUFFERED, - FILE_READ_ACCESS); ///< Gets a previously opened session to a device - -const uint32_t NIRIO_IOCTL_POST_OPEN = - CTL_CODE(FILE_DEVICE_UNKNOWN, - NIRIO_IOCTL_BASE + 9, - METHOD_BUFFERED, - FILE_READ_ACCESS); ///< Called after opening a session - -const uint32_t NIRIO_IOCTL_PRE_CLOSE = - CTL_CODE(FILE_DEVICE_UNKNOWN, - NIRIO_IOCTL_BASE + 10, - METHOD_BUFFERED, - FILE_READ_ACCESS); ///< Called before closing a session + #define IOCTL(type, function, access) \ + CTL_CODE((0x8000+type), (0x800+function), METHOD_BUFFERED, access) + +#elif defined(UHD_PLATFORM_MACOS) + + #define IOCTL_ACCESS_ANY (0U) + #define IOCTL_ACCESS_READ (1U) + #define IOCTL_ACCESS_WRITE (2U) + #define IOCTL_ACCESS_RW (3U) + + #define IOCTL(type, function, access) \ + (((access & 0x0003) << 30) | \ + ((type & 0x00FF) << 16) | \ + ((function & 0xFFFF) << 0)) + +#elif defined(UHD_PLATFORM_LINUX) + + #define IOCTL_ACCESS_ANY (_IOC_NONE) + #define IOCTL_ACCESS_READ (_IOC_READ) + #define IOCTL_ACCESS_WRITE (_IOC_WRITE) + #define IOCTL_ACCESS_RW (_IOC_READ | _IOC_WRITE) + + struct nirio_ioctl_block_t { + aligned_uint64_t in_buf; + aligned_uint64_t out_buf; + uint32_t in_buf_len; + uint32_t out_buf_len; + uint32_t bytes_returned; + uint32_t padding; + }; + #define IOCTL(type, function, access) \ + _IOC(access, type, function, sizeof(nirio_ioctl_block_t)) + +#else + + #define IOCTL_ACCESS_ANY (0U) + #define IOCTL_ACCESS_READ (1U) + #define IOCTL_ACCESS_WRITE (2U) + #define IOCTL_ACCESS_RW (3U) + + #define IOCTL(type, function, access) \ + (((access & 0x0003) << 30) | \ + ((type & 0x00FF) << 16) | \ + ((function & 0xFFFF) << 0)) + +#endif + +namespace nirio_driver_iface { //Device handle definition #if defined(UHD_PLATFORM_LINUX) diff --git a/host/include/uhd/transport/nirio/niriok_proxy.h b/host/include/uhd/transport/nirio/niriok_proxy.h index 07bcb59b6..bb112dd8a 100644 --- a/host/include/uhd/transport/nirio/niriok_proxy.h +++ b/host/include/uhd/transport/nirio/niriok_proxy.h @@ -145,29 +145,9 @@ namespace uhd { namespace niusrprio class UHD_API niriok_proxy : public boost::noncopyable { public: - struct nirio_ioctl_packet_t { - nirio_ioctl_packet_t( - void* const _outBuf, - const uint32_t _outSize, - const int32_t _statusCode) - { - outBuf._64BitField = 0; - outBuf.pointer = _outBuf; - outSize = _outSize; - statusCode = _statusCode; - }; - - union { - void* pointer; - uint64_t _64BitField; - } outBuf; - - uint32_t outSize; - int32_t statusCode; - }; - typedef boost::shared_ptr sptr; - - static sptr make_and_open(const std::string& interface_path); + typedef boost::shared_ptr sptr; + + static sptr make_and_open(const std::string& interface_path); niriok_proxy(); virtual ~niriok_proxy(); @@ -180,9 +160,6 @@ namespace uhd { namespace niusrprio uint32_t get_interface_num() { return _interface_num; } - virtual nirio_status get_cached_session( - uint32_t& session) = 0; - virtual nirio_status get_version( nirio_version_t type, uint32_t& major, diff --git a/host/include/uhd/transport/nirio/niriok_proxy_impl_v1.h b/host/include/uhd/transport/nirio/niriok_proxy_impl_v1.h index 173d43ed6..a10d1aaff 100644 --- a/host/include/uhd/transport/nirio/niriok_proxy_impl_v1.h +++ b/host/include/uhd/transport/nirio/niriok_proxy_impl_v1.h @@ -33,341 +33,8 @@ namespace uhd { namespace niusrprio are not compatible with NI-RIO 14.0 and later. */ - class UHD_API niriok_proxy_impl_v1 : virtual public niriok_proxy { + class UHD_API niriok_proxy_impl_v1 : virtual public niriok_proxy { public: - - // ------------------------------- - // Function Codes: defined as integers rather than enums because they - // are going to be carried accross boundaries so size matters - - struct NIRIO_FUNC - { - static const uint32_t GET32 = 0x00000001; - static const uint32_t SET32 = 0x00000002; - static const uint32_t SET_DRIVER_CONFIG = 0x00000007; - static const uint32_t FIFO = 0x00000008; - static const uint32_t IO = 0x0000000A; - static const uint32_t FIFO_STOP_ALL = 0x0000000C; - static const uint32_t ADD_RESOURCE = 0x0000000D; - static const uint32_t GET_STRING = 0x0000000E; - static const uint32_t SET_STRING = 0x0000000F; - static const uint32_t DOWNLOAD = 0x00000013; - static const uint32_t RESET = 0x00000014; - }; - - struct NIRIO_RESOURCE - { - static const uint32_t INPUT_FIFO = 0xD0000001; - static const uint32_t OUTPUT_FIFO = 0xD0000002; - }; - - struct NIRIO_FIFO - { - static const uint32_t CONFIGURE = 0x80000001; - static const uint32_t START = 0x80000002; - static const uint32_t STOP = 0x80000003; - static const uint32_t READ = 0x80000004; - static const uint32_t WRITE = 0x80000005; - static const uint32_t WAIT = 0x80000006; - static const uint32_t GRANT = 0x80000007; - }; - - struct NIRIO_IO - { - static const uint32_t POKE64 = 0xA0000005; - static const uint32_t POKE32 = 0xA0000006; - static const uint32_t POKE16 = 0xA0000007; - static const uint32_t POKE8 = 0xA0000008; - static const uint32_t PEEK64 = 0xA0000009; - static const uint32_t PEEK32 = 0xA000000A; - static const uint32_t PEEK16 = 0xA000000B; - static const uint32_t PEEK8 = 0xA000000C; - static const uint32_t READ_BLOCK = 0xA000000D; - static const uint32_t WRITE_BLOCK = 0xA000000E; - static const uint32_t GET_IO_WINDOW = 0xA000000F; - static const uint32_t GET_IO_WINDOW_SIZE = 0xA0000010; - }; - - struct nirio_syncop_in_params_t - { - uint32_t function; - uint32_t subfunction; - - union - { - struct - { - uint32_t attribute; - uint32_t value; - } attribute32; - - struct - { - uint32_t attribute; - uint64_t value; - } attribute64; - - struct - { - uint32_t attribute; - } attributeStr; - - struct - { - uint32_t attribute; - } download; - - union - { - struct - { - uint32_t reserved_field_0_0_0; - } reserved_field_0_0; - struct - { - uint32_t reserved_field_0_1_0; - uint32_t reserved_field_0_1_1; - } reserved_field_0_1; - struct - { - uint32_t reserved_field_0_2_0; - } reserved_field_0_2; - } reserved_field_0; - - union - { - struct - { - uint32_t channel; - uint32_t baseAddress; - uint32_t depthInSamples; - uint32_t version; - } fifo; - struct - { - uint32_t channel; - uint32_t baseAddress; - uint32_t depthInSamples; - uint32_t version; - uint32_t scalarType; - uint32_t bitWidth; - } fifoWithDataType; - struct - { - uint64_t rangeBaseAddress; - uint32_t rangeSizeInBytes; - uint32_t rangeAttribute; - } atomic; // obsolete - } add; - - struct - { - uint32_t channel; - - union - { - struct - { - uint32_t requestedDepth; - uint8_t requiresActuals; - } config; - struct - { - uint32_t timeout; - } read; - struct - { - uint32_t timeout; - uint32_t scalarType; - uint32_t bitWidth; - } readWithDataType; - struct - { - uint32_t timeout; - } write; - struct - { - uint32_t timeout; - uint32_t scalarType; - uint32_t bitWidth; - } writeWithDataType; - struct - { - uint32_t elementsRequested; - uint32_t scalarType; - uint32_t bitWidth; - uint32_t timeout; - uint8_t output; - } wait; - struct - { - uint32_t elements; - } grant; - } op; - } fifo; - - struct - { - uint64_t reserved_field_1_0; - uint32_t reserved_field_1_1; - uint32_t reserved_field_1_2; - } reserved_field_1; // Obsolete - - struct - { - uint32_t offset; - union - { - uint64_t value64; - uint32_t value32; - uint16_t value16; - uint8_t value8; - } value; - union - { - uint32_t sizeToMap; - } memoryMappedIoWindow; - } io; - - struct - { - uint32_t reserved_field_2_0; - uint32_t reserved_field_2_1; - } reserved_field_2; - - struct - { - uint32_t reserved_field_3_0; - } reserved_field_3; - - union - { - struct - { - uint32_t reserved_field_4_0; - int32_t reserved_field_4_1; - } wait; - } reserved_field_4; - - } params; - - uint32_t inbufByteLen; - - union - { - const void* pointer; - uint64_t _64BitField; - } inbuf; - }; - - static inline void init_syncop_in_params(nirio_syncop_in_params_t& param, const void* const buf, const uint32_t len) - { - param.inbuf._64BitField = 0; - param.inbuf.pointer = buf; - param.inbufByteLen = len; - } - - - struct nirio_syncop_out_params_t - { - union - { - struct - { - uint32_t value; - } attribute32; - - struct - { - uint64_t value; - } attribute64; - - union - { - struct - { - uint32_t reserved_field_0_0; - } enable; - } reserved_field_0; - - struct - { - union - { - struct - { - uint32_t actualDepth; - uint32_t actualSize; - } config; - struct - { - uint32_t numberRead; - uint32_t numberRemaining; - } read; - struct - { - uint32_t numberRemaining; - } write; - struct - { - union - { - void* pointer; - uint64_t _64BitField; - } elements; - } wait; - } op; - } fifo; - - struct - { - union - { - union - { - uint64_t value64; - uint32_t value32; - uint16_t value16; - uint8_t value8; - } value; - union - { - void* memoryMappedAddress; - uint64_t _64BitField; - } memoryMappedIoWindow; - union - { - uint32_t size; - } memoryMappedIoWindowSize; - }; - } io; - - uint32_t stringLength; - - struct - { - uint32_t reserved_field_1_0; - } reserved_field_1; - - } params; - - uint32_t outbufByteLen; - - union - { - void* pointer; - uint64_t _64BitField; - } outbuf; - }; - - - static inline void init_syncop_out_params(nirio_syncop_out_params_t& param, void* buf, uint32_t len) - { - param.outbuf._64BitField = 0; - param.outbuf.pointer = buf; - param.outbufByteLen = len; - } - niriok_proxy_impl_v1(); virtual ~niriok_proxy_impl_v1(); @@ -377,9 +44,6 @@ namespace uhd { namespace niusrprio virtual nirio_status reset(); - virtual nirio_status get_cached_session( - uint32_t& session); - virtual nirio_status get_version( nirio_version_t type, uint32_t& major, @@ -477,7 +141,6 @@ namespace uhd { namespace niusrprio size_t writeBufferLength, void *readBuffer, size_t readBufferLength); - }; }} diff --git a/host/include/uhd/transport/nirio/niriok_proxy_impl_v2.h b/host/include/uhd/transport/nirio/niriok_proxy_impl_v2.h index 333ab4348..c0183502a 100644 --- a/host/include/uhd/transport/nirio/niriok_proxy_impl_v2.h +++ b/host/include/uhd/transport/nirio/niriok_proxy_impl_v2.h @@ -24,12 +24,6 @@ #include #include -#if __GNUC__ - typedef uint64_t tAlignedU64 __attribute__ ((aligned(8))); -#else - typedef uint64_t tAlignedU64; -#endif - namespace uhd { namespace niusrprio { /* @@ -39,267 +33,8 @@ namespace uhd { namespace niusrprio are not compatible with NI-RIO versions older than 14.0. */ - #define IOCTL(type, function, access) \ - CTL_CODE((0x8000+type), (0x800+function), METHOD_BUFFERED, access) - - #define IOCTL_ACCESS_ANY (FILE_ANY_ACCESS) - #define IOCTL_ACCESS_READ (FILE_READ_ACCESS) - #define IOCTL_ACCESS_WRITE (FILE_WRITE_ACCESS) - #define IOCTL_ACCESS_RW (FILE_READ_ACCESS | FILE_WRITE_ACCESS) - - #define IOCTL_TRANSPORT_GET32 IOCTL(0, 0, IOCTL_ACCESS_READ) - #define IOCTL_TRANSPORT_SET32 IOCTL(0, 1, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_GET_STRING IOCTL(0, 2, IOCTL_ACCESS_READ) - #define IOCTL_TRANSPORT_SET_STRING IOCTL(0, 3, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_RESET IOCTL(1, 1, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_ADD_INPUT_FIFO_RESOURCE IOCTL(2, 0, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_ADD_OUTPUT_FIFO_RESOURCE IOCTL(2, 1, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_SET_DEVICE_CONFIG IOCTL(2, 3, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_FIFO_CONFIG IOCTL(4, 0, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_FIFO_START IOCTL(4, 1, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_FIFO_STOP IOCTL(4, 2, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_FIFO_READ IOCTL(4, 3, IOCTL_ACCESS_READ) - #define IOCTL_TRANSPORT_FIFO_WRITE IOCTL(4, 4, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_FIFO_WAIT IOCTL(4, 5, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_FIFO_GRANT IOCTL(4, 6, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_FIFO_STOP_ALL IOCTL(4, 7, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_PEEK64 IOCTL(5, 2, IOCTL_ACCESS_READ) - #define IOCTL_TRANSPORT_PEEK32 IOCTL(5, 3, IOCTL_ACCESS_READ) - #define IOCTL_TRANSPORT_POKE64 IOCTL(5, 6, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_POKE32 IOCTL(5, 7, IOCTL_ACCESS_WRITE) - #define IOCTL_TRANSPORT_POST_OPEN IOCTL(8, 0, IOCTL_ACCESS_ANY) - #define IOCTL_TRANSPORT_PRE_CLOSE IOCTL(8, 1, IOCTL_ACCESS_ANY) - - typedef struct { - nirio_scalar_type_t scalarType; - nirio_u32_t bitWidth; - nirio_i32_t integerWordLength; - } nirio_fifo_data_type_t; - class UHD_API niriok_proxy_impl_v2 : virtual public niriok_proxy { public: - typedef struct in_transport_get32 - { - nirio_device_attribute32_t attribute; - int32_t status; - } in_transport_get32_t; - typedef struct out_transport_get32 - { - uint32_t retVal__; - int32_t status; - } out_transport_get32_t; - typedef struct in_transport_set32 - { - nirio_device_attribute32_t attribute; - uint32_t value; - int32_t status; - } in_transport_set32_t; - typedef struct out_transport_set32 - { - int32_t status; - } out_transport_set32_t; - typedef struct out_transport_get_string - { - uint32_t stringLen; - int32_t status; - } out_transport_get_string_t; - typedef struct out_transport_set_string - { - int32_t status; - } out_transport_set_string_t; - typedef struct in_transport_reset - { - int32_t status; - } in_transport_reset_t; - typedef struct out_transport_reset - { - int32_t status; - } out_transport_reset_t; - typedef struct in_transport_add_input_fifo_resource - { - uint32_t channel; - uint32_t baseAddress; - uint32_t depthInSamples; - nirio_fifo_data_type_t dataType; - uint32_t version; - int32_t status; - } in_transport_add_input_fifo_resource_t; - typedef struct out_transport_addInputFifo_resource - { - int32_t status; - } out_transport_add_input_fifo_resource_t; - typedef struct in_transport_addOutputFifo_resource - { - uint32_t channel; - uint32_t baseAddress; - uint32_t depthInSamples; - nirio_fifo_data_type_t dataType; - uint32_t version; - int32_t status; - } in_transport_add_output_fifo_resource_t; - typedef struct out_transport_addOutputFifo_resource - { - int32_t status; - } out_transport_add_output_fifo_resource_t; - typedef struct in_transport_setDevice_config - { - uint32_t attribute; - int32_t status; - } in_transport_set_device_config_t; - typedef struct out_transport_setDevice_config - { - int32_t status; - } out_transport_set_device_config_t; - typedef struct in_transport_fifo_config - { - uint32_t channel; - tAlignedU64 requestedDepth; - int32_t status; - } in_transport_fifo_config_t; - typedef struct out_transport_fifo_config - { - tAlignedU64 actualDepth; - tAlignedU64 actualSize; - int32_t status; - } out_transport_fifo_config_t; - typedef struct in_transport_fifo_start - { - uint32_t channel; - int32_t status; - } in_transport_fifo_start_t; - typedef struct out_transport_fifo_start - { - int32_t status; - } out_transport_fifo_start_t; - typedef struct in_transport_fifo_stop - { - uint32_t channel; - int32_t status; - } in_transport_fifo_stop_t; - typedef struct out_transport_fifo_stop - { - int32_t status; - } out_transport_fifo_stop_t; - typedef struct in_transport_fifo_read - { - uint32_t channel; - tAlignedU64 buf; - uint32_t numberElements; - nirio_fifo_data_type_t dataType; - uint32_t timeout; - int32_t status; - } in_transport_fifo_read_t; - typedef struct out_transport_fifo_read - { - uint32_t read; - uint32_t remaining; - int32_t status; - } out_transport_fifo_read_t; - typedef struct in_transport_fifo_write - { - uint32_t channel; - tAlignedU64 buf; - uint32_t numberElements; - nirio_fifo_data_type_t dataType; - uint32_t timeout; - int32_t status; - } in_transport_fifo_write_t; - typedef struct out_transport_fifo_write - { - uint32_t remaining; - int32_t status; - } out_transport_fifo_write_t; - typedef struct in_transport_fifo_wait - { - uint32_t channel; - tAlignedU64 elementsRequested; - nirio_fifo_data_type_t dataType; - bool output; - uint32_t timeout; - int32_t status; - } in_transport_fifo_wait_t; - typedef struct out_transport_fifo_wait - { - tAlignedU64 elements; - tAlignedU64 elementsAcquired; - tAlignedU64 elementsRemaining; - int32_t status; - } out_transport_fifo_wait_t; - typedef struct in_transport_fifo_grant - { - uint32_t channel; - tAlignedU64 elements; - int32_t status; - } in_transport_fifo_grant_t; - typedef struct out_transport_fifo_grant - { - int32_t status; - } out_transport_fifo_grant_t; - typedef struct in_transport_fifoStop_all - { - int32_t status; - } in_transport_fifo_stop_all_t; - typedef struct out_transport_fifoStop_all - { - int32_t status; - } out_transport_fifo_stop_all_t; - typedef struct in_transport_peek64 - { - uint32_t offset; - int32_t status; - } in_transport_peek64_t; - typedef struct out_transport_peek64 - { - tAlignedU64 retVal__; - int32_t status; - } out_transport_peek64_t; - typedef struct in_transport_peek32 - { - uint32_t offset; - int32_t status; - } in_transport_peek32_t; - typedef struct out_transport_peek32 - { - uint32_t retVal__; - int32_t status; - } out_transport_peek32_t; - typedef struct in_transport_poke64 - { - uint32_t offset; - tAlignedU64 value; - int32_t status; - } in_transport_poke64_t; - typedef struct out_transport_poke64 - { - int32_t status; - } out_transport_poke64_t; - typedef struct in_transport_poke32 - { - uint32_t offset; - uint32_t value; - int32_t status; - } in_transport_poke32_t; - typedef struct out_transport_poke32 - { - int32_t status; - } out_transport_poke32_t; - typedef struct in_transport_post_open - { - int32_t status; - } in_transport_post_open_t; - typedef struct out_transport_post_open - { - int32_t status; - } out_transport_post_open_t; - typedef struct in_transport_pre_close - { - int32_t status; - } in_transport_pre_close_t; - typedef struct out_transport_pre_close - { - int32_t status; - } out_transport_pre_close_t; - niriok_proxy_impl_v2(); virtual ~niriok_proxy_impl_v2(); @@ -309,9 +44,6 @@ namespace uhd { namespace niusrprio virtual nirio_status reset(); - virtual nirio_status get_cached_session( - uint32_t& session); - virtual nirio_status get_version( nirio_version_t type, uint32_t& major, @@ -402,7 +134,6 @@ namespace uhd { namespace niusrprio protected: // protected close function that doesn't acquire synchronization lock virtual void _close(); - }; }} diff --git a/host/lib/transport/nirio/nirio_driver_iface_linux.cpp b/host/lib/transport/nirio/nirio_driver_iface_linux.cpp index 4afc1579f..4d983de17 100644 --- a/host/lib/transport/nirio/nirio_driver_iface_linux.cpp +++ b/host/lib/transport/nirio/nirio_driver_iface_linux.cpp @@ -25,16 +25,6 @@ namespace nirio_driver_iface { -struct nirio_ioctl_block_t -{ - uint64_t in_buf; - uint64_t out_buf; - uint32_t in_buf_len; - uint32_t out_buf_len; - uint32_t bytes_returned; - uint32_t padding; -}; - nirio_status rio_open( const std::string& device_path, rio_dev_handle_t& device_handle) diff --git a/host/lib/transport/nirio/niriok_proxy_impl_v1.cpp b/host/lib/transport/nirio/niriok_proxy_impl_v1.cpp index f0ffe2ffc..444e98f1b 100644 --- a/host/lib/transport/nirio/niriok_proxy_impl_v1.cpp +++ b/host/lib/transport/nirio/niriok_proxy_impl_v1.cpp @@ -26,8 +26,397 @@ #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif +// CTL_CODE macro for non-win OSes +#ifndef UHD_PLATFORM_WIN32 + #define CTL_CODE(a,controlCode,b,c) (controlCode) +#endif + +const uint32_t NIRIO_IOCTL_BASE = 0x800; + +const uint32_t NIRIO_IOCTL_SYNCOP = + CTL_CODE(FILE_DEVICE_UNKNOWN, + NIRIO_IOCTL_BASE + 4, + METHOD_OUT_DIRECT, + FILE_READ_DATA | FILE_WRITE_DATA); + ///< The synchronous operation code. Note: We + /// must use METHOD_OUT_DIRECT on the syncOp() + /// IOCTL to ensure the contents of the output + /// block are available in the kernel. + +const uint32_t NIRIO_IOCTL_GET_IFACE_NUM = + CTL_CODE(FILE_DEVICE_UNKNOWN, + NIRIO_IOCTL_BASE + 6, + METHOD_BUFFERED, + FILE_READ_DATA); ///< Get the interface number for a device + +const uint32_t NIRIO_IOCTL_GET_SESSION = + CTL_CODE(FILE_DEVICE_UNKNOWN, + NIRIO_IOCTL_BASE + 8, + METHOD_BUFFERED, + FILE_READ_ACCESS); ///< Gets a previously opened session to a device + +const uint32_t NIRIO_IOCTL_POST_OPEN = + CTL_CODE(FILE_DEVICE_UNKNOWN, + NIRIO_IOCTL_BASE + 9, + METHOD_BUFFERED, + FILE_READ_ACCESS); ///< Called after opening a session + +const uint32_t NIRIO_IOCTL_PRE_CLOSE = + CTL_CODE(FILE_DEVICE_UNKNOWN, + NIRIO_IOCTL_BASE + 10, + METHOD_BUFFERED, + FILE_READ_ACCESS); ///< Called before closing a session + namespace uhd { namespace niusrprio { + // ------------------------------- + // Function Codes: defined as integers rather than enums because they + // are going to be carried accross boundaries so size matters + + struct NIRIO_FUNC + { + static const uint32_t GET32 = 0x00000001; + static const uint32_t SET32 = 0x00000002; + static const uint32_t SET_DRIVER_CONFIG = 0x00000007; + static const uint32_t FIFO = 0x00000008; + static const uint32_t IO = 0x0000000A; + static const uint32_t FIFO_STOP_ALL = 0x0000000C; + static const uint32_t ADD_RESOURCE = 0x0000000D; + static const uint32_t GET_STRING = 0x0000000E; + static const uint32_t SET_STRING = 0x0000000F; + static const uint32_t DOWNLOAD = 0x00000013; + static const uint32_t RESET = 0x00000014; + }; + + struct NIRIO_RESOURCE + { + static const uint32_t INPUT_FIFO = 0xD0000001; + static const uint32_t OUTPUT_FIFO = 0xD0000002; + }; + + struct NIRIO_FIFO + { + static const uint32_t CONFIGURE = 0x80000001; + static const uint32_t START = 0x80000002; + static const uint32_t STOP = 0x80000003; + static const uint32_t READ = 0x80000004; + static const uint32_t WRITE = 0x80000005; + static const uint32_t WAIT = 0x80000006; + static const uint32_t GRANT = 0x80000007; + }; + + struct NIRIO_IO + { + static const uint32_t POKE64 = 0xA0000005; + static const uint32_t POKE32 = 0xA0000006; + static const uint32_t POKE16 = 0xA0000007; + static const uint32_t POKE8 = 0xA0000008; + static const uint32_t PEEK64 = 0xA0000009; + static const uint32_t PEEK32 = 0xA000000A; + static const uint32_t PEEK16 = 0xA000000B; + static const uint32_t PEEK8 = 0xA000000C; + static const uint32_t READ_BLOCK = 0xA000000D; + static const uint32_t WRITE_BLOCK = 0xA000000E; + static const uint32_t GET_IO_WINDOW = 0xA000000F; + static const uint32_t GET_IO_WINDOW_SIZE = 0xA0000010; + }; + + struct nirio_ioctl_packet_t { + nirio_ioctl_packet_t(void* const _outBuf, const uint32_t _outSize, const int32_t _statusCode) + { + outBuf._64BitField = 0; + outBuf.pointer = _outBuf; + outSize = _outSize; + statusCode = _statusCode; + }; + + union { + void* pointer; + uint64_t _64BitField; + } outBuf; + + uint32_t outSize; + int32_t statusCode; + }; + + struct nirio_syncop_in_params_t + { + uint32_t function; + uint32_t subfunction; + + union + { + struct + { + uint32_t attribute; + uint32_t value; + } attribute32; + + struct + { + uint32_t attribute; + uint64_t value; + } attribute64; + + struct + { + uint32_t attribute; + } attributeStr; + + struct + { + uint32_t attribute; + } download; + + union + { + struct + { + uint32_t reserved_field_0_0_0; + } reserved_field_0_0; + struct + { + uint32_t reserved_field_0_1_0; + uint32_t reserved_field_0_1_1; + } reserved_field_0_1; + struct + { + uint32_t reserved_field_0_2_0; + } reserved_field_0_2; + } reserved_field_0; + + union + { + struct + { + uint32_t channel; + uint32_t baseAddress; + uint32_t depthInSamples; + uint32_t version; + } fifo; + struct + { + uint32_t channel; + uint32_t baseAddress; + uint32_t depthInSamples; + uint32_t version; + uint32_t scalarType; + uint32_t bitWidth; + } fifoWithDataType; + struct + { + uint64_t rangeBaseAddress; + uint32_t rangeSizeInBytes; + uint32_t rangeAttribute; + } atomic; // obsolete + } add; + + struct + { + uint32_t channel; + + union + { + struct + { + uint32_t requestedDepth; + uint8_t requiresActuals; + } config; + struct + { + uint32_t timeout; + } read; + struct + { + uint32_t timeout; + uint32_t scalarType; + uint32_t bitWidth; + } readWithDataType; + struct + { + uint32_t timeout; + } write; + struct + { + uint32_t timeout; + uint32_t scalarType; + uint32_t bitWidth; + } writeWithDataType; + struct + { + uint32_t elementsRequested; + uint32_t scalarType; + uint32_t bitWidth; + uint32_t timeout; + uint8_t output; + } wait; + struct + { + uint32_t elements; + } grant; + } op; + } fifo; + + struct + { + uint64_t reserved_field_1_0; + uint32_t reserved_field_1_1; + uint32_t reserved_field_1_2; + } reserved_field_1; // Obsolete + + struct + { + uint32_t offset; + union + { + uint64_t value64; + uint32_t value32; + uint16_t value16; + uint8_t value8; + } value; + union + { + uint32_t sizeToMap; + } memoryMappedIoWindow; + } io; + + struct + { + uint32_t reserved_field_2_0; + uint32_t reserved_field_2_1; + } reserved_field_2; + + struct + { + uint32_t reserved_field_3_0; + } reserved_field_3; + + union + { + struct + { + uint32_t reserved_field_4_0; + int32_t reserved_field_4_1; + } wait; + } reserved_field_4; + + } params; + + uint32_t inbufByteLen; + + union + { + const void* pointer; + uint64_t _64BitField; + } inbuf; + }; + + static inline void init_syncop_in_params(nirio_syncop_in_params_t& param, const void* const buf, const uint32_t len) + { + param.inbuf._64BitField = 0; + param.inbuf.pointer = buf; + param.inbufByteLen = len; + } + + struct nirio_syncop_out_params_t + { + union + { + struct + { + uint32_t value; + } attribute32; + + struct + { + uint64_t value; + } attribute64; + + union + { + struct + { + uint32_t reserved_field_0_0; + } enable; + } reserved_field_0; + + struct + { + union + { + struct + { + uint32_t actualDepth; + uint32_t actualSize; + } config; + struct + { + uint32_t numberRead; + uint32_t numberRemaining; + } read; + struct + { + uint32_t numberRemaining; + } write; + struct + { + union + { + void* pointer; + uint64_t _64BitField; + } elements; + } wait; + } op; + } fifo; + + struct + { + union + { + union + { + uint64_t value64; + uint32_t value32; + uint16_t value16; + uint8_t value8; + } value; + union + { + void* memoryMappedAddress; + uint64_t _64BitField; + } memoryMappedIoWindow; + union + { + uint32_t size; + } memoryMappedIoWindowSize; + }; + } io; + + uint32_t stringLength; + + struct + { + uint32_t reserved_field_1_0; + } reserved_field_1; + + } params; + + uint32_t outbufByteLen; + + union + { + void* pointer; + uint64_t _64BitField; + } outbuf; + }; + + static inline void init_syncop_out_params(nirio_syncop_out_params_t& param, void* buf, uint32_t len) + { + param.outbuf._64BitField = 0; + param.outbuf.pointer = buf; + param.outbufByteLen = len; + } + //------------------------------------------------------- // niriok_proxy_impl_v1 //------------------------------------------------------- @@ -55,11 +444,11 @@ namespace uhd { namespace niusrprio interface_path, _device_handle), status); if (nirio_status_not_fatal(status)) { nirio_status_chain(nirio_driver_iface::rio_ioctl(_device_handle, - nirio_driver_iface::NIRIO_IOCTL_POST_OPEN, + NIRIO_IOCTL_POST_OPEN, NULL, 0, NULL, 0), status); nirio_ioctl_packet_t out(&_interface_num, sizeof(_interface_num), 0); nirio_status_chain(nirio_driver_iface::rio_ioctl(_device_handle, - nirio_driver_iface::NIRIO_IOCTL_GET_IFACE_NUM, + NIRIO_IOCTL_GET_IFACE_NUM, NULL, 0, &out, sizeof(out)), status); @@ -83,7 +472,7 @@ namespace uhd { namespace niusrprio if(nirio_driver_iface::rio_isopen(_device_handle)) { nirio_driver_iface::rio_ioctl( - _device_handle, nirio_driver_iface::NIRIO_IOCTL_PRE_CLOSE, NULL, 0, NULL, 0); + _device_handle, NIRIO_IOCTL_PRE_CLOSE, NULL, 0, NULL, 0); nirio_driver_iface::rio_close(_device_handle); } } @@ -100,18 +489,6 @@ namespace uhd { namespace niusrprio return sync_operation(&in, sizeof(in), &out, sizeof(out)); } - nirio_status niriok_proxy_impl_v1::get_cached_session( - uint32_t& session) - { - READER_LOCK - - nirio_ioctl_packet_t out(&session, sizeof(session), 0); - return nirio_driver_iface::rio_ioctl(_device_handle, - nirio_driver_iface::NIRIO_IOCTL_GET_SESSION, - NULL, 0, - &out, sizeof(out)); - } - nirio_status niriok_proxy_impl_v1::get_version( nirio_version_t type, uint32_t& major, @@ -150,7 +527,7 @@ namespace uhd { namespace niusrprio nirio_ioctl_packet_t out(readBuffer, readBufferLength, 0); nirio_status ioctl_status = nirio_driver_iface::rio_ioctl(_device_handle, - nirio_driver_iface::NIRIO_IOCTL_SYNCOP, + NIRIO_IOCTL_SYNCOP, writeBuffer, writeBufferLength, &out, sizeof(out)); if (nirio_status_fatal(ioctl_status)) return ioctl_status; @@ -282,14 +659,14 @@ namespace uhd { namespace niusrprio nirio_status niriok_proxy_impl_v1::add_fifo_resource(const nirio_fifo_info_t& fifo_info) { - niriok_proxy_impl_v1::nirio_syncop_in_params_t in = {}; - niriok_proxy_impl_v1::nirio_syncop_out_params_t out = {}; + nirio_syncop_in_params_t in = {}; + nirio_syncop_out_params_t out = {}; - in.function = niriok_proxy_impl_v1::NIRIO_FUNC::ADD_RESOURCE; + in.function = NIRIO_FUNC::ADD_RESOURCE; if (fifo_info.direction == OUTPUT_FIFO) - in.subfunction = niriok_proxy_impl_v1::NIRIO_RESOURCE::OUTPUT_FIFO; + in.subfunction = NIRIO_RESOURCE::OUTPUT_FIFO; else - in.subfunction = niriok_proxy_impl_v1::NIRIO_RESOURCE::INPUT_FIFO; + in.subfunction = NIRIO_RESOURCE::INPUT_FIFO; in.params.add.fifoWithDataType.channel = fifo_info.channel; in.params.add.fifoWithDataType.baseAddress = fifo_info.base_addr; @@ -307,7 +684,7 @@ namespace uhd { namespace niusrprio nirio_syncop_in_params_t in = {}; nirio_syncop_out_params_t out = {}; - in.function = niriok_proxy_impl_v1::NIRIO_FUNC::SET_DRIVER_CONFIG; + in.function = NIRIO_FUNC::SET_DRIVER_CONFIG; in.subfunction = 0; return sync_operation(&in, sizeof(in), &out, sizeof(out)); diff --git a/host/lib/transport/nirio/niriok_proxy_impl_v2.cpp b/host/lib/transport/nirio/niriok_proxy_impl_v2.cpp index 748db5cf8..f75de01e1 100644 --- a/host/lib/transport/nirio/niriok_proxy_impl_v2.cpp +++ b/host/lib/transport/nirio/niriok_proxy_impl_v2.cpp @@ -27,8 +27,262 @@ #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif +#define IOCTL_TRANSPORT_GET32 IOCTL(0, 0, IOCTL_ACCESS_READ) +#define IOCTL_TRANSPORT_SET32 IOCTL(0, 1, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_GET_STRING IOCTL(0, 2, IOCTL_ACCESS_READ) +#define IOCTL_TRANSPORT_SET_STRING IOCTL(0, 3, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_RESET IOCTL(1, 1, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_ADD_INPUT_FIFO_RESOURCE IOCTL(2, 0, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_ADD_OUTPUT_FIFO_RESOURCE IOCTL(2, 1, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_SET_DEVICE_CONFIG IOCTL(2, 3, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_FIFO_CONFIG IOCTL(4, 0, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_FIFO_START IOCTL(4, 1, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_FIFO_STOP IOCTL(4, 2, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_FIFO_READ IOCTL(4, 3, IOCTL_ACCESS_READ) +#define IOCTL_TRANSPORT_FIFO_WRITE IOCTL(4, 4, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_FIFO_WAIT IOCTL(4, 5, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_FIFO_GRANT IOCTL(4, 6, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_FIFO_STOP_ALL IOCTL(4, 7, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_PEEK64 IOCTL(5, 2, IOCTL_ACCESS_READ) +#define IOCTL_TRANSPORT_PEEK32 IOCTL(5, 3, IOCTL_ACCESS_READ) +#define IOCTL_TRANSPORT_POKE64 IOCTL(5, 6, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_POKE32 IOCTL(5, 7, IOCTL_ACCESS_WRITE) +#define IOCTL_TRANSPORT_POST_OPEN IOCTL(8, 0, IOCTL_ACCESS_ANY) +#define IOCTL_TRANSPORT_PRE_CLOSE IOCTL(8, 1, IOCTL_ACCESS_ANY) + namespace uhd { namespace niusrprio { + //------------------------------------------------------- + // ioctl param typedefs + //------------------------------------------------------- + typedef struct { + nirio_scalar_type_t scalarType; + nirio_u32_t bitWidth; + nirio_i32_t integerWordLength; + } nirio_fifo_data_type_t; + + typedef struct in_transport_get32 + { + nirio_device_attribute32_t attribute; + int32_t status; + } in_transport_get32_t; + typedef struct out_transport_get32 + { + uint32_t retVal__; + int32_t status; + } out_transport_get32_t; + typedef struct in_transport_set32 + { + nirio_device_attribute32_t attribute; + uint32_t value; + int32_t status; + } in_transport_set32_t; + typedef struct out_transport_set32 + { + int32_t status; + } out_transport_set32_t; + typedef struct out_transport_get_string + { + uint32_t stringLen; + int32_t status; + } out_transport_get_string_t; + typedef struct out_transport_set_string + { + int32_t status; + } out_transport_set_string_t; + typedef struct in_transport_reset + { + int32_t status; + } in_transport_reset_t; + typedef struct out_transport_reset + { + int32_t status; + } out_transport_reset_t; + typedef struct in_transport_add_input_fifo_resource + { + uint32_t channel; + uint32_t baseAddress; + uint32_t depthInSamples; + nirio_fifo_data_type_t dataType; + uint32_t version; + int32_t status; + } in_transport_add_input_fifo_resource_t; + typedef struct out_transport_addInputFifo_resource + { + int32_t status; + } out_transport_add_input_fifo_resource_t; + typedef struct in_transport_addOutputFifo_resource + { + uint32_t channel; + uint32_t baseAddress; + uint32_t depthInSamples; + nirio_fifo_data_type_t dataType; + uint32_t version; + int32_t status; + } in_transport_add_output_fifo_resource_t; + typedef struct out_transport_addOutputFifo_resource + { + int32_t status; + } out_transport_add_output_fifo_resource_t; + typedef struct in_transport_setDevice_config + { + uint32_t attribute; + int32_t status; + } in_transport_set_device_config_t; + typedef struct out_transport_setDevice_config + { + int32_t status; + } out_transport_set_device_config_t; + typedef struct in_transport_fifo_config + { + uint32_t channel; + aligned_uint64_t requestedDepth; + int32_t status; + } in_transport_fifo_config_t; + typedef struct out_transport_fifo_config + { + aligned_uint64_t actualDepth; + aligned_uint64_t actualSize; + int32_t status; + } out_transport_fifo_config_t; + typedef struct in_transport_fifo_start + { + uint32_t channel; + int32_t status; + } in_transport_fifo_start_t; + typedef struct out_transport_fifo_start + { + int32_t status; + } out_transport_fifo_start_t; + typedef struct in_transport_fifo_stop + { + uint32_t channel; + int32_t status; + } in_transport_fifo_stop_t; + typedef struct out_transport_fifo_stop + { + int32_t status; + } out_transport_fifo_stop_t; + typedef struct in_transport_fifo_read + { + uint32_t channel; + aligned_uint64_t buf; + uint32_t numberElements; + nirio_fifo_data_type_t dataType; + uint32_t timeout; + int32_t status; + } in_transport_fifo_read_t; + typedef struct out_transport_fifo_read + { + uint32_t read; + uint32_t remaining; + int32_t status; + } out_transport_fifo_read_t; + typedef struct in_transport_fifo_write + { + uint32_t channel; + aligned_uint64_t buf; + uint32_t numberElements; + nirio_fifo_data_type_t dataType; + uint32_t timeout; + int32_t status; + } in_transport_fifo_write_t; + typedef struct out_transport_fifo_write + { + uint32_t remaining; + int32_t status; + } out_transport_fifo_write_t; + typedef struct in_transport_fifo_wait + { + uint32_t channel; + aligned_uint64_t elementsRequested; + nirio_fifo_data_type_t dataType; + bool output; + uint32_t timeout; + int32_t status; + } in_transport_fifo_wait_t; + typedef struct out_transport_fifo_wait + { + aligned_uint64_t elements; + aligned_uint64_t elementsAcquired; + aligned_uint64_t elementsRemaining; + int32_t status; + } out_transport_fifo_wait_t; + typedef struct in_transport_fifo_grant + { + uint32_t channel; + aligned_uint64_t elements; + int32_t status; + } in_transport_fifo_grant_t; + typedef struct out_transport_fifo_grant + { + int32_t status; + } out_transport_fifo_grant_t; + typedef struct in_transport_fifoStop_all + { + int32_t status; + } in_transport_fifo_stop_all_t; + typedef struct out_transport_fifoStop_all + { + int32_t status; + } out_transport_fifo_stop_all_t; + typedef struct in_transport_peek64 + { + uint32_t offset; + int32_t status; + } in_transport_peek64_t; + typedef struct out_transport_peek64 + { + aligned_uint64_t retVal__; + int32_t status; + } out_transport_peek64_t; + typedef struct in_transport_peek32 + { + uint32_t offset; + int32_t status; + } in_transport_peek32_t; + typedef struct out_transport_peek32 + { + uint32_t retVal__; + int32_t status; + } out_transport_peek32_t; + typedef struct in_transport_poke64 + { + uint32_t offset; + aligned_uint64_t value; + int32_t status; + } in_transport_poke64_t; + typedef struct out_transport_poke64 + { + int32_t status; + } out_transport_poke64_t; + typedef struct in_transport_poke32 + { + uint32_t offset; + uint32_t value; + int32_t status; + } in_transport_poke32_t; + typedef struct out_transport_poke32 + { + int32_t status; + } out_transport_poke32_t; + typedef struct in_transport_post_open + { + int32_t status; + } in_transport_post_open_t; + typedef struct out_transport_post_open + { + int32_t status; + } out_transport_post_open_t; + typedef struct in_transport_pre_close + { + int32_t status; + } in_transport_pre_close_t; + typedef struct out_transport_pre_close + { + int32_t status; + } out_transport_pre_close_t; + //------------------------------------------------------- // niriok_proxy_impl_v2 //------------------------------------------------------- @@ -110,18 +364,6 @@ namespace uhd { namespace niusrprio return out.status; } - nirio_status niriok_proxy_impl_v2::get_cached_session( - uint32_t& session) - { - READER_LOCK - - nirio_ioctl_packet_t out(&session, sizeof(session), 0); - return nirio_driver_iface::rio_ioctl(_device_handle, - nirio_driver_iface::NIRIO_IOCTL_GET_SESSION, - NULL, 0, - &out, sizeof(out)); - } - nirio_status niriok_proxy_impl_v2::get_version( nirio_version_t type, uint32_t& major, @@ -580,7 +822,7 @@ namespace uhd { namespace niusrprio out_transport_fifo_read_t out = {}; in.channel = channel; - in.buf = reinterpret_cast(buffer); + in.buf = reinterpret_cast(buffer); in.numberElements = elements_to_read; in.dataType.scalarType = map_int_to_scalar_type(scalar_type); in.dataType.bitWidth = bit_width; @@ -620,7 +862,7 @@ namespace uhd { namespace niusrprio out_transport_fifo_write_t out = {}; in.channel = channel; - in.buf = reinterpret_cast(buffer); + in.buf = reinterpret_cast(buffer); in.numberElements = elements_to_write; in.dataType.scalarType = map_int_to_scalar_type(scalar_type); in.dataType.bitWidth = bit_width; -- cgit v1.2.3