nxdrvlinux/libcifx/cifxlinux.h
Sebastian Doell ac2f4d1789 Add initial driver source based on svn versions:
- toolkit V2.8.0.1@14806
 - BSL V1.8.0.0@14590
 - tcpserver: V1.4.3.0@14676 (marshaller V2.4.0.1@14551)
2024-02-05 09:23:09 +01:00

182 lines
8.7 KiB
C

/* SPDX-License-Identifier: MIT */
/**************************************************************************************
*
* Copyright (c) 2024, Hilscher Gesellschaft fuer Systemautomation mbH. All Rights Reserved.
*
* Description: Header file of Linux specific driver / toolkit initialization.
*
* Changes:
*
* Version Date Author Description
* ----------------------------------------------------------------------------------
* 1 02.01.24 SD changed licensing terms
*
**************************************************************************************/
#ifndef __CIFX_LINUX__H
#define __CIFX_LINUX__H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#define LIBRARYNAME "LinuxCIFXDrv "
#define LINUXCIFXDRV_VERSION LIBRARYNAME VERSION_INFO
#define APIENTRY
#ifdef CIFX_TOOLKIT_HWIF
#include "cifXHWFunctions.h"
#endif
#include "cifXUser.h"
#include "cifXErrors.h"
#define CIFX_DRIVER_INIT_NOSCAN 0 /*!< Don't automatically scan and add found devices */
#define CIFX_DRIVER_INIT_AUTOSCAN 1 /*!< Scan automatically for devices and add them to toolkit control */
#define CIFX_DRIVER_INIT_CARDNUMBER 2 /*!< Initialize specific card */
#define CIFX_POLLINTERVAL_DISABLETHREAD (~0) /*!< Disable polling completely */
#define DMA_BUFFER_COUNT 8
/*****************************************************************************/
/*! Driver initialization structure */
/*****************************************************************************/
struct CIFX_LINUX_INIT
{
int init_options; /*!< see CIFX_DRIVER_INIT_XXX defines */
const char* base_dir; /*!< base directory for device configuration */
unsigned long poll_interval; /*!< Poll interval in ms for non-irq cards */
int poll_priority; /*!< Poll thread priority */
unsigned long trace_level; /*!< see TRACE_LVL_XXX defines */
int user_card_cnt; /*!< Number of user defined cards */
struct CIFX_DEVICE_T* user_cards; /*!< Pointer to Array of user cards (must be user_card_cnt long) */
int iCardNumber;
int fEnableCardLocking;
int poll_StackSize; /*!< Stack size of polling thread */
int poll_schedpolicy; /*!< Schedule policy of poll thread */
FILE* logfd;
};
int32_t cifXDriverInit(const struct CIFX_LINUX_INIT* init_params);
void cifXDriverDeinit();
int32_t cifXGetDriverVersion(uint32_t ulSize, char* szVersion);
typedef int32_t (*PFN_DRV_HWIF_INIT) ( struct CIFX_DEVICE_T* ptDevice);
typedef void (*PFN_DRV_HWIF_EXIT) ( struct CIFX_DEVICE_T* ptDevice);
typedef void* (*PFN_DRV_HWIF_MEMCPY) ( struct CIFX_DEVICE_T* ptDevice, void* pvAddr, void* pvData, uint32_t ulLen);
/*****************************************************************************/
/*! Notification events */
/*****************************************************************************/
typedef enum CIFX_NOTIFY_Etag
{
eCIFX_EVENT_PRERESET = 0, /*!< Event signalled, before device is reset (HW Reset) */
eCIFX_EVENT_POSTRESET, /*!< Called after HW reset has been executed */
eCIFX_EVENT_PRE_BOOTLOADER, /*!< Called before bootloader is downloaded */
eCIFX_EVENT_POST_BOOTLOADER, /*!< Called after bootloader was downloaded and started */
} CIFX_NOTIFY_E;
typedef void(*PFN_CIFX_NOTIFY_EVENT)(struct CIFX_DEVICE_T* ptDevice, CIFX_NOTIFY_E eEvent);
/*****************************************************************************/
/*! Memory types */
/*****************************************************************************/
typedef enum CIFX_MEM_TYPE_Etag
{
eMEM_DPM,
eMEM_EXTMEM,
eMEM_DMA
} CIFX_MEM_TYPE_E;
/*****************************************************************************/
/*! DMA memory information */
/*****************************************************************************/
typedef struct DMABUFFER_Ttag
{
uint32_t ulSize; /*!< DMA buffer size */
uint32_t ulPhysicalAddress; /*!< Physical address of the buffer */
void* pvBuffer; /*!< Pointer to the buffer */
} DMABUFFER_T;
/*****************************************************************************/
/*! Device structure for manually adding devices */
/*****************************************************************************/
struct CIFX_DEVICE_T
{
unsigned char* dpm; /*!< virtual pointer to DPM */
unsigned long dpmaddr; /*!< physical address to DPM, this parameter will be used for PCI cards to detect bus address */
unsigned long dpmlen; /*!< Length of DPM in bytes */
int uio_num; /*!< uio number, -1 for non-uio devices */
int uio_fd; /*!< uio file handle, -1 for non-uio devices */
int pci_card; /*!< !=0 if device is a pci card */
int force_ram; /*!< Force usage of RAM instead of flash. Card will always be reset and all
files are downloaded again */
PFN_CIFX_NOTIFY_EVENT notify; /*!< Function to call, after the card has passed several stages (usually needed on RAM based
devices, that change DPM configuration during initialization) */
void* userparam; /*!< User specific parameter (e.g. identifier for manual added devices */
unsigned char* extmem; /*!< virtual pointer to extended memory */
unsigned long extmemaddr; /*!< physical address to extended memory */
unsigned long extmemlen; /*!< Length of extended memory in bytes */
/* DMA Buffer Structure */
uint32_t dma_buffer_cnt; /*!< Number of available DMA buffers */
DMABUFFER_T dma_buffer[DMA_BUFFER_COUNT]; /*!< DMA buffer definition for the device */
/* function interface required when using the toolkit's hardware functions */
PFN_DRV_HWIF_INIT hwif_init; /*!< Function initializes custom hw-function interface */
PFN_DRV_HWIF_EXIT hwif_deinit; /*!< Function de-initializes custom hw-function interface */
PFN_DRV_HWIF_MEMCPY hwif_read; /*!< Function provides read access to the DPM via custom hardware interface */
PFN_DRV_HWIF_MEMCPY hwif_write; /*!< Function provides write access to the DPM via custom hardware interface */
};
int cifXGetDeviceCount(void);
struct CIFX_DEVICE_T* cifXFindDevice(int iNum, int fForceOpenDevice);
void cifXDeleteDevice(struct CIFX_DEVICE_T* device);
#define CIFX_UIO_MAP_NO_FOR_DPM 0 /*!< Offset of uio driver to mmap */
#define CIFX_UIO_PLX_CARD_NAME "netx_plx" /*!< uio name of a NXSB-PCA or NXPCA-PCI card */
#define CIFX_UIO_CARD_NAME "netx" /*!< uio name of a cifX PCI card */
#define CIFX_UIO_NETPLC_CARD_NAME "netplc" /*!< uio name of a netPLC PCI card */
#define CIFX_UIO_NETJACK_CARD_NAME "netjack" /*!< uio name of a netJACK PCI card */
#define CIFX_UIO_CUSTOM_CARD_NAME "netx_custom" /*!< name of user defined cards */
#define UIO_NETX_START_TYPE_AUTO "auto"
#define UIO_NETX_START_TYPE_RAM "ram"
#define UIO_NETX_START_TYPE_FLASH "flash"
#define UIO_NETX_START_TYPE_DONTTOUCH "donttouch"
/* UIO helper functions to allow users, to find own uio devices, without the need to reimplement the uio access functions */
int cifx_uio_open(int uio_num, int fForceOpenDevice);
int cifx_ISA_open(void);
void cifx_ISA_close(int isa_fd);
unsigned long cifx_uio_get_mem_size(int uio_num, int bar);
unsigned long cifx_uio_get_mem_addr(int uio_num, int bar);
int cifx_uio_validate_name(int uio_num, const char* name);
int cifx_uio_map_dpm(int uio_fd, int uio_num, void** dpmbase, unsigned long* dpmaddr, unsigned long* dpmlen);
int cifx_ISA_map_dpm(int fd, void** dpmbase, int dpmaddr, int dpmlen);
void cifx_ISA_unmap_dpm(void* dpmbase, int dpmlen);
#define CIFX_PLUGIN_GET_DEVICE_COUNT "cifx_device_count"
typedef uint32_t(*PFN_CIFX_PLUGIN_GET_DEVICE_COUNT)(void);
#define CIFX_PLUGIN_ALLOC_DEVICE "cifx_alloc_device"
typedef struct CIFX_DEVICE_T*(*PFN_CIFX_PLUGIN_ALLOC_DEVICE)(uint32_t num);
#define CIFX_PLUGIN_FREE_DEVICE "cifx_free_device"
typedef void(*PFN_CIFX_PLUGIN_FREE_DEVICE)(struct CIFX_DEVICE_T*);
#ifdef __cplusplus
}
#endif
#endif /* __CIFX_LINUX__H */