flinkLinux
flink Linux Kernel Modules
|
All the basic functionality can be found in the file flink_core.c
together with all necessary types and prototypes in flink.h
. Bus Communication Modules implement this basic functionality for a given hardware interface.
The information for a specific flink device will be stored in a structure flink_device
.
// ############ flink device ############ struct flink_device { struct list_head list; u8 id; u8 nof_subdevices; struct list_head subdevices; struct flink_bus_ops* bus_ops; struct module* appropriated_module; void* bus_data; struct cdev* char_device; struct device* sysfs_device; };
All flink devices which are present in a system will be inserted in a linked list.
A flink device will contain one or several subdevices. Those subdevices are represented by the structure flink_subdevice
.
// ############ flink subdevice ############ struct flink_subdevice { struct list_head list; struct flink_device* parent; u8 id; u16 type_id; u8 sub_type_id; u8 if_version; u32 base_addr; u32 mem_size; u32 nof_channels; };
The following picture shows an example of a system with two flink devices, each containing two subdevices.
Obviously, a flink device must communicate with a given set of operations over its interface. However, we do not want to introduce any hardware dependency into flink_core.c
. For this purpose we define a structure flink_bus_ops
.
// ############ flink bus operations ############ struct flink_bus_ops { u8 (*read8)(struct flink_device*, u32 addr); u16 (*read16)(struct flink_device*, u32 addr); u32 (*read32)(struct flink_device*, u32 addr); int (*write8)(struct flink_device*, u32 addr, u8 val); int (*write16)(struct flink_device*, u32 addr, u16 val); int (*write32)(struct flink_device*, u32 addr, u32 val); u32 (*address_space_size)(struct flink_device*); };
This bus operations will later point to interface dependent functions. There is one more important data structure:
// ############ flink private data ############ struct flink_private_data { struct flink_device* fdev; struct flink_subdevice* current_subdevice; };
An oben file is represented in Linux by the file
structure. A parameter of type file
is passed when calling read
or write
operations. file
contains a field private_data
which is used here to point to flink_private_data
and holds the information about which device and subdevice will be targeted.
A flink device implements the following file operations
Several functions to manage devices and subdevices are exported for use in other kernel modules. The API can be found in API