From 1fb0384fe7ba59b47d38926656840b40f66fc852 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 22 Apr 2014 09:10:32 -0600 Subject: [PATCH] SAM3/4 T/C driver updated to get closer to coding standard --- arch/arm/src/sam34/sam_tc.c | 79 ++++++++++++++++++++++++------------- arch/arm/src/sam34/sam_tc.h | 11 ++++-- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/arch/arm/src/sam34/sam_tc.c b/arch/arm/src/sam34/sam_tc.c index f4de84d282..0c2ee406c2 100644 --- a/arch/arm/src/sam34/sam_tc.c +++ b/arch/arm/src/sam34/sam_tc.c @@ -55,14 +55,18 @@ //#define CONFIG_SAM34_TC_REGDEBUG -#if defined(CONFIG_TIMER) && (defined(CONFIG_SAM34_TC0) || defined(CONFIG_SAM34_TC1) || defined(CONFIG_SAM34_TC2) || defined(CONFIG_SAM34_TC3) || defined(CONFIG_SAM34_TC4) || defined(CONFIG_SAM34_TC5)) +#if defined(CONFIG_TIMER) && (defined(CONFIG_SAM34_TC0) || \ + defined(CONFIG_SAM34_TC1) || defined(CONFIG_SAM34_TC2) || \ + defined(CONFIG_SAM34_TC3) || defined(CONFIG_SAM34_TC4) || \ + defined(CONFIG_SAM34_TC5)) /**************************************************************************** * Pre-Processor Definitions ****************************************************************************/ /* Clocking *****************************************************************/ -#warning "TODO: allow selection of any of the input clocks" +/* TODO: Allow selection of any of the input clocks */ + #define TC_FCLK (BOARD_SLCK_FREQUENCY) #define TC_MAXTIMEOUT ((1000000ULL * (1ULL + TC_RVALUE_MASK)) / TC_FCLK) @@ -184,6 +188,7 @@ static uint32_t sam34_getreg(uint32_t addr) { lldbg("...\n"); } + return val; } } @@ -250,6 +255,7 @@ static void sam34_putreg(uint32_t val, uint32_t addr) * Always returns OK. * ****************************************************************************/ + static int sam34_interrupt(int irq, FAR void *context) { FAR struct sam34_lowerhalf_s *priv = &g_tcdev; @@ -258,16 +264,20 @@ static int sam34_interrupt(int irq, FAR void *context) tcvdbg("Entry\n"); /* Check if the interrupt is really pending */ + regval = sam34_getreg(SAM_TC0_SR); if ((regval & TC_INT_CPCS) != 0) - { - /* Is there a registered handler? */ - if (priv->handler) { - priv->handler(irq, context); + /* Is there a registered handler? */ + + if (priv->handler) + { + priv->handler(irq, context); + } + + /* TC_INT_CPCS is cleared by reading SAM_TC0_SR */ } - /* TC_INT_CPCS is cleared by reading SAM_TC0_SR */ - } + return OK; } @@ -298,22 +308,25 @@ static int sam34_start(FAR struct timer_lowerhalf_s *lower) sam34_putreg(TC_CCR_CLKDIS, SAM_TC0_CCR); // disable counter - // TC_CMR_WAVE - waveform mode - // TC_CMR_WAVSEL_UPAUTO - reset on RC compare (interval timer) - // TC_CMR_TCCLKS_TIMERCLOCK5 = SCLK + /* TC_CMR_WAVE - waveform mode + * TC_CMR_WAVSEL_UPAUTO - reset on RC compare (interval timer) + * TC_CMR_TCCLKS_TIMERCLOCK5 = SCLK + */ + mr_val |= (TC_CMR_WAVE + TC_CMR_WAVSEL_UPAUTO + TC_CMR_TCCLKS_TIMERCLOCK5); sam34_putreg(mr_val, SAM_TC0_CMR); sam34_putreg(priv->reload, SAM_TC0_RC); // set interval -#warning "isr active without user handle for now..." -// if(priv->handler) -// { - // clear status - sam34_getreg(SAM_TC0_SR); - sam34_putreg(TC_INT_CPCS, SAM_TC0_IMR); - sam34_putreg(TC_INT_CPCS, SAM_TC0_IER); -// } + /* TODO: isr active without user handle for now... */ +// if (priv->handler) + { + /* Clear status */ + + sam34_getreg(SAM_TC0_SR); + sam34_putreg(TC_INT_CPCS, SAM_TC0_IMR); + sam34_putreg(TC_INT_CPCS, SAM_TC0_IER); + } sam34_putreg(TC_CCR_SWTRG + TC_CCR_CLKEN, SAM_TC0_CCR); // start counter @@ -434,11 +447,13 @@ static int sam34_settimeout(FAR struct timer_lowerhalf_s *lower, } -#warning "-1 or no?" - reload = (((uint64_t)timeout * TC_FCLK) / 1000000) - 1; + /* TODOR: -1 or no? */ + + reload = (((uint64_t)timeout * TC_FCLK) / 1000000) - 1; /* Make sure that the final reload value is within range */ -#warning "+1 or no?" + /* TODOR: +1 or no? */ + if (reload > TC_CV_MASK) { reload = TC_CV_MASK; @@ -458,7 +473,7 @@ static int sam34_settimeout(FAR struct timer_lowerhalf_s *lower, tcvdbg("fwdt=%d reload=%d timout=%d\n", TC_FCLK, reload, priv->timeout); - // Don't commit to MR register until started! + /* Don't commit to MR register until started! */ return OK; } @@ -585,6 +600,7 @@ static int sam34_ioctl(FAR struct timer_lowerhalf_s *lower, int cmd, * None * ****************************************************************************/ + void sam_tcinitialize(FAR const char *devpath, int irq) { FAR struct sam34_lowerhalf_s *priv = &g_tcdev; @@ -601,16 +617,23 @@ void sam_tcinitialize(FAR const char *devpath, int irq) */ priv->ops = &g_tcops; -#warning "add irq + switch in sam34_interrupt or something (also need register base address..." + + /* TODO: Add irq + switch in sam34_interrupt or something (also need register + * base address... + */ + (void)irq_attach(irq, sam34_interrupt); - // enable interrupt. -#warning "may want to enable/disable in start/stop..." + + /* enable interrupt. + * + * TODO: May want to enable/disable in start/stop... + */ + up_enable_irq(irq); - /* Register the timer driver as /dev/timerX */ - (void)timer_register(devpath, (FAR struct timer_lowerhalf_s *)priv); + (void)timer_register(devpath, (FAR struct timer_lowerhalf_s *)priv); } #endif /* CONFIG_TIMER && CONFIG_SAM34_TCx */ diff --git a/arch/arm/src/sam34/sam_tc.h b/arch/arm/src/sam34/sam_tc.h index 0a43ca3c38..48a97916ea 100644 --- a/arch/arm/src/sam34/sam_tc.h +++ b/arch/arm/src/sam34/sam_tc.h @@ -1,7 +1,7 @@ /**************************************************************************** * arch/arm/src/sam34/sam_tc.h * - * Copyright (C) 2012 Gregory Nutt. All rights reserved. + * Copyright (C) 2014 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -56,7 +56,8 @@ #undef EXTERN #if defined(__cplusplus) #define EXTERN extern "C" -extern "C" { +extern "C" +{ #else #define EXTERN extern #endif @@ -82,8 +83,10 @@ extern "C" { * ****************************************************************************/ -#if defined(CONFIG_SAM34_TC0) || defined(CONFIG_SAM34_TC1) || defined(CONFIG_SAM34_TC2) || defined(CONFIG_SAM34_TC3) || defined(CONFIG_SAM34_TC4) || defined(CONFIG_SAM34_TC5) -EXTERN void sam_tcinitialize(FAR const char *devpath, int irq); +#if defined(CONFIG_SAM34_TC0) || defined(CONFIG_SAM34_TC1) || \ + defined(CONFIG_SAM34_TC2) || defined(CONFIG_SAM34_TC3) || \ + defined(CONFIG_SAM34_TC4) || defined(CONFIG_SAM34_TC5) +void sam_tcinitialize(FAR const char *devpath, int irq); #endif #undef EXTERN