255 lines
9.0 KiB
C
255 lines
9.0 KiB
C
|
/* SPDX-License-Identifier: MIT */
|
||
|
/**
|
||
|
@file ntv2linuxpublicinterface.h
|
||
|
@brief Types and defines shared between NTV2 user application interface and Linux device driver.
|
||
|
@copyright (C) 2004-2021 AJA Video Systems, Inc.
|
||
|
**/
|
||
|
#ifndef NTV2LINUXPUBLICINTERFACE_H
|
||
|
#define NTV2LINUXPUBLICINTERFACE_H
|
||
|
|
||
|
#include "ajatypes.h"
|
||
|
#include "ntv2enums.h"
|
||
|
#include "ntv2publicinterface.h"
|
||
|
|
||
|
#define NTV2_DEVICE_TYPE 0xBB
|
||
|
|
||
|
#define NTV2_LINUX_DRIVER_VERSION NTV2DriverVersionEncodedBuildType | NTV2DriverVersionEncode(AJA_NTV2_SDK_VERSION_MAJOR, AJA_NTV2_SDK_VERSION_MINOR, AJA_NTV2_SDK_VERSION_POINT, AJA_NTV2_SDK_BUILD_NUMBER)
|
||
|
|
||
|
|
||
|
// Read,Write IOCTL's
|
||
|
// Input: REGISTER_ACCESS structure
|
||
|
// Output: NONE
|
||
|
#define IOCTL_NTV2_WRITE_REGISTER \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 48, REGISTER_ACCESS)
|
||
|
|
||
|
// Input: REGISTER_ACCESS structure
|
||
|
// Output: REGISTER_ACCESS structure
|
||
|
#define IOCTL_NTV2_READ_REGISTER \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 49 , REGISTER_ACCESS)
|
||
|
|
||
|
// DMA Ioctls use METHOD_IN_DIRECT ... thus special macro NTV2_MAKE_IN_DIRECT_IOCTL
|
||
|
#define IOCTL_NTV2_DMA_READ_FRAME \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 146,NTV2_DMA_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_WRITE_FRAME \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 147,NTV2_DMA_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_READ_FRAME_SEGMENT \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 148,NTV2_DMA_SEGMENT_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_WRITE_FRAME_SEGMENT \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 149,NTV2_DMA_SEGMENT_CONTROL_STRUCT)
|
||
|
|
||
|
// DMA Ioctls use METHOD_IN_DIRECT ... thus special macro NTV2_MAKE_IN_DIRECT_IOCTL
|
||
|
#define IOCTL_NTV2_DMA_READ \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 175,NTV2_DMA_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_WRITE \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 176,NTV2_DMA_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_READ_SEGMENT \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 177,NTV2_DMA_SEGMENT_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_WRITE_SEGMENT \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 178,NTV2_DMA_SEGMENT_CONTROL_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_DMA_P2P \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 179,NTV2_DMA_P2P_CONTROL_STRUCT)
|
||
|
|
||
|
|
||
|
// Interrupt control (enable, disable, get count)
|
||
|
//
|
||
|
#define IOCTL_NTV2_INTERRUPT_CONTROL \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 220, NTV2_INTERRUPT_CONTROL_STRUCT)
|
||
|
|
||
|
// Wait for interrupt
|
||
|
//
|
||
|
#define IOCTL_NTV2_WAITFOR_INTERRUPT \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 221, NTV2_WAITFOR_INTERRUPT_STRUCT)
|
||
|
|
||
|
// Control debug messages.
|
||
|
//
|
||
|
#define IOCTL_NTV2_CONTROL_DRIVER_DEBUG_MESSAGES \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 230, NTV2_CONTROL_DRIVER_DEBUG_MESSAGES_STRUCT)
|
||
|
|
||
|
// Put board interrupts and LEDs in known state
|
||
|
//
|
||
|
#define IOCTL_NTV2_SETUP_BOARD \
|
||
|
_IO(NTV2_DEVICE_TYPE, 231)
|
||
|
|
||
|
// Reload procamp hardware registers from software copy after ADC chip reset
|
||
|
#define IOCTL_NTV2_RESTORE_HARDWARE_PROCAMP_REGISTERS \
|
||
|
_IO(NTV2_DEVICE_TYPE, 232)
|
||
|
|
||
|
//
|
||
|
// Downloaded Xilinx bitfile management IOCTLs
|
||
|
//
|
||
|
//
|
||
|
#define IOCTL_NTV2_SET_BITFILE_INFO \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 240, BITFILE_INFO_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_GET_BITFILE_INFO \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 241, BITFILE_INFO_STRUCT)
|
||
|
|
||
|
//
|
||
|
// Autocirculate IOCTLs
|
||
|
//
|
||
|
//
|
||
|
#define IOCTL_NTV2_AUTOCIRCULATE_CONTROL \
|
||
|
_IOW(NTV2_DEVICE_TYPE, 250, AUTOCIRCULATE_DATA)
|
||
|
|
||
|
#define IOCTL_NTV2_AUTOCIRCULATE_STATUS \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 251, AUTOCIRCULATE_STATUS_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_AUTOCIRCULATE_FRAMESTAMP \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 252, AUTOCIRCULATE_FRAME_STAMP_COMBO_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_AUTOCIRCULATE_TRANSFER \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 253, AUTOCIRCULATE_TRANSFER_COMBO_STRUCT)
|
||
|
|
||
|
#define IOCTL_NTV2_AUTOCIRCULATE_CAPTURETASK \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 254, AUTOCIRCULATE_FRAME_STAMP_COMBO_STRUCT)
|
||
|
|
||
|
#define IOCTL_AJANTV2_MESSAGE \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 255, AUTOCIRCULATE_STATUS)
|
||
|
|
||
|
//
|
||
|
// UART Write/Read IOCTLs
|
||
|
//
|
||
|
#define IOCTL_NTV2_WRITE_UART_TX \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 201, NTV2_UART_STRUCT)
|
||
|
|
||
|
#if 0 /* not yet */
|
||
|
#define IOCTL_NTV2_READ_UART_RX \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 202, NTV2_UART_STRUCT)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// When adding new IOCTLs, note that the number is only 8 bits.
|
||
|
// So don't go above 255.
|
||
|
|
||
|
// Structure used to request an address range
|
||
|
typedef struct _MAP_MEMORY {
|
||
|
void* Address;
|
||
|
ULWord Length;
|
||
|
} MAP_MEMORY, *PMAP_MEMORY;
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
ULWord RegisterNumber;
|
||
|
ULWord RegisterValue;
|
||
|
ULWord RegisterMask;
|
||
|
ULWord RegisterShift;
|
||
|
} REGISTER_ACCESS, *PREGISTER_ACCESS;
|
||
|
|
||
|
// Virtual registers
|
||
|
#include "ntv2virtualregisters.h"
|
||
|
|
||
|
// Structure used to request a DMA transfer
|
||
|
typedef struct
|
||
|
{
|
||
|
NTV2DMAEngine engine;
|
||
|
NTV2Channel dmaChannel;
|
||
|
ULWord frameNumber; // 0-NUM_FRAMEBUFFERS-1
|
||
|
PULWord frameBuffer; // if small integer, then interpreted as DMA driver buffer # in
|
||
|
// driver(i.e. GetDMABufferAddress)
|
||
|
ULWord frameOffsetSrc; // For Audio DMA, we want to write from a specific location within the 'frame'
|
||
|
ULWord frameOffsetDest; // For Audio DMA, we want to write to a specific location within the 'frame'
|
||
|
ULWord numBytes; // number of bytes to transfer
|
||
|
ULWord downSample; // applies only to KHD, used for 1/4 size preview
|
||
|
ULWord linePitch; // applies only if downSample true, gets every linePitch lines
|
||
|
ULWord poll; // if poll = true it doesn't block, needs to be checked manually
|
||
|
} NTV2_DMA_CONTROL_STRUCT, *P_NTV2_DMA_CONTROL_STRUCT;
|
||
|
|
||
|
// Structure used to request a DMA transfer
|
||
|
typedef struct
|
||
|
{
|
||
|
NTV2DMAEngine engine;
|
||
|
NTV2Channel dmaChannel;
|
||
|
ULWord frameNumber; // 0-NUM_FRAMEBUFFERS-1
|
||
|
PULWord frameBuffer; // if small integer, then interpreted as DMA driver buffer # in
|
||
|
// driver(i.e. GetDMABufferAddress)
|
||
|
ULWord frameOffsetSrc; // For Audio DMA, we want to write from a specific location within the 'frame'
|
||
|
ULWord frameOffsetDest; // For Audio DMA, we want to write to a specific location within the 'frame'
|
||
|
ULWord numBytes; // number of bytes to transfer
|
||
|
ULWord poll; // if poll = true it doesn't block, needs to be checked manually
|
||
|
ULWord videoNumSegments; // partial segment transfer - number of segment of size numBytes
|
||
|
ULWord videoSegmentHostPitch; //
|
||
|
ULWord videoSegmentCardPitch; //
|
||
|
} NTV2_DMA_SEGMENT_CONTROL_STRUCT, *P_NTV2_DMA_SEGMENT_CONTROL_STRUCT;
|
||
|
|
||
|
// Structure used to request a P2P transfer
|
||
|
typedef struct {
|
||
|
bool bRead; // True for a Target operation, false for a Transfer
|
||
|
NTV2DMAEngine dmaEngine; // engine for transfer
|
||
|
NTV2Channel dmaChannel; // frame buffer channel for message
|
||
|
ULWord ulFrameNumber; // frame number for target/transfer
|
||
|
ULWord ulFrameOffset; // offset into frame to start transfer
|
||
|
ULWord ulVidNumBytes; // transfer size in bytes
|
||
|
ULWord ulVidNumSegments; // number of video segments to transfer
|
||
|
ULWord ulVidSegmentHostPitch; // segment host pitch
|
||
|
ULWord ulVidSegmentCardPitch; // segment card pitch
|
||
|
ULWord64 ullVideoBusAddress; // frame buffer bus address
|
||
|
ULWord64 ullMessageBusAddress; // message register bus address (0 if not required)
|
||
|
ULWord ulVideoBusSize; // size of the video aperture (bytes)
|
||
|
ULWord ulMessageData; // message data (write to message bus address to complete video transfer)
|
||
|
} NTV2_DMA_P2P_CONTROL_STRUCT, *P_NTV2_DMA_P2P_CONTROL_STRUCT;
|
||
|
|
||
|
// Structure to enable/disable interrupts
|
||
|
typedef struct
|
||
|
{
|
||
|
INTERRUPT_ENUMS eInterruptType; // Which interrupt to enable/disable. Not all interrupts supported.
|
||
|
ULWord enable; // 0: disable, nonzero: enable
|
||
|
ULWord interruptCount; // In: interrupt type. Out: interrupt count
|
||
|
} NTV2_INTERRUPT_CONTROL_STRUCT, *P_NTV2_INTERRUPT_CONTROL_STRUCT;
|
||
|
|
||
|
// Structure to wait for interrupts
|
||
|
typedef struct
|
||
|
{
|
||
|
INTERRUPT_ENUMS eInterruptType; // Which interrupt to wait on.
|
||
|
ULWord timeOutMs; // Timeout in milliseconds
|
||
|
ULWord success; // On return, nonzero if interrupt occured
|
||
|
} NTV2_WAITFOR_INTERRUPT_STRUCT, *P_NTV2_WAITFOR_INTERRUPT_STRUCT;
|
||
|
|
||
|
// Structure to control driver debug messages
|
||
|
typedef struct
|
||
|
{
|
||
|
NTV2_DriverDebugMessageSet msgSet; // Which set of message to turn on/off
|
||
|
bool enable; // If true, turn messages on
|
||
|
ULWord success;// On return, nonzero on failure
|
||
|
} NTV2_CONTROL_DRIVER_DEBUG_MESSAGES_STRUCT, *P_NTV2_CONTROL_DRIVER_DEBUG_MESSAGES_STRUCT;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
NTV2Crosspoint channelSpec;// Which channel
|
||
|
AUTOCIRCULATE_TRANSFER_STRUCT acTransfer; // Transfer ctl
|
||
|
AUTOCIRCULATE_TRANSFER_STATUS_STRUCT acStatus; // Results
|
||
|
NTV2RoutingTable acXena2RoutingTable; // Xena2 crosspoint table
|
||
|
AUTOCIRCULATE_TASK_STRUCT acTask; // driver tasks
|
||
|
} AUTOCIRCULATE_TRANSFER_COMBO_STRUCT, *P_AUTOCIRCULATE_TRANSFER_COMBO_STRUCT;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
FRAME_STAMP_STRUCT acFrameStamp; // frame stamp
|
||
|
AUTOCIRCULATE_TASK_STRUCT acTask; // driver tasks
|
||
|
} AUTOCIRCULATE_FRAME_STAMP_COMBO_STRUCT, *P_AUTOCIRCULATE_FRAME_STAMP_COMBO_STRUCT;
|
||
|
|
||
|
/*
|
||
|
typedef struct
|
||
|
{
|
||
|
ULWord requestedByteCount; // number of bytes to write OR MAX number of bytes to read
|
||
|
ULWord actualByteCount; // actual number of byte successfully written or read
|
||
|
UByte bytes[]; // WRITE: an array of bytes to write of size requestedByteCount
|
||
|
// READ: an empty array of MAX size requestedByteCount into which the read goes
|
||
|
} NTV2_UART_STRUCT, *P_NTV2_UART_STRUCT;
|
||
|
*/
|
||
|
|
||
|
// Driver buffers are numbered 0 .. whatever
|
||
|
#define ntv2DMADriverbuffer(n) (n)
|
||
|
|
||
|
|
||
|
#define IOCTL_HEVC_MESSAGE \
|
||
|
_IOWR(NTV2_DEVICE_TYPE, 120, unsigned long)
|
||
|
|
||
|
#endif
|