flinklib
flinklib: flink C library for Linux
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Overview

All the basic functionality can be found in the file base.c. The necessary types and prototypes are located in include/flinklib.h and include/flinkioctl.h. The high-level API offers for each availabe function such as "digital io" or "analog input" a specific interface which is implemented in an own driver, e.g. dio.c or ain.c. The low-level API is implemented in lowlevel.c.

Data Structures

The information for a specific flink device will be stored in a structure flink_dev.

// ############ flink device ############
struct flink_dev {
    int            fd;
    uint8_t        nof_subdevices;
    flink_subdev*  subdevices;
};

All subdevices which are present in a device will be inserted in a linked list 'subdevices'.

A subdevices is represented by the structure flink_subdev.

// ############ flink subdevice ############
struct flink_subdevice {
    uint8_t        id;
    uint16_t       type_id;
    uint8_t        sub_type_id;
    uint8_t        if_version;
    uint32_t       base_addr;
    uint32_t       mem_size;
    uint32_t       nof_channels;
    flink_dev*     parent;
};

Operations for flink devices

This operation allow for opening and closing flink devices.

flink_dev* flink_open(const char* file_name);
int        flink_close(flink_dev* dev);

Operations for flink subdevices

This operation allow for the general handling of flink subdevices.

int           flink_get_nof_subdevices(flink_dev* dev);
flink_subdev* flink_get_subdevice_by_id(flink_dev* dev, uint8_t subdev_id);
uint8_t       flink_subdevice_get_id(flink_subdev* subdev);
uint16_t      flink_subdevice_get_function(flink_subdev* subdev);
uint8_t       flink_subdevice_get_subfunction(flink_subdev* subdev);
uint8_t       flink_subdevice_get_function_version(flink_subdev* subdev);
uint32_t      flink_subdevice_get_baseaddr(flink_subdev* subdev);
uint32_t      flink_subdevice_get_memsize(flink_subdev* subdev);
uint32_t      flink_subdevice_get_nofchannels(flink_subdev* subdev);
int           flink_subdevice_select(flink_subdev* subdev, uint8_t exclusive);
int           flink_subdevice_reset(flink_subdev* subdev);
const char*   flink_subdevice_id2str(uint16_t subdev_id);

Every subdevice implementing a specific function offers its own set of methods, see in the corresponding API.

Low-level operations

With these methods its possible to communicate with a subdevice implementing a user-defined function.

int     flink_ioctl(flink_dev* dev, int cmd, void* arg);
ssize_t flink_read(flink_subdev* subdev, uint32_t offset, uint8_t size, void* rdata);
ssize_t flink_write(flink_subdev* subdev, uint32_t offset, uint8_t size, void* wdata);
int     flink_read_bit(flink_subdev* subdev, uint32_t offset, uint8_t bit, void* rdata);
int     flink_write_bit(flink_subdev* subdev, uint32_t offset, uint8_t bit, void* wdata);