mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 19:36:35 +08:00
Tiva ADC: Drive updates from Calvin Maguranis
This commit is contained in:
@@ -123,8 +123,12 @@
|
|||||||
# ifndef CONFIG_SCHED_WORKQUEUE
|
# ifndef CONFIG_SCHED_WORKQUEUE
|
||||||
# error Work queue support is required (CONFIG_SCHED_WORKQUEUE) for ADC interrupts
|
# error Work queue support is required (CONFIG_SCHED_WORKQUEUE) for ADC interrupts
|
||||||
# endif
|
# endif
|
||||||
|
# ifndef CONFIG_SCHED_HPWORK
|
||||||
|
# error High priority worker threads is required (CONFIG_SCHED_HPWORK) for ADC interrupts
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFIG_DEBUG
|
#ifndef CONFIG_DEBUG
|
||||||
# undef CONFIG_TIVA_ADC_REGDEBUG
|
# undef CONFIG_TIVA_ADC_REGDEBUG
|
||||||
#endif
|
#endif
|
||||||
@@ -282,8 +286,10 @@ struct tiva_adc_s
|
|||||||
struct tiva_adc_sse_s
|
struct tiva_adc_sse_s
|
||||||
{
|
{
|
||||||
struct tiva_adc_s *adc; /* Parent peripheral */
|
struct tiva_adc_s *adc; /* Parent peripheral */
|
||||||
|
#ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_t exclsem; /* Mutual exclusion semaphore */
|
sem_t exclsem; /* Mutual exclusion semaphore */
|
||||||
struct work_s work; /* Supports the interrupt handling "bottom half" */
|
struct work_s work; /* Supports the interrupt handling "bottom half" */
|
||||||
|
#endif
|
||||||
bool ena; /* Sample sequencer operation state */
|
bool ena; /* Sample sequencer operation state */
|
||||||
uint32_t irq; /* SSE interrupt vectors */
|
uint32_t irq; /* SSE interrupt vectors */
|
||||||
uint8_t num; /* SSE number */
|
uint8_t num; /* SSE number */
|
||||||
@@ -356,44 +362,64 @@ static void sse_step_cfg(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
|
|||||||
#ifdef CONFIG_TIVA_ADC0
|
#ifdef CONFIG_TIVA_ADC0
|
||||||
static void tiva_adc0_sse_init(void);
|
static void tiva_adc0_sse_init(void);
|
||||||
static void tiva_adc0_assign_channels(void);
|
static void tiva_adc0_assign_channels(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void tiva_adc0_assign_interrupts(void);
|
static void tiva_adc0_assign_interrupts(void);
|
||||||
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC0_SSE0
|
# ifdef CONFIG_TIVA_ADC0_SSE0
|
||||||
static void adc0_sse0_chn_cfg(void);
|
static void adc0_sse0_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc0_sse0_interrupt(int irq, void *context);
|
static void adc0_sse0_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC0_SSE1
|
# ifdef CONFIG_TIVA_ADC0_SSE1
|
||||||
static void adc0_sse1_chn_cfg(void);
|
static void adc0_sse1_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc0_sse1_interrupt(int irq, void *context);
|
static void adc0_sse1_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC0_SSE2
|
# ifdef CONFIG_TIVA_ADC0_SSE2
|
||||||
static void adc0_sse2_chn_cfg(void);
|
static void adc0_sse2_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc0_sse2_interrupt(int irq, void *context);
|
static void adc0_sse2_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC0_SSE3
|
# ifdef CONFIG_TIVA_ADC0_SSE3
|
||||||
static void adc0_sse3_chn_cfg(void);
|
static void adc0_sse3_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc0_sse3_interrupt(int irq, void *context);
|
static void adc0_sse3_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_TIVA_ADC1
|
#ifdef CONFIG_TIVA_ADC1
|
||||||
static void tiva_adc1_sse_init(void);
|
static void tiva_adc1_sse_init(void);
|
||||||
static void tiva_adc1_assign_channels(void);
|
static void tiva_adc1_assign_channels(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void tiva_adc1_assign_interrupts(void);
|
static void tiva_adc1_assign_interrupts(void);
|
||||||
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC1_SSE0
|
# ifdef CONFIG_TIVA_ADC1_SSE0
|
||||||
static void adc1_sse0_chn_cfg(void);
|
static void adc1_sse0_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc1_sse0_interrupt(int irq, void *context);
|
static void adc1_sse0_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC1_SSE1
|
# ifdef CONFIG_TIVA_ADC1_SSE1
|
||||||
static void adc1_sse1_chn_cfg(void);
|
static void adc1_sse1_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc1_sse1_interrupt(int irq, void *context);
|
static void adc1_sse1_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC1_SSE2
|
# ifdef CONFIG_TIVA_ADC1_SSE2
|
||||||
static void adc1_sse2_chn_cfg(void);
|
static void adc1_sse2_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc1_sse2_interrupt(int irq, void *context);
|
static void adc1_sse2_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef CONFIG_TIVA_ADC1_SSE3
|
# ifdef CONFIG_TIVA_ADC1_SSE3
|
||||||
static void adc1_sse3_chn_cfg(void);
|
static void adc1_sse3_chn_cfg(void);
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
static void adc1_sse3_interrupt(int irq, void *context);
|
static void adc1_sse3_interrupt(int irq, void *context);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1476,7 +1502,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse00.ena = false;
|
sse00.ena = false;
|
||||||
sse00.irq = TIVA_IRQ_ADC0;
|
sse00.irq = TIVA_IRQ_ADC0;
|
||||||
sse00.num = 0;
|
sse00.num = 0;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse00.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse00.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc0.sse[0] = &sse00;
|
adc0.sse[0] = &sse00;
|
||||||
# endif /* CONFIG_TIVA_ADC0_SSE0 */
|
# endif /* CONFIG_TIVA_ADC0_SSE0 */
|
||||||
|
|
||||||
@@ -1484,7 +1512,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse01.ena = false;
|
sse01.ena = false;
|
||||||
sse01.irq = TIVA_IRQ_ADC1;
|
sse01.irq = TIVA_IRQ_ADC1;
|
||||||
sse01.num = 1;
|
sse01.num = 1;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse01.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse01.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc0.sse[1] = &sse01;
|
adc0.sse[1] = &sse01;
|
||||||
# endif /* CONFIG_TIVA_ADC0_SSE1 */
|
# endif /* CONFIG_TIVA_ADC0_SSE1 */
|
||||||
|
|
||||||
@@ -1492,7 +1522,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse02.ena = false;
|
sse02.ena = false;
|
||||||
sse02.irq = TIVA_IRQ_ADC2;
|
sse02.irq = TIVA_IRQ_ADC2;
|
||||||
sse02.num = 2;
|
sse02.num = 2;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse02.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse02.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc0.sse[2] = &sse02;
|
adc0.sse[2] = &sse02;
|
||||||
# endif /* CONFIG_TIVA_ADC0_SSE2 */
|
# endif /* CONFIG_TIVA_ADC0_SSE2 */
|
||||||
|
|
||||||
@@ -1500,7 +1532,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse03.ena = false;
|
sse03.ena = false;
|
||||||
sse03.irq = TIVA_IRQ_ADC3;
|
sse03.irq = TIVA_IRQ_ADC3;
|
||||||
sse03.num = 3;
|
sse03.num = 3;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse03.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse03.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc0.sse[3] = &sse03;
|
adc0.sse[3] = &sse03;
|
||||||
# endif /* CONFIG_TIVA_ADC0_SSE3 */
|
# endif /* CONFIG_TIVA_ADC0_SSE3 */
|
||||||
|
|
||||||
@@ -1535,7 +1569,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse10.ena = false;
|
sse10.ena = false;
|
||||||
sse10.irq = TIVA_IRQ_ADC1_0;
|
sse10.irq = TIVA_IRQ_ADC1_0;
|
||||||
sse10.num = 0;
|
sse10.num = 0;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse10.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse10.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc1.sse[0] = &sse10;
|
adc1.sse[0] = &sse10;
|
||||||
# endif /* CONFIG_TIVA_ADC1_SSE0 */
|
# endif /* CONFIG_TIVA_ADC1_SSE0 */
|
||||||
|
|
||||||
@@ -1543,7 +1579,10 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse11.ena = false;
|
sse11.ena = false;
|
||||||
sse11.irq = TIVA_IRQ_ADC1_1;
|
sse11.irq = TIVA_IRQ_ADC1_1;
|
||||||
sse11.num = 1;
|
sse11.num = 1;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse11.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse11.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
|
|
||||||
adc1.sse[1] = &sse11;
|
adc1.sse[1] = &sse11;
|
||||||
# endif /* CONFIG_TIVA_ADC1_SSE1 */
|
# endif /* CONFIG_TIVA_ADC1_SSE1 */
|
||||||
|
|
||||||
@@ -1551,7 +1590,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse12.ena = false;
|
sse12.ena = false;
|
||||||
sse12.irq = TIVA_IRQ_ADC1_2;
|
sse12.irq = TIVA_IRQ_ADC1_2;
|
||||||
sse12.num = 2;
|
sse12.num = 2;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse12.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse12.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc1.sse[2] = &sse12;
|
adc1.sse[2] = &sse12;
|
||||||
# endif /* CONFIG_TIVA_ADC1_SSE2 */
|
# endif /* CONFIG_TIVA_ADC1_SSE2 */
|
||||||
|
|
||||||
@@ -1559,7 +1600,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
sse13.ena = false;
|
sse13.ena = false;
|
||||||
sse13.irq = TIVA_IRQ_ADC1_3;
|
sse13.irq = TIVA_IRQ_ADC1_3;
|
||||||
sse13.num = 3;
|
sse13.num = 3;
|
||||||
|
# ifdef TIVA_ADC_HAVE_INTERRUPTS
|
||||||
sem_init(&sse13.exclsem, SEM_PROCESS_PRIVATE, 1);
|
sem_init(&sse13.exclsem, SEM_PROCESS_PRIVATE, 1);
|
||||||
|
# endif
|
||||||
adc1.sse[3] = &sse13;
|
adc1.sse[3] = &sse13;
|
||||||
# endif /* CONFIG_TIVA_ADC1_SSE3 */
|
# endif /* CONFIG_TIVA_ADC1_SSE3 */
|
||||||
|
|
||||||
@@ -1628,7 +1671,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
|
|
||||||
/* Configure channels & register interrupts */
|
/* Configure channels & register interrupts */
|
||||||
|
|
||||||
|
# if TIVA_ADC_HAVE_INTERRUPTS
|
||||||
tiva_adc0_assign_interrupts();
|
tiva_adc0_assign_interrupts();
|
||||||
|
# endif
|
||||||
tiva_adc0_assign_channels();
|
tiva_adc0_assign_channels();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1642,7 +1687,9 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
|
|
||||||
/* Configure channels & register interrupts */
|
/* Configure channels & register interrupts */
|
||||||
|
|
||||||
|
# if TIVA_ADC_HAVE_INTERRUPTS
|
||||||
tiva_adc1_assign_interrupts();
|
tiva_adc1_assign_interrupts();
|
||||||
|
# endif
|
||||||
tiva_adc1_assign_channels();
|
tiva_adc1_assign_channels();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1679,6 +1726,7 @@ struct adc_dev_s *tiva_adc_initialize(int adc_num)
|
|||||||
|
|
||||||
void tiva_adc_lock(FAR struct tiva_adc_s *priv, int sse)
|
void tiva_adc_lock(FAR struct tiva_adc_s *priv, int sse)
|
||||||
{
|
{
|
||||||
|
#if TIVA_ADC_HAVE_INTERRUPTS
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
avdbg("Locking\n");
|
avdbg("Locking\n");
|
||||||
@@ -1694,6 +1742,7 @@ void tiva_adc_lock(FAR struct tiva_adc_s *priv, int sse)
|
|||||||
DEBUGASSERT(ret == OK || errno == EINTR);
|
DEBUGASSERT(ret == OK || errno == EINTR);
|
||||||
}
|
}
|
||||||
while (ret < 0);
|
while (ret < 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -1706,8 +1755,10 @@ void tiva_adc_lock(FAR struct tiva_adc_s *priv, int sse)
|
|||||||
|
|
||||||
void tiva_adc_unlock(FAR struct tiva_adc_s *priv, int sse)
|
void tiva_adc_unlock(FAR struct tiva_adc_s *priv, int sse)
|
||||||
{
|
{
|
||||||
|
#if TIVA_ADC_HAVE_INTERRUPTS
|
||||||
avdbg("Unlocking\n");
|
avdbg("Unlocking\n");
|
||||||
sem_post(&priv->sse[sse]->exclsem);
|
sem_post(&priv->sse[sse]->exclsem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user