Hi jachen,
I tried to set a target interrupt timer with TMRATR but somehow it doesn’t work as expected. Could you help take a look at what I did and try to see if there’s anything wrong?
- Set the access on TMR_SHARED in the bootloader config file:
scr.1867.4 = 0x3900ffff
I left scr.1868 to scr.1880 unchanged.
- Wrote a modified version of timer setup in tke_tegra.c, TKE_TIMER_TMRATR_0 here is defined as 0xc as shown in TRM:
void tegra_tke_set_up_target_timer(const struct tegra_tke_id *id,
uint32_t clk_src_sel, uint32_t target_count,
tegra_tke_timer_callback callback, void *data)
{
/* struct tegra_tke_id assumed to be first field in tegra_tke */
struct tegra_tke *tke_dev = (struct tegra_tke *)id;
uint32_t tmrcr;
tke_dev->callback = callback;
tke_dev->data = data;
/* select timer clock source */
tegra_tke_timer_writel(id, clk_src_sel, TKE_TIMER_TMRCSSR_0);
/* Disable timer */
// henryzh: set count down to max since we actually want only target
// interrupt. Need to find a way to actually disable this
tmrcr = TKE_TIMER_TMRCR_0_PTV;
tegra_tke_timer_writel(id, tmrcr, TKE_TIMER_TMRCR_0);
// henryzh: set the target counter to register TKE_TIMER_TMRATR_0
tegra_tke_timer_writel(id, target_count, TKE_TIMER_TMRATR_0);
/* Clear timer interrupts. */
tegra_tke_timer_writel(id, TKE_TIMER_TMRSR_0_INTR_CLR, TKE_TIMER_TMRSR_0);
/* Enable timer and configure timer type */
tmrcr |= TKE_TIMER_TMRCR_0_EN;
tegra_tke_timer_writel(id, tmrcr, TKE_TIMER_TMRCR_0);
if (id->irq != TEGRA_TKE_NO_IRQ) {
irq_set_handler(id->irq, tegra_tke_irq, tke_dev);
irq_enable(id->irq);
}
}
- I then added another timer in the timerapp.c file, to use the target interrupt setup I wrote above:
static void timer2_callback(void *data)
{
static int count = 0;
uint32_t usec, osc, tsc_hi, tsc_lo;
usec = tegra_tke_get_usec();
osc = tegra_tke_get_osc();
tegra_tke_get_tsc(&tsc_hi, &tsc_lo);
printf_isr("Timer2 irq triggered, usec = %lu, osc = %lu "
"tsc_hi = %lu, tsc_lo = %lu\r\n", usec, osc, tsc_hi, tsc_lo);
if (++count > STOP_TIMER)
tegra_tke_stop_timer(&tegra_tke_id_timer2);
}
static void timer1_callback(void* data)
{
uint32_t usec, osc, tsc_hi, tsc_lo;
usec = tegra_tke_get_usec();
osc = tegra_tke_get_osc();
tegra_tke_get_tsc(&tsc_hi, &tsc_lo);
printf_isr("Timer1 irq triggered, usec = %lu, osc = %lu "
"tsc_hi = %lu, tsc_lo = %lu\r\n", usec, osc, tsc_hi, tsc_lo);
}
void timer_app_init(void)
{
uint32_t target_count = 1300000000;
// Start timer 1
tegra_tke_set_up_target_timer(&tegra_tke_id_timer1,
TEGRA_TKE_CLK_SRC_TSC_BIT0, target_count,
timer1_callback, 0);
// Start timer 2
tegra_tke_set_up_timer(&tegra_tke_id_timer2, TEGRA_TKE_CLK_SRC_TSC_BIT0,
true, TIMER2_PTV, timer2_callback, 0);
}
- The result is that I only have timer2 (the original count down one) working and printing in callback but never got the target interrupt to trigger. Here is an output from the serial port. I am expecting the timer1 to trigger since I set the target count of tsc_lo to 1300000000.
Timer2 irq triggered, usec = 22864391, osc = 877992652 tsc_hi = 0, tsc_lo = 703476123
Timer2 irq triggered, usec = 26064391, osc = 1000872652 tsc_hi = 0, tsc_lo = 803476123
Timer2 irq triggered, usec = 29264391, osc = 1123752652 tsc_hi = 0, tsc_lo = 903476123
Timer2 irq triggered, usec = 32464391, osc = 1246632652 tsc_hi = 0, tsc_lo = 1003476123
Timer2 irq triggered, usec = 35664391, osc = 1369512652 tsc_hi = 0, tsc_lo = 1103476123
Timer2 irq triggered, usec = 38864391, osc = 1492392652 tsc_hi = 0, tsc_lo = 1203476123
Timer2 irq triggered, usec = 42064391, osc = 1615272652 tsc_hi = 0, tsc_lo = 1303476123
Timer2 irq triggered, usec = 45264391, osc = 1738152652 tsc_hi = 0, tsc_lo = 1403476123
Timer2 irq triggered, usec = 48464391, osc = 1861032652 tsc_hi = 0, tsc_lo = 1503476123
Timer2 irq triggered, usec = 51664391, osc = 1983912652 tsc_hi = 0, tsc_lo = 1603476123
Timer2 irq triggered, usec = 54864391, osc = 2106792652 tsc_hi = 0, tsc_lo = 1703476123
- Here is an update: I actually see timer1 got triggered, but the count doesn’t seem to make sense to me as I set it to be 1300000000, but the actual count is 540346938. How are these two numbers associated?
Timer2 irq triggered, usec = 13264391, osc = 509352652 tsc_hi = 0, tsc_lo = 403476123
Timer2 irq triggered, usec = 16464391, osc = 632232652 tsc_hi = 0, tsc_lo = 503476123
Timer1 irq triggered, usec = 17644257, osc = 677539508 tsc_hi = 0, tsc_lo = 540346938 <---- Here
Timer2 irq triggered, usec = 19664391, osc = 755112652 tsc_hi = 0, tsc_lo = 603476123
Timer2 irq triggered, usec = 22864391, osc = 877992652 tsc_hi = 0, tsc_lo = 703476123
Timer2 irq triggered, usec = 26064391, osc = 1000872652 tsc_hi = 0, tsc_lo = 803476123
Timer2 irq triggered, usec = 29264391, osc = 1123752652 tsc_hi = 0, tsc_lo = 903476123
Timer2 irq triggered, usec = 32464391, osc = 1246632652 tsc_hi = 0, tsc_lo = 1003476123
Another update: Turns out this might be the count down in timer1 as I set the count down to TKE_TIMER_TMRCR_0_PTV which is 0x1ffffff = 536870911. How do I make the timer just to the target interrupt without count down?
Thank you so much for your time.