Version 3 (modified by 10 years ago) (diff) | ,
---|
GIET-VM / BDV Driver
-
GIET-VM / BDV Driver
-
- int _timer_start( unsigned int cluster_xy, unsigned int …
- int _timer_stop( unsigned int cluster_xy, unsigned int local_id )
- int _timer_reset_irq( unsigned int cluster_xy, unsigned int …
- int _timer_reset_cpt( unsigned int cluster_xy, unsigned int …
- void _timer_isr( unsigned int irq_type, unsigned int irq_id, …
-
The tim_driver.c and tim_driver.h files define the TIM driver.
The vci_multi_timer component is a multi-channels timer controller.
For the GIET, it is an internal peripheral, replicated in each cluster.
The SEG_TIM_BASE address must be defined in the hard_config.h file.
There is two types of timers:
- kernel timers : one per processor, used for context switch. The local_id is in [0, NB_PROCS_MAX-1].
- user timers : requested by the task in the mapping_info data structure. The local_id is in [NB_PROCS_MAX, NB_PROCS_MAX + NB_TIM_CHANNELS -1].
The global timer index is cluster_xy * (NB_PROCS_MAX + NB_TIM_CHANNELS) + local_id
The virtual base address of the associated segment is: vbase = SEG_TIM_BASE + cluster_xy * PERI_CLUSTER_INCREMENT
The SEG_TIM_BASE, PERI_CLUSTER_INCREMENT, NB_PROCS_MAX and NB_TIM_CHANNELS values must be defined in hard_config.h file.
The addressable registers map is defined here.
int _timer_start( unsigned int cluster_xy, unsigned int local_id, unsigned int period )
This function activates a timer in the vci_timer component by writing in the proper register the period value. It can be used by both the kernel to initialise a "system" timer, or by a task (through a system call) to configure an "user" timer.
Return 0 in case of success. Return -1 if timer index too large.
int _timer_stop( unsigned int cluster_xy, unsigned int local_id )
This function desactivates a timer in the vci_timer component by writing in the proper register.
Return 0 in case of success. Return -1 if timer index too large.
int _timer_reset_irq( unsigned int cluster_xy, unsigned int local_id )
This function acknowlegge a timer interrupt in the vci_timer component by writing in the proper register. It can be used by both the isr_switch() for a "system" timer, or by the _isr_timer() for an "user" timer.
Return 0 in case of success. Return -1 if timer index too large.
int _timer_reset_cpt( unsigned int cluster_xy, unsigned int local_id)
This function resets the timer counter. To do so, we re-write the period in the proper register, what causes the count to restart. This function is called during a context switch (user or preemptive).
Return 0 in case of success. Return -1 if timer index too large.
void _timer_isr( unsigned int irq_type, unsigned int irq_id, unsigned int channel )
This Interrupt Service Routine handles the IRQs generated by the "user" timers. The IRQs generated by the "system" timers should be handled by _isr_switch(). It can be a HWI or a PTI. The channel argument is the timer local index. The ISR acknowledges the IRQ, registers the event in the proper entry of the _user_timer_event[] array, and a log message is displayed on TTY0.