Changes between Initial Version and Version 1 of xcu_driver


Ignore:
Timestamp:
Oct 8, 2014, 7:23:17 PM (10 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • xcu_driver

    v1 v1  
     1= GIET-VM / XCU Driver =
     2
     3[[PageOutline]]
     4
     5The [source:soft/giet_vm/giet_drivers/xcu_driver.c xcu_driver.c] and [source:soft/giet_vm/giet_drivers/xcu_driver.h xcu_driver.h] files define the XCU driver.
     6
     7The ''vci_xcu'' component is an extended interrupt controller, available in the SoCLib components library, and supporting three types of interrupts:
     8 * '''HWI''' : HardWare Interrupts (from hardware peripherals)
     9 * '''PTI''' : Programmable Timer Interrupts (contained in the XCU component)
     10 * '''WTI''' : Write Trigered Interrupts (from software, or from a PIC controller)
     11
     12The GIET-VM uses three 32 entries interrupt vectors (one interrupt vector for each interrupt type).
     13
     14The CXU component is a replicated peripheral: it must exist one XCU per cluster, and each one can contain several channels:
     15The number of XICU channels is equal to NB_PROCS_MAX, because there is one private XCU channel per processor in a cluster.
     16
     17The virtual base address of the segment associated to the component is:
     18    vbase =  SEG_XCU_BASE + cluster_xy * PERI_CLUSTER_INCREMENT
     19
     20The SEG_XCU_BASE and PERI_CLUSTER_INCREMENT values must be defined in the hard_config.h file.
     21
     22The addressable registers map is defined [source:soft/giet_vm/giet_drivers/xcu_driver.h here].
     23
     24 === void '''_xcu_set_mask'''( unsigned int cluster_xy,  unsigned int channel,    unsigned int mask,   unsigned int irq_type ) ===
     25This function set the mask register for the IRQ type defined by "irq_type",
     26and for the channel identified by the "cluster_xy" and "channel" arguments.
     27All '1' bits are set / all '0' bits are not modified.
     28
     29 === void '''_xcu_get_index'''( unsigned int   cluster_xy,   unsigned int   channel,   unsigned int * index,  unsigned int * irq_type ) ===
     30This function returns the index and the type of the highest priority active interrupt:
     311. active PTI (Timer Interrupt),
     322. active HWI (Hardware Interrupt),
     333. active WTI (Software Interrupt)
     34
     35 === void '''_xcu_send_wti'''( unsigned int cluster_xy,   unsigned int wti_index,   unsigned int wdata ) ===
     36This function writes the ''wdata'' value in the mailbox defined by the ''cluster_xy'' and ''wti_inde'' arguments.
     37
     38 === void '''_xcu_get_wti_value'''( unsigned int   cluster_xy,   unsigned int   wti_index,   unsigned int * value ) ===
     39This function returns the value contained in a WTI mailbox defined by the ''cluster_xy'' and ''wti_index'' arguments. This value is written in the ''value'' argument, and the corresponding WTI is acknowledged.
     40
     41 === void '''_xcu_get_wti_address'''( unsigned int   wti_index,  unsigned int * address ) ===
     42This function returns the physical address of the WTI mailbox in cluster [0][0], defined by the ''wti_index'' argument, in the ''address'' argument.
     43It is used by the GIET to configurate the IOPIC component. There is no access to a specific XCU component in a specific cluster.
     44
     45 === void '''_xcu_timer_start'''( unsigned int cluster_xy,   unsigned int pti_index,  unsigned int period ) ===
     46This function activates a timer contained in XCU by writing in the proper register the period value.
     47
     48 === void '''_xcu_timer_stop'''( unsigned int cluster_xy,   unsigned int pti_index ) ==
     49This function desactivates a timer in XCU component by writing in the proper register.
     50
     51 === unsigned int '''_xcu_timer_reset_irq'''( unsigned int cluster_xy,   unsigned int pti_index ) ===
     52//////////////////////////////////////////////////////////////////////////////
     53// This function acknowlegge a timer interrupt in XCU
     54// component by reading in the proper XCU register.
     55// It can be used by both the isr_switch() for a "system" timer,
     56// or by the _isr_timer() for an "user" timer.
     57//////////////////////////////////////////////////////////////////////////////
     58
     59extern void _xcu_timer_reset_cpt( unsigned int cluster_xy,
     60                                  unsigned int pti_index );
     61//////////////////////////////////////////////////////////////////////////////
     62// This function resets a timer counter. To do so, we re-write the period
     63// in the proper register, what causes the count to restart.
     64// The period value is read from the same (TIMER_PERIOD) register,
     65// this is why in appearance we do nothing useful (read a value
     66// from a register and write this value in the same register).
     67// This function is called during a context switch (user or preemptive)
     68/////////////////////////////////////////////////////////////////////////////
     69