wiki:peripherals_drivers

GIET_VM / Peripherals Drivers

The GIET_VM supports two types of peripheral components: External peripherals are located in one single cluster (called cluster_io, and identified by the X_IO,Y_IO variables). Internal peripherals (such as XCU, or MMC) are replicated in all clusters.

Each driver xxx_driver define two low-level functions _xxx_get_register() and _xxx_set_register() to access the peripheral addressable registers. These functions are in charge to compute the peripheral registers addresses, taking into account the peripheral base address, the register index, and the cluster coordinates:

  • External peripherals: All accesses use virtual addresses if the MMU (Memory management Unit) is activated, or physical addresses if it is not. In this case, the physical address is computed as pbase = SEG_XXX_BASE + cluster_io << 32.
  • Internal peripherals: All accesses use virtual addresses, and the MMU must be activated. The peripheral virtual base address is computed as vbase = SEG_XXX_BASE + cluster_xy * PERI_CLUSTER_INCREMENT.

The X_IO, Y_IO, and PERI_CLUSTER_INCREMENT variables must be defined in the hard_config.h" file.

Shared and private peripherals

Some peripherals (such as BDV, SDC, FBF) deliver an unique service, and are shared by all applications under the kernel supervision.

Some peripherals (TTY, TIM, NIC, CMA) are multi-channels peripherals: Each channel provide an independent set of addressable registers, and each channel can be seen as an independent hardware resource. For multi-channels peripherals, the GIET_VM allows an user application to dynamically allocate a private peripheral channel, that cannot be used by other applications. The corresponding channel index is stored in the calling thread context.

  • For TIM, the private timer index is hidden, and can only be used by the thread making the allocation.
  • For TTY, the private channel index is hidden, but the the thread making the allocation can ask a totally private terminal, or a partially shared terminal usable by all threads in the same vspace.
  • For NIC, the channel index is returned to the thread making allocation, and can be used by all threads in the same vspace.

BDV (Block Device controller)

CMA (Chained Buffer DMA controller)

DMA (Multi-Channels DMA controller)

HBA (AHCI Disk controller)

IOB (I/O Bridge controller)

IOC (Generic I/O controller)

MMC (Memory Cache controller)

MNC (Master Network Controller)

MWR (MWMR_DMA controller)

NIC (Multi Network controller)

PIC (External Peripherals Interrupt controller)

RDK (RamDisk)

SIM (Monitor controller)

SDC (SDC Disk controller)

TIM (Multi Timers controller)

TTY (Multi Terminals TTY controller)

XCU (Extended Interrupt controller)

Last modified 7 years ago Last modified on Dec 3, 2016, 1:30:26 PM