1 /*******************************************************************************
\r
2 * (c) Copyright 2009 Actel Corporation. All rights reserved.
\r
4 * SVN $Revision: 2905 $
\r
5 * SVN $Date: 2010-08-20 14:03:28 +0100 (Fri, 20 Aug 2010) $
\r
8 #include "mss_ace_configurator.h"
\r
9 #include "../../drivers_config/mss_ace/ace_handles.h"
\r
10 #include "../../drivers_config/mss_ace/ace_config.h"
\r
12 #include "../../CMSIS/a2fxxxm3.h"
\r
13 #include "../../CMSIS/mss_assert.h"
\r
20 #define SSE_START 1uL
\r
21 #define SSE_STOP 0uL
\r
23 #define NB_OF_ANALOG_BLOCKS 3u
\r
24 #define SEE_RAM_WORD_SIZE 512
\r
26 #define TS_ENABLE_MASK 0x01u
\r
27 #define PPE_ENABLE_MASK 0x01u
\r
28 #define ADC_RESET_MASK 0x10u
\r
29 #define ADC_FIFO_CLR_MASK 0x04u
\r
30 #define PDMA_DATAOUT_CLR_MASK 0x04u
\r
33 /*-------------------------------------------------------------------------*//**
\r
36 extern ace_procedure_desc_t g_sse_sequences_desc_table[ACE_NB_OF_SSE_PROCEDURES];
\r
38 /*-------------------------------------------------------------------------*//**
\r
41 sse_sequence_handle_t
\r
42 ACE_get_sse_seq_handle
\r
44 const uint8_t * p_sz_sequence_name
\r
48 sse_sequence_handle_t handle = INVALID_SSE_SEQ_HANDLE;
\r
50 for ( seq_idx = 0u; seq_idx < (uint32_t)ACE_NB_OF_SSE_PROCEDURES; ++seq_idx )
\r
52 if ( g_sse_sequences_desc_table[seq_idx].p_sz_proc_name != 0 )
\r
55 diff = strncmp( (const char *)p_sz_sequence_name, (const char *)g_sse_sequences_desc_table[seq_idx].p_sz_proc_name, MAX_PROCEDURE_NAME_LENGTH );
\r
58 /* channel name found. */
\r
67 /*-------------------------------------------------------------------------*//**
\r
70 static uint32_t volatile * const sse_pc_ctrl_lut[NB_OF_ANALOG_BLOCKS] =
\r
77 static uint32_t volatile * const sse_pc_lo_lut[NB_OF_ANALOG_BLOCKS] =
\r
84 static uint32_t volatile * const sse_pc_hi_lut[NB_OF_ANALOG_BLOCKS] =
\r
91 /*-------------------------------------------------------------------------*//**
\r
96 sse_sequence_handle_t sequence
\r
99 ASSERT( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES );
\r
101 if ( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES )
\r
105 const uint16_t * p_ucode;
\r
107 ASSERT( g_sse_sequences_desc_table[sequence].sse_pc_id < NB_OF_ANALOG_BLOCKS );
\r
109 if ( g_sse_sequences_desc_table[sequence].sse_pc_id < NB_OF_ANALOG_BLOCKS )
\r
111 /* Stop relevant program counter. */
\r
112 *sse_pc_ctrl_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = SSE_STOP;
\r
114 /* Load microcode into SEE RAM.*/
\r
115 p_ucode = g_sse_sequences_desc_table[sequence].sse_ucode;
\r
116 offset = g_sse_sequences_desc_table[sequence].sse_load_offset;
\r
118 for ( i = 0u; i < g_sse_sequences_desc_table[sequence].sse_ucode_length; ++i )
\r
120 ACE->SSE_RAM_DATA[offset + i] = (uint32_t)*p_ucode;
\r
128 /*-------------------------------------------------------------------------*//**
\r
133 sse_sequence_handle_t sequence
\r
136 ASSERT( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES );
\r
138 if ( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES )
\r
142 ASSERT( g_sse_sequences_desc_table[sequence].sse_pc_id < NB_OF_ANALOG_BLOCKS );
\r
143 ASSERT( g_sse_sequences_desc_table[sequence].sse_load_offset < SEE_RAM_WORD_SIZE );
\r
145 pc = g_sse_sequences_desc_table[sequence].sse_load_offset;
\r
149 *sse_pc_lo_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = pc;
\r
153 *sse_pc_hi_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = pc - 256;
\r
156 *sse_pc_ctrl_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = SSE_START;
\r
158 /* Enable Sample Sequencing Engine in case it was not done as part of
\r
160 ACE->SSE_TS_CTRL |= TS_ENABLE_MASK;
\r
164 /*-------------------------------------------------------------------------*//**
\r
167 void ACE_restart_sse
\r
169 sse_sequence_handle_t sequence
\r
172 ASSERT( sequence < ACE_NB_OF_SSE_PROCEDURES );
\r
173 ASSERT( g_sse_sequences_desc_table[sequence].sse_pc_id < NB_OF_ANALOG_BLOCKS );
\r
174 ASSERT( g_sse_sequences_desc_table[sequence].sse_load_offset < SEE_RAM_WORD_SIZE );
\r
176 if ( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES )
\r
180 pc = g_sse_sequences_desc_table[sequence].sse_loop_pc;
\r
184 *sse_pc_lo_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = pc;
\r
188 *sse_pc_hi_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = pc - 256;
\r
191 *sse_pc_ctrl_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = SSE_START;
\r
195 /*-------------------------------------------------------------------------*//**
\r
200 sse_sequence_handle_t sequence
\r
203 ASSERT( sequence < ACE_NB_OF_SSE_PROCEDURES );
\r
205 if ( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES )
\r
207 /* Stop relevant program counter. */
\r
208 *sse_pc_ctrl_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = SSE_STOP;
\r
212 /*-------------------------------------------------------------------------*//**
\r
215 void ACE_resume_sse
\r
217 sse_sequence_handle_t sequence
\r
220 ASSERT( sequence < ACE_NB_OF_SSE_PROCEDURES );
\r
222 if ( sequence < (sse_sequence_handle_t)ACE_NB_OF_SSE_PROCEDURES )
\r
224 *sse_pc_ctrl_lut[g_sse_sequences_desc_table[sequence].sse_pc_id] = SSE_START;
\r
228 /*-------------------------------------------------------------------------*//**
\r
231 void ACE_enable_sse_irq
\r
233 sse_irq_id_t sse_irq_id
\r
236 ASSERT( sse_irq_id < NB_OF_SSE_FLAG_IRQS );
\r
238 ACE->SSE_IRQ_EN |= 1uL << (uint32_t)sse_irq_id;
\r
241 /*-------------------------------------------------------------------------*//**
\r
244 void ACE_disable_sse_irq
\r
246 sse_irq_id_t sse_irq_id
\r
249 ASSERT( sse_irq_id < NB_OF_SSE_FLAG_IRQS );
\r
251 ACE->SSE_IRQ_EN &= (uint32_t)~(1uL << (uint32_t)sse_irq_id);
\r
254 /*-------------------------------------------------------------------------*//**
\r
257 void ACE_clear_sse_irq
\r
259 sse_irq_id_t sse_irq_id
\r
262 ASSERT( sse_irq_id < NB_OF_SSE_FLAG_IRQS );
\r
264 ACE->SSE_IRQ_CLR |= 1uL << (uint32_t)sse_irq_id;
\r
267 /*-------------------------------------------------------------------------*//**
\r
270 void ACE_clear_sample_pipeline(void)
\r
272 uint32_t saved_sse_ctrl;
\r
273 uint32_t saved_ppe_ctrl;
\r
275 /* Pause the Sample Sequencing Engine. */
\r
276 saved_sse_ctrl = ACE->SSE_TS_CTRL;
\r
277 ACE->SSE_TS_CTRL = ACE->SSE_TS_CTRL & ~((uint32_t)TS_ENABLE_MASK);
\r
279 /* Pause the Post Processing Engine. */
\r
280 saved_ppe_ctrl = ACE->PPE_CTRL;
\r
281 ACE->PPE_CTRL = ACE->PPE_CTRL & ~((uint32_t)PPE_ENABLE_MASK);
\r
283 /* Reset the ADCs */
\r
284 ACE->ADC0_MISC_CTRL |= ADC_RESET_MASK;
\r
285 ACE->ADC1_MISC_CTRL |= ADC_RESET_MASK;
\r
286 ACE->ADC2_MISC_CTRL |= ADC_RESET_MASK;
\r
288 /* Clear ADC FIFOs */
\r
289 ACE->ADC0_FIFO_CTRL |= ADC_FIFO_CLR_MASK;
\r
290 ACE->ADC1_FIFO_CTRL |= ADC_FIFO_CLR_MASK;
\r
291 ACE->ADC2_FIFO_CTRL |= ADC_FIFO_CLR_MASK;
\r
293 /* clear DMA FIFOs */
\r
294 ACE->PPE_PDMA_CTRL |= PDMA_DATAOUT_CLR_MASK;
\r
296 /* Unpause the Post Processing Engine. */
\r
297 ACE->PPE_CTRL = saved_ppe_ctrl;
\r
299 /* Unpause the Sample Sequencing Engine. */
\r
300 ACE->SSE_TS_CTRL = saved_sse_ctrl;
\r