SAMA5: Integrate touchscreen and ADC drivers into the build

This commit is contained in:
Gregory Nutt 2013-10-03 12:49:13 -06:00
parent 6c8d7f2184
commit a4123ed6d5
11 changed files with 1069 additions and 134 deletions

View File

@ -830,6 +830,674 @@ endif # SAMA5_OHCI || SAMA5_EHCI
endmenu # USB High Speed Host Controller driver (HCD) options endmenu # USB High Speed Host Controller driver (HCD) options
endif # SAMA5_UHPHS endif # SAMA5_UHPHS
if SAMA5_ADC
menu "ADC configuration"
config SAMA5_ADC_HAVE_CHAN
bool
default n
menu "ADC Channel selection"
config SAMA5_ADC_CHAN0
bool "Channel 0"
default n
depends on !SAMA5_TSD
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 0
config SAMA5_ADC_CHAN1
bool "Channel 1"
default n
depends on !SAMA5_TSD
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 1
config SAMA5_ADC_CHAN2
bool "Channel 2"
default n
depends on !SAMA5_TSD
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 2
config SAMA5_ADC_CHAN3
bool "Channel 3"
default n
depends on !SAMA5_TSD
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 3
config SAMA5_ADC_CHAN4
bool "Channel 4"
default n
depends on !SAMA5_TSD || !SAMA5_TSD_5WIRE
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 4
config SAMA5_ADC_CHAN5
bool "Channel 5"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 5
config SAMA5_ADC_CHAN6
bool "Channel 6"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 6
config SAMA5_ADC_CHAN7
bool "Channel 7"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 7
config SAMA5_ADC_CHAN8
bool "Channel 8"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 8
config SAMA5_ADC_CHAN9
bool "Channel 9"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 9
config SAMA5_ADC_CHAN10
bool "Channel 10"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 10
config SAMA5_ADC_CHAN11
bool "Channel 11"
default n
select SAMA5_ADC_HAVE_CHAN
---help---
Enable ADC sampling on ADC channel 11
endmenu # ADC Channel selection
if SAMA5_ADC_HAVE_CHAN
config SAMA5_ADC_DMA
bool "DMA Support"
default n
---help---
Enable DMA transfers of converted data. This option is only
useful if you have numerous DMA channels enabled. The end result
is that there will be one DMA interrupt per conversion sequence vs.
one interrupt per conversion.
config SAMA5_ADC_AUTOCALIB
bool "ADC auto-calibration"
default n
---help---
Perform ADC auto-calibration during the ADC initialization sequence
config SAMA5_ADC_SEQUENCER
bool "ADC sequencer"
default n
---help---
Enable the sequencer to perform ADC conversions. Recommended if you
enable several ADC channels.
config SAMA5_ADC_ANARCH
bool "Analog changes"
default n
---help---
This option allows you to select different gain, offset, and single
vs. differential modes for each channel.
if SAMA5_ADC_ANARCH
menu "Channel gain"
config SAMA5_ADC_GAIN0
int "Channel 0 gain"
default 0
depends on SAMA5_ADC_CHAN0
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN1
int "Channel 1 gain"
default 0
depends on SAMA5_ADC_CHAN1
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN2
int "Channel 2 gain"
default 0
depends on SAMA5_ADC_CHAN2
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN3
int "Channel 3 gain"
default 0
depends on SAMA5_ADC_CHAN3
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN4
int "Channel 4 gain"
default 0
depends on SAMA5_ADC_CHAN4
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN5
int "Channel 5 gain"
default 0
depends on SAMA5_ADC_CHAN5
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN6
int "Channel 6 gain"
default 0
depends on SAMA5_ADC_CHAN6
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN7
int "Channel 7 gain"
default 0
depends on SAMA5_ADC_CHAN7
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN8
int "Channel 8 gain"
default 0
depends on SAMA5_ADC_CHAN8
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN9
int "Channel 9 gain"
default 0
depends on SAMA5_ADC_CHAN9
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN10
int "Channel 10 gain"
default 0
depends on SAMA5_ADC_CHAN10
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
config SAMA5_ADC_GAIN11
int "Channel 11 gain"
default 0
depends on SAMA5_ADC_CHAN11
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channel is configured for single ended
mode or as {0.5, 1, 2, 2} if the channel is configured for
differential mode.
endmenu # Channel gain
menu "Channel offsets"
config SAMA5_ADC_OFFSET0
bool "Channel 0 offset"
default n
depends on SAMA5_ADC_CHAN0
---help---
Center the channel 0 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET1
bool "Channel 1 offset"
default n
depends on SAMA5_ADC_CHAN1
---help---
Center the channel 1 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET2
bool "Channel 2 offset"
default n
depends on SAMA5_ADC_CHAN2
---help---
Center the channel 2 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET3
bool "Channel 3 offset"
default n
depends on SAMA5_ADC_CHAN3
---help---
Center the channel 3 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET4
bool "Channel 4 offset"
default n
depends on SAMA5_ADC_CHAN4
---help---
Center the channel 4 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET5
bool "Channel 5 offset"
default n
depends on SAMA5_ADC_CHAN5
---help---
Center the channel 5 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET6
bool "Channel 6 offset"
default n
depends on SAMA5_ADC_CHAN6
---help---
Center the channel 6 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET7
bool "Channel 7 offset"
default n
depends on SAMA5_ADC_CHAN7
---help---
Center the channel 7 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET8
bool "Channel 8 offset"
default n
depends on SAMA5_ADC_CHAN8
---help---
Center the channel 8 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET9
bool "Channel 9 offset"
default n
depends on SAMA5_ADC_CHAN9
---help---
Center the channel 9 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET10
bool "Channel 10 offset"
default n
depends on SAMA5_ADC_CHAN10
---help---
Center the channel 10 analog signal on Vrefin/2 before the gain
scaling.
config SAMA5_ADC_OFFSET11
bool "Channel 11 offset"
default n
depends on SAMA5_ADC_CHAN11
---help---
Center the channel 11 analog signal on Vrefin/2 before the gain
scaling.
endmenu # Channel offsets
menu "Channel differential mode"
config SAMA5_ADC_DIFFMODE0
bool "Channel 0 differential mode"
default n
depends on SAMA5_ADC_CHAN0
---help---
Selects differential (vs. single-ended mode) for ADC channel 0
config SAMA5_ADC_DIFFMODE1
bool "Channel 1 differential mode"
default n
depends on SAMA5_ADC_CHAN1
---help---
Selects differential (vs. single-ended mode) for ADC channel 1
config SAMA5_ADC_DIFFMODE2
bool "Channel 2 differential mode"
default n
depends on SAMA5_ADC_CHAN2
---help---
Selects differential (vs. single-ended mode) for ADC channel 2
config SAMA5_ADC_DIFFMODE3
bool "Channel 3 differential mode"
default n
depends on SAMA5_ADC_CHAN3
---help---
Selects differential (vs. single-ended mode) for ADC channel 3
config SAMA5_ADC_DIFFMODE4
bool "Channel 4 differential mode"
default n
depends on SAMA5_ADC_CHAN4
---help---
Selects differential (vs. single-ended mode) for ADC channel 4
config SAMA5_ADC_DIFFMODE5
bool "Channel 5 differential mode"
default n
depends on SAMA5_ADC_CHAN5
---help---
Selects differential (vs. single-ended mode) for ADC channel 5
config SAMA5_ADC_DIFFMODE6
bool "Channel 6 differential mode"
default n
depends on SAMA5_ADC_CHAN6
---help---
Selects differential (vs. single-ended mode) for ADC channel 6
config SAMA5_ADC_DIFFMODE7
bool "Channel 7 differential mode"
default n
depends on SAMA5_ADC_CHAN7
---help---
Selects differential (vs. single-ended mode) for ADC channel 7
config SAMA5_ADC_DIFFMODE8
bool "Channel 8 differential mode"
default n
depends on SAMA5_ADC_CHAN8
---help---
Selects differential (vs. single-ended mode) for ADC channel 8
config SAMA5_ADC_DIFFMODE9
bool "Channel 9 differential mode"
default n
depends on SAMA5_ADC_CHAN9
---help---
Selects differential (vs. single-ended mode) for ADC channel 9
config SAMA5_ADC_DIFFMODE10
bool "Channel 10 differential mode"
default n
depends on SAMA5_ADC_CHAN10
---help---
Selects differential (vs. single-ended mode) for ADC channel 10
config SAMA5_ADC_DIFFMODE11
bool "Channel 11 differential mode"
default n
depends on SAMA5_ADC_CHAN11
---help---
Selects differential (vs. single-ended mode) for ADC channel 11
endmenu # Differential mode
endif # SAMA5_ADC_ANARCH
if !SAMA5_ADC_ANARCH
config SAMA5_ADC_GAIN
int "Analog gain"
depends on SAMA5_ADC_CHAN0
range 0 3
---help---
Valid gain settings are {0, 1, 2, 3} which may be interpreted as
either {1, 1, 2, 4} if the channels are configured for single ended
mode or as {0.5, 1, 2, 2} if the channels are configured for
differential mode.
config SAMA5_ADC_OFFSET
bool "Offset"
default n
---help---
Center the analog signal on Vrefin/2 before the gain scaling.
config SAMA5_ADC_DIFFMODE
bool "Differential mode"
default n
---help---
Selects differential (vs. single-ended mode)
endif # !SAMA5_ADC_ANARCH
menu "ADC Trigger Selection"
choice
prompt "ADC trigger mode"
default SAMA5_ADC_SWTRIG
---help---
Select the event that will trigger the A-to-D conversion sequence.
config SAMA5_ADC_SWTRIG
bool "Software trigger"
---help---
A-to-D Conversion is initiated only by sofware via an ioctl()
config SAMA5_ADC_ADTRG
bool "External trigger via the ADTRG pin"
---help---
A-to-D Conversion is initiated an event on the ADTRG pin.
config SAMA5_ADC_TIOATRIG
bool "TC0 ouput A trigger"
---help---
A-to-D Conversion is initiated the A output from one of
Timer/Counter 0 channels.
endchoice # Trigger mode
choice
prompt "ADTRG edge"
default SAMA5_ADC_ADTRG_BOTH
depends on SAMA5_ADC_ADTRG
config SAMA5_ADC_ADTRG_RISING
bool "Rising edge"
---help---
Trigger A-to-D conversion on the rising edge of the ADTRG signal.
config SAMA5_ADC_ADTRG_FALLING
bool "Falling edge"
---help---
Trigger A-to-D conversion on the falling edge of the ADTRG signal.
config SAMA5_ADC_ADTRG_BOTH
bool "Both edges"
---help---
Trigger A-to-D conversion on both edges of the ADTRG signal
endchoice # ADTRG edge
if SAMA5_ADC_TIOATRIG
choice
prompt "TC0 channel"
default SAMA5_ADC_TIOA0TRIG
config SAMA5_ADC_TIOA0TRIG
bool "TC0 Channel 0 Output A"
---help---
A-to-D conversion is triggered by the TC0 channel 0 output A signal.
This output must be enabled independently in the Timer/Counter
driver configuration for this to work.
config SAMA5_ADC_TIOA1TRIG
bool "TC0 Channel 1 Output A"
---help---
A-to-D conversion is triggered by the TC0 channel 1 output A signal.
This output must be enabled independently in the Timer/Counter
driver configuration for this to work.
config SAMA5_ADC_TIOA2TRIG
bool "TC0 Channel 2 Output A"
---help---
A-to-D conversion is triggered by the TC0 channel 2 output A signal.
This output must be enabled independently in the Timer/Counter
driver configuration for this to work.
endchoice # TC0 channel
choice
prompt "TIOAx edge"
default SAMA5_ADC_TIOA_BOTH
depends on SAMA5_ADC_ADTRG
config SAMA5_ADC_TIOA_RISING
bool "Rising edge"
---help---
Trigger A-to-D conversion on the rising edge of the TIOAx signal.
config SAMA5_ADC_TIOA_FALLING
bool "Falling edge"
---help---
Trigger A-to-D conversion on the falling edge of the TIOAx signal.
config SAMA5_ADC_TIOA_BOTH
bool "Both edges"
---help---
Trigger A-to-D conversion on both edges of the TIOAx signal
endchoice # ADTRG edge
endif # SAMA5_ADC_TIOATRIG
endmenu # ADC Trigger Selection
endif # SAMA5_ADC_HAVE_CHAN
config SAMA5_ADC_REGDEBUG
bool "Enable register-level ADC/touchscreen debug"
default n
depends on DEBUG
---help---
Enable very low register-level debug output.
endmenu # ADC Configuration
menu "Touchscreen configuration"
config SAMA5_TSD
bool "Touchscreen support"
default n
select INPUT
---help---
Configure the ADC to support a touchscreen
if SAMA5_TSD
choice
prompt "Touchscreen interface"
default SAMA5_TSD_4WIRE
---help---
Select the type of physical interface to the touchscreen
config SAMA5_TSD_4WIRE
bool "4-wire interface (with pressure)"
config SAMA5_TSD_4WIRENPM
bool "4-wire interface (without pressure)"
config SAMA5_TSD_5WIRE
bool "5-wire interface"
endchoice # Touchscreen interface
config SAMA5_TSD_SWAPXY
bool "Swap X/Y"
default n
---help---
Reverse the meaning of X and Y to handle different LCD orientations.
config SAMA5_TSD_THRESHX
int "X threshold"
default 12
---help---
New touch positions will only be reported when the X or Y data
changes by these thresholds. This trades reduces data rate for some
loss in dragging accuracy. For 12-bit values so the raw ranges are
0-4095. So for example, if your display is 320x240, then THRESHX=13
and THRESHY=17 would correspond to one pixel. Default: 12
config SAMA5_TSD_THRESHY
int "Y threshold"
default 12
---help---
New touch positions will only be reported when the X or Y data
changes by these thresholds. This trades reduces data rate for some
loss in dragging accuracy. For 12-bit values so the raw ranges are
0-4095. So for example, if your display is 320x240, then THRESHX=13
and THRESHY=17 would correspond to one pixel. Default: 12
config SAMA_TSD_RXP
int "X-panel resistance"
default 6
depends on SAMA5_TSD_4WIRE
---help---
The method to measure the pressure (Rp) applied to the touchscreen is
based on the known resistance of the X-Panel resistance (Rxp).
config SAMA5_TSD_NPOLLWAITERS
int "Number poll waiters"
default 4
depends on !DISABLE_POLL
---help---
Maximum number of threads that can be waiting on poll()
endif # SAMA5_TSD
endmenu # Touchscreen Configuration
endif # SAMA5_ADC
menu "External Memory Configuration" menu "External Memory Configuration"
config SAMA5_DDRCS config SAMA5_DDRCS

View File

@ -132,6 +132,14 @@ ifeq ($(CONFIG_SAMA5_UDPHS),y)
CHIP_CSRCS += sam_udphs.c CHIP_CSRCS += sam_udphs.c
endif endif
ifeq ($(CONFIG_USBHOST_TRACE),y)
CHIP_CSRCS += sam_usbhost.c
else
ifeq ($(CONFIG_DEBUG_USB),y)
CHIP_CSRCS += sam_usbhost.c
endif
endif
ifeq ($(CONFIG_SAMA5_HSMCI0),y) ifeq ($(CONFIG_SAMA5_HSMCI0),y)
CHIP_CSRCS += sam_hsmci.c CHIP_CSRCS += sam_hsmci.c
else else
@ -166,10 +174,10 @@ endif
endif endif
endif endif
ifeq ($(CONFIG_USBHOST_TRACE),y) ifeq ($(CONFIG_SAMA5_ADC),y)
CHIP_CSRCS += sam_usbhost.c CHIP_CSRCS += sam_adc.c
else else
ifeq ($(CONFIG_DEBUG_USB),y) ifeq ($(CONFIG_SAMA5_TSD),y)
CHIP_CSRCS += sam_usbhost.c CHIP_CSRCS += sam_tsd.c
endif endif
endif endif

View File

@ -70,6 +70,7 @@
#include "chip/sam_adc.h" #include "chip/sam_adc.h"
#include "chip/sam_pmc.h" #include "chip/sam_pmc.h"
#include "sam_dmac.h" #include "sam_dmac.h"
#include "sam_tsd.h"
#include "sam_adc.h" #include "sam_adc.h"
#if defined(CONFIG_SAMA5_ADC) #if defined(CONFIG_SAMA5_ADC)
@ -209,9 +210,9 @@
/* If we are supporting the analog chang feature, then sure that there /* If we are supporting the analog chang feature, then sure that there
* is a gain setting for each enabled channel. * is a gain setting for each enabled channel.
* *
* Valid gain settings are {1, 2, 3, 4} which may be interpreted as * Valid gain settings are {0, 1, 2, 3} which may be interpreted as
* either {1, 1, 2, 4} if the DIFFx bit in COR register is zero or as * either {1, 1, 2, 4} if the DIFFx bit in COR register is zero or as
* {0.5, 1, 2, 2} if the DIFFx bit is zet. * {0.5, 1, 2, 2} if the DIFFx bit is set.
*/ */
#ifdef CONFIG_SAMA5_ADC_ANARCH #ifdef CONFIG_SAMA5_ADC_ANARCH
@ -283,7 +284,7 @@
* available if the touch screen is enabled * available if the touch screen is enabled
*/ */
#ifdef CONFIG_SAMA5_TOUCHSCREEN #ifdef CONFIG_SAMA5_TSD
# ifdef CONFIG_SAMA5_TSD_5WIRE # ifdef CONFIG_SAMA5_TSD_5WIRE
# SAMA5_ADC_CHALL (ADC_CHALL & ~TSD_5WIRE_ALL) # SAMA5_ADC_CHALL (ADC_CHALL & ~TSD_5WIRE_ALL)
# else # else
@ -362,18 +363,20 @@
struct sam_adc_s struct sam_adc_s
{ {
sem_t exclsem; /* Supports exclusive access to the ADC interface */ sem_t exclsem; /* Supports exclusive access to the ADC interface */
bool initialized; /* The ADC driver is already initialized */
#ifdef SAMA5_ADC_HAVE_CHANNELS #ifdef SAMA5_ADC_HAVE_CHANNELS
#ifdef CONFIG_SAMA5_ADC_DMA #ifdef CONFIG_SAMA5_ADC_DMA
volatile bool odd; /* Odd buffer is in use */ volatile bool odd; /* Odd buffer is in use */
volatile bool ready; /* Worker has completed the last set of samples */ volatile bool ready; /* Worker has completed the last set of samples */
volatile bool enabled; /* DMA data transfer is enabled */
#endif #endif
struct adc_dev_s dev; /* The external via of the ADC device */ struct adc_dev_s dev; /* The external via of the ADC device */
uint32_t pending; /* Pending EOC events */ uint32_t pending; /* Pending EOC events */
struct work_s work; /* Supports the interrupt handling "bottom half" */ struct work_s work; /* Supports the interrupt handling "bottom half" */
#ifdef CONFIG_SAMA5_ADC_DMA #ifdef CONFIG_SAMA5_ADC_DMA
DMA_HANDLE dma; /* Handle for DMA channel */ DMA_HANDLE dma; /* Handle for DMA channel */
#endif #endif
/* DMA sample data buffer */ /* DMA sample data buffer */
@ -387,10 +390,10 @@ struct sam_adc_s
/* Debug stuff */ /* Debug stuff */
#ifdef CONFIG_SAMA5_ADC_REGDEBUG #ifdef CONFIG_SAMA5_ADC_REGDEBUG
bool wrlast; /* Last was a write */ bool wrlast; /* Last was a write */
uintptr_t addrlast; /* Last address */ uintptr_t addrlast; /* Last address */
uint32_t vallast; /* Last value */ uint32_t vallast; /* Last value */
int ntimes; /* Number of times */ int ntimes; /* Number of times */
#endif #endif
}; };
@ -576,30 +579,35 @@ static void sam_adc_dmadone(void *arg)
ASSERT(priv != NULL && !priv->ready); ASSERT(priv != NULL && !priv->ready);
/* Select the completed DMA buffer */ /* If the DMA is disabled, just ignore the data */
buffer = priv->odd ? priv->evenbuf : priv->oddbuf; if (!priv->enabled)
{
/* Select the completed DMA buffer */
/* Invalidate the DMA buffer so that we are guaranteed to reload the buffer = priv->odd ? priv->evenbuf : priv->oddbuf;
* newly DMAed data from RAM.
*/
cp15_invalidate_dcache((uintptr_t)buffer, /* Invalidate the DMA buffer so that we are guaranteed to reload the
(uintptr_t)buffer + SAMA5_NCHANNELS * sizeof(uint32_t)); * newly DMAed data from RAM.
*/
/* Process each sample */ cp15_invalidate_dcache((uintptr_t)buffer,
(uintptr_t)buffer + SAMA5_NCHANNELS * sizeof(uint32_t));
for (i = 0; i < SAMA5_NCHANNELS; i++, buffer++) /* Process each sample */
{
/* Get the sample and the channel number */
chan = (int)((*buffer & ADC_LCDR_CHANB_MASK) >> ADC_LCDR_CHANB_SHIFT); for (i = 0; i < SAMA5_NCHANNELS; i++, buffer++)
sample = (uint16_t)((*buffer & ADC_LCDR_DATA_MASK) >> ADC_LCDR_DATA_SHIFT); {
/* Get the sample and the channel number */
/* And give the sample data to the ADC upper half */ chan = (int)((*buffer & ADC_LCDR_CHANB_MASK) >> ADC_LCDR_CHANB_SHIFT);
sample = (uint16_t)((*buffer & ADC_LCDR_DATA_MASK) >> ADC_LCDR_DATA_SHIFT);
(void)adc_receive(&priv->dev, chan, sample); /* And give the sample data to the ADC upper half */
}
(void)adc_receive(&priv->dev, chan, sample);
}
}
/* We are ready to handle the next sample sequence */ /* We are ready to handle the next sample sequence */
@ -624,7 +632,7 @@ static void sam_adc_dmacallback(DMA_HANDLE handle, void *arg, int result)
/* Check of the bottom half is keeping up with us */ /* Check of the bottom half is keeping up with us */
if (priv->ready) if (priv->ready && priv->enabled)
{ {
/* Toggle to the next buffer. Note that the toggle only occurs if /* Toggle to the next buffer. Note that the toggle only occurs if
* the bottom half is ready to accept more data. Otherwise, we * the bottom half is ready to accept more data. Otherwise, we
@ -640,7 +648,7 @@ static void sam_adc_dmacallback(DMA_HANDLE handle, void *arg, int result)
ret = work_queue(HPWORK, &priv->work, sam_adc_dmadone, priv, 0); ret = work_queue(HPWORK, &priv->work, sam_adc_dmadone, priv, 0);
if (ret != 0) if (ret != 0)
{ {
illdbg("ERROR: Failed to queue work: %d\n", ret); alldbg("ERROR: Failed to queue work: %d\n", ret);
} }
} }
@ -692,16 +700,9 @@ static int sam_adc_dmasetup(FAR struct sam_adc_s *priv, FAR uint8_t *buffer,
sam_dmarxsetup(priv->dma, paddr, maddr, buflen); sam_dmarxsetup(priv->dma, paddr, maddr, buflen);
/* Enable DMA handshaking */
#warning Missing logic
/* Start the DMA */ /* Start the DMA */
sam_dmastart(priv->dma, sam_adc_dmacallback, priv); sam_dmastart(priv->dma, sam_adc_dmacallback, priv);
/* Configure DMA-related interrupts */
#warning Missing loic
return OK; return OK;
} }
#endif #endif
@ -797,7 +798,7 @@ static int sam_adc_interrupt(int irq, void *context)
/* Handle pending touchscreen interrupts */ /* Handle pending touchscreen interrupts */
#ifdef CONFIG_SAMA5_TOUCHSCREEN #ifdef CONFIG_SAMA5_TSD
if ((pending & ADC_TSD_INTS) != 0) if ((pending & ADC_TSD_INTS) != 0)
{ {
/* Let the touchscreen handle its interrupts */ /* Let the touchscreen handle its interrupts */
@ -833,7 +834,7 @@ static int sam_adc_interrupt(int irq, void *context)
ret = work_queue(HPWORK, &priv->work, sam_adc_endconversion, priv, 0); ret = work_queue(HPWORK, &priv->work, sam_adc_endconversion, priv, 0);
if (ret != 0) if (ret != 0)
{ {
illdbg("ERROR: Failed to queue work: %d\n", ret); alldbg("ERROR: Failed to queue work: %d\n", ret);
} }
pending &= ~ADC_INT_EOCALL; pending &= ~ADC_INT_EOCALL;
@ -867,6 +868,10 @@ static void sam_adc_reset(struct adc_dev_s *dev)
* touchscreen configuration. * touchscreen configuration.
*/ */
/* Stop any DMA */
dma_stop(priv->dma);
/* Disable all EOC interrupts */ /* Disable all EOC interrupts */
sam_adc_putreg(priv, SAM_ADC_IDR, ADC_INT_EOCALL); sam_adc_putreg(priv, SAM_ADC_IDR, ADC_INT_EOCALL);
@ -886,8 +891,18 @@ static void sam_adc_reset(struct adc_dev_s *dev)
sam_adc_putreg(priv, SAM_CGR_MR, 0); sam_adc_putreg(priv, SAM_CGR_MR, 0);
sam_adc_putreg(priv, SAM_COR_MR, 0); sam_adc_putreg(priv, SAM_COR_MR, 0);
/* trigger mode, etc */ #ifndef CONFIG_SAMA5_ADC_SWTRIG
#warning Missing logic /* Select software trigger (i.e., basically no trigger) */
regval = sam_adc_getreg(priv->dev, SAM_ADC_MR);
regval &= ~ADC_MR_TRGSEL_MASK;
sam_adc_putreg(priv->dev, SAM_ADC_MR, regval);
regval = sam_adc_getreg(priv, SAM_ADC_TRGR);
regval &= ~ADC_TRGR_TRGMOD_MASK;
regval |= ADC_TRGR_TRGMOD_NO_TRIGGER;
sam_adc_putreg(priv, SAM_ADC_TRGR, regval);
#endif
} }
/**************************************************************************** /****************************************************************************
@ -943,7 +958,10 @@ static int sam_adc_setup(struct adc_dev_s *dev)
#ifdef CONFIG_SAMA5_ADC_DMA #ifdef CONFIG_SAMA5_ADC_DMA
/* Configure for DMA transfer */ /* Configure for DMA transfer */
priv->odd = false; priv->odd = false;
priv->ready = true;
priv->enabled = false;
sam_adc_dmasetup(priv->dma, (void *)priv->evenbuf, SAMA5_NCHANNELS); sam_adc_dmasetup(priv->dma, (void *)priv->evenbuf, SAMA5_NCHANNELS);
#else #else
/* Enable end-of-conversion interrupts for all enabled channels. */ /* Enable end-of-conversion interrupts for all enabled channels. */
@ -994,6 +1012,12 @@ static void sam_adc_rxint(struct adc_dev_s *dev, bool enable)
{ {
struct sam_adc_s *priv = (struct sam_adc_s *)dev->ad_priv; struct sam_adc_s *priv = (struct sam_adc_s *)dev->ad_priv;
#ifdef CONFIG_SAMA5_ADC_DMA
/* We don't stop the DMA when RX is disabled, we just stop the data transfer */
priv->enabled = enable;
#else
/* Are we enabling or disabling? */ /* Are we enabling or disabling? */
if (enable) if (enable)
@ -1008,6 +1032,7 @@ static void sam_adc_rxint(struct adc_dev_s *dev, bool enable)
sam_adc_putreg32(priv, SAM_ADC_IDR, ADC_INT_EOCALL); sam_adc_putreg32(priv, SAM_ADC_IDR, ADC_INT_EOCALL);
} }
#endif
} }
/**************************************************************************** /****************************************************************************
@ -1103,7 +1128,7 @@ static void sam_adc_trigger(struct sam_adc_s *priv)
regval |= ADC_MR_TRGSEL_TIOA0; /* Timer/counter 0 channel 0 output A */ regval |= ADC_MR_TRGSEL_TIOA0; /* Timer/counter 0 channel 0 output A */
#elif defined(CONFIG_SAMA5_ADC_TIOA1TRIG) #elif defined(CONFIG_SAMA5_ADC_TIOA1TRIG)
regval |= ADC_MR_TRGSEL_TIOA1; /* Timer/counter 0 channel 1 output A */ regval |= ADC_MR_TRGSEL_TIOA1; /* Timer/counter 0 channel 1 output A */
#elif defined(CONFIG_SAMA5_ADC_TIOA0TRIG) #elif defined(CONFIG_SAMA5_ADC_TIOA2TRIG)
regval |= ADC_MR_TRGSEL_TIOA2; /* Timer/counter 0 channel 2 output A */ regval |= ADC_MR_TRGSEL_TIOA2; /* Timer/counter 0 channel 2 output A */
#else #else
# error Timer/counter for trigger not defined # error Timer/counter for trigger not defined
@ -1173,7 +1198,7 @@ static void sam_adc_offset(struct sam_adc_s *priv)
uint32_t regval = 0; uint32_t regval = 0;
#ifdef CONFIG_SAMA5_ADC_ANARCH #ifdef CONFIG_SAMA5_ADC_ANARCH
/* Set the offset for each enabled channel. This xenters the analog signal /* Set the offset for each enabled channel. This centers the analog signal
* on Vrefin/2 before the gain scaling. The Offset applied is: (G-1)Vrefin/2 * on Vrefin/2 before the gain scaling. The Offset applied is: (G-1)Vrefin/2
* where G is the gain applied. The default is no offset. * where G is the gain applied. The default is no offset.
*/ */
@ -1257,7 +1282,7 @@ static void sam_adc_offset(struct sam_adc_s *priv)
#endif #endif
#else #else
/* Set offset and differentila mode only on channel 0. This will be /* Set offset and differential mode only on channel 0. This will be
* used for all channel. * used for all channel.
*/ */
@ -1588,124 +1613,137 @@ static void sam_adc_channels(truct sam_adc_s *priv)
struct adc_dev_s *sam_adc_initialize(void) struct adc_dev_s *sam_adc_initialize(void)
{ {
/* Disable ADC peripheral clock */ struct sam_adc_s *priv = &g_adcpriv;
sam_adc_disableclk(); /* Have we already been initialzed? If yes, than just hand out the
* interface one more time.
*/
/* Configure ADC pins */ if (!priv->initialized)
{
/* Disable ADC peripheral clock */
sam_adc_disableclk();
/* Configure ADC pins */
#ifdef CONFIG_SAMA5_ADC_CHAN0 #ifdef CONFIG_SAMA5_ADC_CHAN0
sam_configpio(PIO_ADC_AD0); sam_configpio(PIO_ADC_AD0);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN1 #ifdef CONFIG_SAMA5_ADC_CHAN1
sam_configpio(PIO_ADC_AD1); sam_configpio(PIO_ADC_AD1);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN2 #ifdef CONFIG_SAMA5_ADC_CHAN2
sam_configpio(PIO_ADC_AD2); sam_configpio(PIO_ADC_AD2);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN3 #ifdef CONFIG_SAMA5_ADC_CHAN3
sam_configpio(PIO_ADC_AD3); sam_configpio(PIO_ADC_AD3);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN4 #ifdef CONFIG_SAMA5_ADC_CHAN4
sam_configpio(PIO_ADC_AD4); sam_configpio(PIO_ADC_AD4);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN5 #ifdef CONFIG_SAMA5_ADC_CHAN5
sam_configpio(PIO_ADC_AD5); sam_configpio(PIO_ADC_AD5);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN6 #ifdef CONFIG_SAMA5_ADC_CHAN6
sam_configpio(PIO_ADC_AD6); sam_configpio(PIO_ADC_AD6);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN7 #ifdef CONFIG_SAMA5_ADC_CHAN7
sam_configpio(PIO_ADC_AD7); sam_configpio(PIO_ADC_AD7);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN8 #ifdef CONFIG_SAMA5_ADC_CHAN8
sam_configpio(PIO_ADC_AD8); sam_configpio(PIO_ADC_AD8);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN9 #ifdef CONFIG_SAMA5_ADC_CHAN9
sam_configpio(PIO_ADC_AD9); sam_configpio(PIO_ADC_AD9);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN10 #ifdef CONFIG_SAMA5_ADC_CHAN10
sam_configpio(PIO_ADC_AD10); sam_configpio(PIO_ADC_AD10);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_CHAN11 #ifdef CONFIG_SAMA5_ADC_CHAN11
sam_configpio(PIO_ADC_AD11); sam_configpio(PIO_ADC_AD11);
#endif #endif
#ifdef CONFIG_SAMA5_ADC_ADTRG #ifdef CONFIG_SAMA5_ADC_ADTRG
sam_configpio(PIO_ADC_TRG); sam_configpio(PIO_ADC_TRG);
#endif #endif
/* Initialize the ADC device data structure */ /* Initialize the ADC device data structure */
sem_init(&priv->exclsem, 0, 1); sem_init(&priv->exclsem, 0, 1);
#ifdef CONFIG_SAMA5_ADC_DMA #ifdef CONFIG_SAMA5_ADC_DMA
/* Allocate a DMA channel */ /* Allocate a DMA channel */
priv->dma = sam_dmachannel(dmac, DMA_FLAGS); priv->dma = sam_dmachannel(dmac, DMA_FLAGS);
DEBUGASSERT(priv->dma); DEBUGASSERT(priv->dma);
#endif #endif
/* Set the maximum ADC peripheral clock frequency */ /* Set the maximum ADC peripheral clock frequency */
regval = PMC_PCR_PID(SAM_PID_ADC) | PMC_PCR_CMD | ADC_PCR_DIV | PMC_PCR_EN; regval = PMC_PCR_PID(SAM_PID_ADC) | PMC_PCR_CMD | ADC_PCR_DIV | PMC_PCR_EN;
sam_adc_putreg(priv, SAM_PMC_PCR, regval); sam_adc_putreg(priv, SAM_PMC_PCR, regval);
/* Enable the ADC peripheral clock*/ /* Enable the ADC peripheral clock*/
sam_adc_enableclk(); sam_adc_enableclk();
/* Reset the ADC controller */ /* Reset the ADC controller */
sam_adc_putreg(priv, SAM_ADC_CR, ADC_CR_SWRST); sam_adc_putreg(priv, SAM_ADC_CR, ADC_CR_SWRST);
/* Reset Mode Register */ /* Reset Mode Register */
sam_adc_putreg(priv, SAM_ADC_MR, 0); sam_adc_putreg(priv, SAM_ADC_MR, 0);
/* Set the MCK clock prescaler: ADCClock = MCK / ((PRESCAL+1)*2) */ /* Set the MCK clock prescaler: ADCClock = MCK / ((PRESCAL+1)*2) */
regval = sam_adc_getreg(priv, SAM_ADC_MR); regval = sam_adc_getreg(priv, SAM_ADC_MR);
regval &= ~ADC_MR_PRESCAL_MASK; regval &= ~ADC_MR_PRESCAL_MASK;
regval |= ADC_MR_PRESCAL(BOARD_ADC_PRESCAL); regval |= ADC_MR_PRESCAL(BOARD_ADC_PRESCAL);
sam_adc_putreg(priv, SAM_ADC_MR, regval); sam_adc_putreg(priv, SAM_ADC_MR, regval);
/* Formula: /* Formula:
* Startup Time = startup value / ADCClock * Startup Time = startup value / ADCClock
* Transfer Time = (TRANSFER * 2 + 3) / ADCClock * Transfer Time = (TRANSFER * 2 + 3) / ADCClock
* Tracking Time = (TRACKTIM + 1) / ADCClock * Tracking Time = (TRACKTIM + 1) / ADCClock
* Settling Time = settling value / ADCClock * Settling Time = settling value / ADCClock
* For example, ADC clock = 6MHz (166.7 ns) * For example, ADC clock = 6MHz (166.7 ns)
* Startup time = 512 / 6MHz = 85.3 us * Startup time = 512 / 6MHz = 85.3 us
* Transfer Time = (1 * 2 + 3) / 6MHz = 833.3 ns * Transfer Time = (1 * 2 + 3) / 6MHz = 833.3 ns
* Tracking Time = (0 + 1) / 6MHz = 166.7 ns * Tracking Time = (0 + 1) / 6MHz = 166.7 ns
* Settling Time = 3 / 6MHz = 500 ns * Settling Time = 3 / 6MHz = 500 ns
*/ */
/* Set ADC timing */ /* Set ADC timing */
regval = sam_adc_getreg(priv, SAM_ADC_MR); regval = sam_adc_getreg(priv, SAM_ADC_MR);
regval &= ~(ADC_MR_STARTUP_MASK | ADC_MR_TRACKTIM_MASK | ADC_MR_SETTLING_MASK); regval &= ~(ADC_MR_STARTUP_MASK | ADC_MR_TRACKTIM_MASK | ADC_MR_SETTLING_MASK);
regval |= ADC_MR_STARTUP_SUT512 | ADC_MR_TRACKTIM(0) | ADC_MR_SETTLING_AST17; regval |= ADC_MR_STARTUP_SUT512 | ADC_MR_TRACKTIM(0) | ADC_MR_SETTLING_AST17;
sam_adc_puttreg(priv, SAM_ADC_MR, regval); sam_adc_puttreg(priv, SAM_ADC_MR, regval);
/* Attach the ADC interrupt */ /* Attach the ADC interrupt */
ret = irq_attach(SAM_IRQ_ADC, sam_adc_interrupt); ret = irq_attach(SAM_IRQ_ADC, sam_adc_interrupt);
if (ret < 0) if (ret < 0)
{ {
adbg("ERROR: Failed to attach IRQ %d: %d\n", SAM_IRQ_ADC, ret); adbg("ERROR: Failed to attach IRQ %d: %d\n", SAM_IRQ_ADC, ret);
return ret; return NULL;
}
/* Disable all ADC interrupts at the source */
sam_adc_putreg(priv, SAM_ADC_IDR, ADC_INT_ALL);
/* Enable the ADC interrupt at the AIC */
up_enable_irq(SAM_IRQ_ADC);
/* Now we are initialized */
priv->intialized = true;
} }
/* Disable all ADC interrupts at the source */
sam_adc_putreg(priv, SAM_ADC_IDR, ADC_INT_ALL);
/* Enable the ADC interrupt at the AIC */
up_enable_irq(SAM_IRQ_ADC);
/* Return a pointer to the device structure */ /* Return a pointer to the device structure */
return &g_adcdev; return &g_adcdev;

View File

@ -62,12 +62,12 @@
* support is enabled. * support is enabled.
*/ */
#ifdef CONFIG_SAMA5_TOUCHSCREEN #ifdef CONFIG_SAMA5_TSD
# undef CONFIG_SAMA5_ADC_CHAN0 # undef CONFIG_SAMA5_ADC_CHAN0
# undef CONFIG_SAMA5_ADC_CHAN1 # undef CONFIG_SAMA5_ADC_CHAN1
# undef CONFIG_SAMA5_ADC_CHAN2 # undef CONFIG_SAMA5_ADC_CHAN2
# undef CONFIG_SAMA5_ADC_CHAN3 # undef CONFIG_SAMA5_ADC_CHAN3
# ifdef CONFIG_SAMA5_TOUCHSCREEN_5WIRE # ifdef CONFIG_SAMA5_TSD_5WIRE
# undef CONFIG_SAMA5_ADC_CHAN4 # undef CONFIG_SAMA5_ADC_CHAN4
# endif # endif
#endif #endif
@ -84,7 +84,7 @@
defined(CONFIG_SAMA5_ADC_CHAN8) || defined(CONFIG_SAMA5_ADC_CHAN9) || \ defined(CONFIG_SAMA5_ADC_CHAN8) || defined(CONFIG_SAMA5_ADC_CHAN9) || \
defined(CONFIG_SAMA5_ADC_CHAN10) || defined(CONFIG_SAMA5_ADC_CHAN11) defined(CONFIG_SAMA5_ADC_CHAN10) || defined(CONFIG_SAMA5_ADC_CHAN11)
# define SAMA5_ADC_HAVE_CHANNELS 1 # define SAMA5_ADC_HAVE_CHANNELS 1
#elif !defined(CONFIG_SAMA5_TOUCHSCREEN) #elif !defined(CONFIG_SAMA5_TSD)
# error "No ADC channels nor touchscreen" # error "No ADC channels nor touchscreen"
#endif #endif

View File

@ -1,5 +1,5 @@
/**************************************************************************** /****************************************************************************
* arch/arm/src/sama5/sam_touchsreen.c * arch/arm/src/sama5/sam_tsd.c
* *
* Copyright (C) 2013 Gregory Nutt. All rights reserved. * Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Authors: Gregory Nutt <gnutt@nuttx.org> * Authors: Gregory Nutt <gnutt@nuttx.org>
@ -65,9 +65,9 @@
#include <nuttx/input/touchscreen.h> #include <nuttx/input/touchscreen.h>
#include "sam_touchscreen.h" #include "sam_tsd.h"
#if defined(CONFIG_SAMA5_ADC) && defined(CONFIG_SAMA5_TOUCHSCREEN) #if defined(CONFIG_SAMA5_ADC) && defined(CONFIG_SAMA5_TSD)
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@ -929,7 +929,7 @@ static int sam_tsd_close(struct file *filep)
FAR struct watchdog_upperhalf_s *priv = inode->i_private; FAR struct watchdog_upperhalf_s *priv = inode->i_private;
int ret; int ret;
wdvdbg("crefs: %d\n", priv->crefs); ivdbg("crefs: %d\n", priv->crefs);
/* Get exclusive access to the device structures */ /* Get exclusive access to the device structures */
@ -1780,4 +1780,4 @@ void sam_tsd_interrupt(uint32_t pending)
return ret; return ret;
} }
#endif /* CONFIG_SAMA5_ADC && CONFIG_SAMA5_TOUCHSCREEN */ #endif /* CONFIG_SAMA5_ADC && CONFIG_SAMA5_TSD */

View File

@ -1,5 +1,5 @@
/**************************************************************************** /****************************************************************************
* arch/arm/src/sama5/sam_adc.h * arch/arm/src/sama5/sam_tsd.h
* *
* Copyright (C) 2013 Gregory Nutt. All rights reserved. * Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
@ -33,8 +33,8 @@
* *
****************************************************************************/ ****************************************************************************/
#ifndef __ARCH_ARM_SRC_SAMA5_SAM_ADC_H #ifndef __ARCH_ARM_SRC_SAMA5_SAM_TSD_H
#define __ARCH_ARM_SRC_SAMA5_SAM_ADC_H #define __ARCH_ARM_SRC_SAMA5_SAM_TSD_H
/**************************************************************************** /****************************************************************************
* Included Files * Included Files
@ -43,7 +43,7 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include "chip/sam_adc.h" #include "chip/sam_adc.h"
#if defined(CONFIG_SAMA5_ADC) && defined(CONFIG_SAMA5_TOUCHSCREEN) #if defined(CONFIG_SAMA5_ADC) && defined(CONFIG_SAMA5_TSD)
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@ -119,5 +119,5 @@ void sam_tsd_interrupt(uint32_t pending);
} }
#endif #endif
#endif /* CONFIG_SAMA5_ADC && CONFIG_SAMA5_TOUCHSCREEN */ #endif /* CONFIG_SAMA5_ADC && CONFIG_SAMA5_TSD */
#endif /* __ARCH_ARM_SRC_SAMA5_SAM_ADC_H */ #endif /* __ARCH_ARM_SRC_SAMA5_SAM_TSD_H */

View File

@ -42,6 +42,14 @@ config SAMA5_NOR_START
option: If SAMA5_NOR_START is defined, then it will not wait but option: If SAMA5_NOR_START is defined, then it will not wait but
will, instead, immediately start the program in NOR FLASH. will, instead, immediately start the program in NOR FLASH.
config SAMA5_TSD_DEVMINOR
int "Touchscreen device minor"
default 0
depends on SAMA5_TSD
---help---
This touchscreen will be register as /dev/inputN where the value of
N is provided by this configuration setting.
config SAMA5_AT25_AUTOMOUNT config SAMA5_AT25_AUTOMOUNT
bool "AT25 serial FLASH auto-mount" bool "AT25 serial FLASH auto-mount"
default n default n

View File

@ -1836,7 +1836,7 @@ Configurations
nsh> cat /mnt/at24/atest.txt nsh> cat /mnt/at24/atest.txt
This is a test This is a test
13. I2C Tool. NuttX supports an I2C tool at apps/system/i2c that can be 14. I2C Tool. NuttX supports an I2C tool at apps/system/i2c that can be
used to peek and poke I2C devices. That tool cal be enabled by used to peek and poke I2C devices. That tool cal be enabled by
setting the following: setting the following:
@ -1910,7 +1910,7 @@ Configurations
Address 0x1a is the WM8904. Address 0x39 is the SIL9022A. I am Address 0x1a is the WM8904. Address 0x39 is the SIL9022A. I am
not sure what is at address 0x3d and 0x60 not sure what is at address 0x3d and 0x60
14. Networking support via the can be added to NSH be selecting the 15. Networking support via the can be added to NSH be selecting the
following configuration options. The SAMA5D3x supports two different following configuration options. The SAMA5D3x supports two different
Ethernet MAC peripherals: (1) The 10/100Base-T EMAC peripheral and Ethernet MAC peripherals: (1) The 10/100Base-T EMAC peripheral and
and (2) the 10/100/1000Base-T GMAC peripheral. Only the SAMA5D31 and (2) the 10/100/1000Base-T GMAC peripheral. Only the SAMA5D31
@ -2083,7 +2083,38 @@ Configurations
This delay will be especially long if the board is not connected to This delay will be especially long if the board is not connected to
a network. a network.
16. You can enable the touchscreen by modifying the configuration
in the following ways:
System Type:
CONFIG_SAMA5_ADC=y : ADC support is required
CONFIG_SAMA5_TSD=y : Enabled touchcreen device support
SAMA5_TSD_4WIRE=y : 4-Wire interface with pressure
You might want to tinker with the SWAPXY and THRESHX and THRESHY
settings to get the result that you want.
Drivers:
CONFIG_INPUT=y : (automatically selected)
Board Selection:
CONFIG_SAMA5_TSD_DEVMINOR=0 : Register as /dev/input0
Library Support:
CONFIG_SCHED_WORKQUEUE=y : Work queue support required
These options may also be applied to enable a built-in touchscreen
test application:
Applicaton Configuration:
CONFIG_EXAMPLES_TOUCHSCREEN=y : Enable the touchscreen built-int test
CONFIG_EXAMPLES_TOUCHSCREEN_MINOR=0 : To match the board selection
CONFIG_EXAMPLES_TOUCHSCREEN_DEVPATH="/dev/input0"
Defaults should be okay for all related settings.
STATUS: STATUS:
PCK FREQUENCY PCK FREQUENCY
2013-7-19: This configuration (as do the others) run at 396MHz. 2013-7-19: This configuration (as do the others) run at 396MHz.
The SAMA5D3 can run at 536MHz. I still need to figure out the The SAMA5D3 can run at 536MHz. I still need to figure out the

View File

@ -43,6 +43,7 @@ CONFIG_RAW_BINARY=y
# Debug Options # Debug Options
# #
# CONFIG_DEBUG is not set # CONFIG_DEBUG is not set
CONFIG_ARCH_HAVE_STACKCHECK=y
# CONFIG_DEBUG_SYMBOLS is not set # CONFIG_DEBUG_SYMBOLS is not set
# #
@ -503,7 +504,6 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024
# #
# CONFIG_EXAMPLES_BUTTONS is not set # CONFIG_EXAMPLES_BUTTONS is not set
# CONFIG_EXAMPLES_CAN is not set # CONFIG_EXAMPLES_CAN is not set
# CONFIG_SYSTEM_COMPOSITE is not set
# CONFIG_EXAMPLES_CXXTEST is not set # CONFIG_EXAMPLES_CXXTEST is not set
# CONFIG_EXAMPLES_DHCPD is not set # CONFIG_EXAMPLES_DHCPD is not set
# CONFIG_EXAMPLES_ELF is not set # CONFIG_EXAMPLES_ELF is not set
@ -551,7 +551,6 @@ CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
# CONFIG_EXAMPLES_UDP is not set # CONFIG_EXAMPLES_UDP is not set
# CONFIG_EXAMPLES_UIP is not set # CONFIG_EXAMPLES_UIP is not set
# CONFIG_EXAMPLES_USBSERIAL is not set # CONFIG_EXAMPLES_USBSERIAL is not set
# CONFIG_SYSTEM_USBMSC is not set
# CONFIG_EXAMPLES_USBTERM is not set # CONFIG_EXAMPLES_USBTERM is not set
# CONFIG_EXAMPLES_WATCHDOG is not set # CONFIG_EXAMPLES_WATCHDOG is not set
@ -669,6 +668,14 @@ CONFIG_NSH_CONSOLE=y
# System NSH Add-Ons # System NSH Add-Ons
# #
#
# USB CDC/ACM Device Commands
#
#
# USB Composite Device Commands
#
# #
# Custom Free Memory Command # Custom Free Memory Command
# #
@ -722,6 +729,14 @@ CONFIG_READLINE_ECHO=y
# USB Monitor # USB Monitor
# #
#
# Stack Monitor
#
#
# USB Mass Storage Device Commands
#
# #
# Zmodem Commands # Zmodem Commands
# #

View File

@ -114,6 +114,10 @@ ifeq ($(CONFIG_ARCH_FPU),y)
CSRCS += sam_ostest.c CSRCS += sam_ostest.c
endif endif
ifeq ($(CONFIG_SAMA5_TSD),y)
CSRCS += sam_touchscreen.c
endif
ifeq ($(CONFIG_ARCH_LEDS),y) ifeq ($(CONFIG_ARCH_LEDS),y)
CSRCS += sam_autoleds.c CSRCS += sam_autoleds.c
else else

View File

@ -0,0 +1,163 @@
/************************************************************************************
* configs/sama5d3-ek/src/sam_touchscreen.c
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
************************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <debug.h>
#include "sam_adc.h"
#include "sam_tsd.h"
#include "sama5d3x-ek.h"
#ifdef CONFIG_SAMA5_TSD
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
#ifndef CONFIG_INPUT
# error "Touchscreen support requires CONFIG_INPUT"
#endif
#ifndef CONFIG_SAMA5_TSD_DEVMINOR
# define CONFIG_SAMA5_TSD_DEVMINOR 0
#endif
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: arch_tcinitialize
*
* Description:
* Each board that supports a touchscreen device must provide this
* function. This function is called by application-specific, setup logic
* to configure the touchscreen device. This function will register the
* driver as /dev/inputN where N is the minor device number.
*
* Input Parameters:
* minor - The input device minor number
*
* Returned Value:
* Zero is returned on success. Otherwise, a negated errno value is
* returned to indicate the nature of the failure.
*
****************************************************************************/
int arch_tcinitialize(int minor)
{
struct sam_adc_s *adc;
static bool initialized = false;
FAR struct spi_dev_s *dev;
int ret;
idbg("initialized:%d minor:%d\n", initialized, minor);
DEBUGASSERT(minor == 0);
/* Since there is no uninitialized logic, this initialization can be
* performed only one time.
*/
if (!initialized)
{
/* Initialize the ADC driver */
adc = sam_adcinitialize();
if (!adc)
{
idbg("ERROR: Failed to initialize the ADC driver\n");
return -ENODEV;
}
/* Initialize and register the SPI touchscreen device */
ret = sam_tsd_register(adc, CONFIG_SAMA5_TSD_DEVMINOR);
if (ret < 0)
{
idbg("ERROR: Failed to register touchscreen device /dev/input%d: %d\n",
CONFIG_SAMA5_TSD_DEVMINOR, ret);
return -ENODEV;
}
initialized = true;
}
return OK;
}
/****************************************************************************
* Name: arch_tcuninitialize
*
* Description:
* Each board that supports a touchscreen device must provide this function.
* This function is called by application-specific, setup logic to
* uninitialize the touchscreen device.
*
* Input Parameters:
* None
*
* Returned Value:
* None.
*
****************************************************************************/
void arch_tcuninitialize(void)
{
/* No support for un-initializing the touchscreen yet */
}
#endif /* CONFIG_INPUT_ADS7843E */