summaryrefslogtreecommitdiff
path: root/AT91SAM7S256/Source/d_input.r
diff options
context:
space:
mode:
Diffstat (limited to 'AT91SAM7S256/Source/d_input.r')
-rw-r--r--AT91SAM7S256/Source/d_input.r312
1 files changed, 312 insertions, 0 deletions
diff --git a/AT91SAM7S256/Source/d_input.r b/AT91SAM7S256/Source/d_input.r
new file mode 100644
index 0000000..3dc567e
--- /dev/null
+++ b/AT91SAM7S256/Source/d_input.r
@@ -0,0 +1,312 @@
+//
+// Date init 14.12.2004
+//
+// Revision date $Date:: 14-01-09 10:33 $
+//
+// Filename $Workfile:: d_input.r $
+//
+// Version $Revision:: 24 $
+//
+// Archive $Archive:: /LMS2006/Sys01/Main_V02/Firmware/Source/d_inpu $
+//
+// Platform C
+//
+
+
+#ifdef SAM7S256
+
+void rInputWait2uS(void);
+void rInputWait20uS(void);
+void rInputWait30uS(void);
+void rInputSingleADC(UBYTE Port, UWORD *Val);
+
+const ULONG Digi0Alloc[] = {AT91C_PIO_PA23, AT91C_PIO_PA28, AT91C_PIO_PA29, AT91C_PIO_PA30};
+const ULONG Digi1Alloc[] = {AT91C_PIO_PA18, AT91C_PIO_PA19, AT91C_PIO_PA20, AT91C_PIO_PA2};
+const ULONG ADPinDef[NO_OF_INPUTS] = {AT91C_ADC_CH1, AT91C_ADC_CH2, AT91C_ADC_CH3, AT91C_ADC_CH7};
+unsigned int volatile* ADValRegs[NO_OF_INPUTS] = {AT91C_ADC_CDR1, AT91C_ADC_CDR2, AT91C_ADC_CDR3, AT91C_ADC_CDR7};
+
+static UBYTE ColorReset[NO_OF_INPUTS];
+static ULONG ColorClkDef;
+static ULONG ColorTimer[NO_OF_INPUTS];
+
+#define TIME2US ((OSC/16)/500000L)
+#define TIME20US ((OSC/16)/50000L)
+#define TIME30US ((OSC/16)/33333L)
+#define TIME100MS ((OSC/16)/10L)
+
+#define MAX_AD_VALUE 0x3FF
+
+#define INPUTInit {\
+ UBYTE Tmp; \
+ for (Tmp = 0; Tmp < NOS_OF_AVR_INPUTS; Tmp++)\
+ { \
+ IoFromAvr.AdValue[Tmp] = MAX_AD_VALUE; \
+ } \
+ IoToAvr.InputPower = 0; \
+ for (Tmp = 0; Tmp < NO_OF_INPUTS; Tmp++) \
+ { \
+ *AT91C_PIOA_PPUDR = Digi0Alloc[Tmp]; \
+ *AT91C_PIOA_PPUDR = Digi1Alloc[Tmp]; \
+ INPUTSetInDigi0(Tmp); \
+ INPUTSetInDigi1(Tmp); \
+ ColorReset[Tmp] = FALSE; \
+ } \
+ ColorClkDef = 0; \
+ }
+
+#define INPUTGetVal(pValues, No) *pValues = (UWORD)IoFromAvr.AdValue[No]; \
+ *pValues &= 0x03FF
+
+#define INPUTSetActive(Input) IoToAvr.InputPower |= (0x01 << Input); \
+ IoToAvr.InputPower &= ~(0x10 << Input)
+#define INPUTSet9v(Input) IoToAvr.InputPower |= (0x10 << Input); \
+ IoToAvr.InputPower &= ~(0x01 << Input)
+#define INPUTSetInactive(Input) IoToAvr.InputPower &= ~(0x11 << Input)
+
+#define INPUTSetOutDigi0(Input) *AT91C_PIOA_PER = Digi0Alloc[Input]; \
+ *AT91C_PIOA_OER = Digi0Alloc[Input]
+
+#define INPUTSetOutDigi1(Input) *AT91C_PIOA_PER = Digi1Alloc[Input]; \
+ *AT91C_PIOA_OER = Digi1Alloc[Input]
+
+#define INPUTSetInDigi0(Input) *AT91C_PIOA_PER = Digi0Alloc[Input]; \
+ *AT91C_PIOA_ODR = Digi0Alloc[Input]
+
+#define INPUTSetInDigi1(Input) *AT91C_PIOA_PER = Digi1Alloc[Input]; \
+ *AT91C_PIOA_ODR = Digi1Alloc[Input]
+
+#define INPUTSetDigi0(Input) *AT91C_PIOA_SODR = Digi0Alloc[Input]
+
+#define INPUTSetDigi1(Input) *AT91C_PIOA_SODR = Digi1Alloc[Input]
+
+#define INPUTClearDigi0(Input) *AT91C_PIOA_CODR = Digi0Alloc[Input]
+
+#define INPUTClearDigi1(Input) *AT91C_PIOA_CODR = Digi1Alloc[Input]
+
+#define INPUTReadDigi0(Input, Data) if ((*AT91C_PIOA_PDSR) & Digi0Alloc[Input]) \
+ { \
+ *Data |= 0x00000001; \
+ } \
+ else \
+ { \
+ *Data &= ~0x00000001; \
+ }
+#define INPUTReadDigi1(Input, Data) if ((*AT91C_PIOA_PDSR) & Digi1Alloc[Input]) \
+ { \
+ *Data |= 0x00000002; \
+ } \
+ else \
+ { \
+ *Data &= ~0x00000002; \
+ }
+
+#define INPUTClkHigh(Port) INPUTSetDigi0(Port); \
+ INPUTSetOutDigi0(Port); \
+ rInputWait2uS()
+
+#define INPUTClkLow(Port) INPUTClearDigi0(Port); \
+ INPUTSetOutDigi0(Port); \
+ rInputWait2uS()
+
+#define COLORClkInput *AT91C_PIOA_ODR = ColorClkDef
+
+#define UPDATEAllColors(Vals, Status){\
+ ULONG ADDef; \
+ ADDef = 0; \
+ ColorClkDef = 0; \
+ if (0x01 & Status) \
+ { \
+ ADDef |= ADPinDef[0]; \
+ ColorClkDef |= Digi0Alloc[0]; \
+ if ((*AT91C_PIOA_PDSR) & Digi0Alloc[0]) \
+ { \
+ ColorReset[0] = TRUE; \
+ } \
+ } \
+ if (0x02 & Status) \
+ { \
+ ADDef |= ADPinDef[1]; \
+ ColorClkDef |= Digi0Alloc[1]; \
+ if ((*AT91C_PIOA_PDSR) & Digi0Alloc[1]) \
+ { \
+ ColorReset[1] = TRUE; \
+ } \
+ } \
+ if (0x04 & Status) \
+ { \
+ ADDef |= ADPinDef[2]; \
+ ColorClkDef |= Digi0Alloc[2]; \
+ if ((*AT91C_PIOA_PDSR) & Digi0Alloc[2]) \
+ { \
+ ColorReset[2] = TRUE; \
+ } \
+ } \
+ if (0x08 & Status) \
+ { \
+ ADDef |= ADPinDef[3]; \
+ ColorClkDef |= Digi0Alloc[3]; \
+ if ((*AT91C_PIOA_PDSR) & Digi0Alloc[3]) \
+ { \
+ ColorReset[3] = TRUE; \
+ } \
+ } \
+ *AT91C_PIOA_OER = ColorClkDef; \
+ *AT91C_ADC_CHER = ADDef; \
+ GetAdVals(Vals, BLANK, Status); \
+ *AT91C_PIOA_SODR = ColorClkDef; \
+ rInputWait20uS(); \
+ GetAdVals(Vals, RED, Status); \
+ *AT91C_PIOA_CODR = ColorClkDef; \
+ rInputWait20uS(); \
+ GetAdVals(Vals, GREEN, Status); \
+ *AT91C_PIOA_SODR = ColorClkDef; \
+ rInputWait20uS(); \
+ GetAdVals(Vals, BLUE, Status); \
+ *AT91C_PIOA_CODR = ColorClkDef; \
+ *AT91C_ADC_CHDR = ADDef; \
+ }
+
+#define UPDATELed(Port, Col, Status) { \
+ rInputSingleADC(Port, Col); \
+ if ((*AT91C_PIOA_PDSR) & Digi0Alloc[Port]) \
+ { \
+ ColorReset[Port] = TRUE; \
+ } \
+ CHECKColorState(Port, Status); \
+ }
+
+#define SETClkHi(Port) INPUTClkHigh(Port) \
+
+#define COLORTx(Port, Data) { \
+ UBYTE BitCnt; \
+ BitCnt = 0; \
+ while(BitCnt++ < 8) \
+ { \
+ INPUTClkHigh(Port); \
+ if (Data & 0x01) \
+ { \
+ INPUTSetDigi1(Port); \
+ } \
+ else \
+ { \
+ INPUTClearDigi1(Port); \
+ } \
+ rInputWait30uS(); \
+ Data >>= 1; \
+ INPUTClkLow(Port); \
+ rInputWait30uS(); \
+ } \
+ }
+
+#define CALDataRead(Port, pData) {\
+ UBYTE BitCnt; \
+ UBYTE Data; \
+ BitCnt = 0; \
+ INPUTClkHigh(Port); \
+ rInputWait2uS(); \
+ while(BitCnt++ < 8) \
+ { \
+ INPUTClkHigh(Port); \
+ rInputWait2uS(); \
+ rInputWait2uS(); \
+ INPUTClkLow(Port); \
+ Data >>= 1; \
+ if ((*AT91C_PIOA_PDSR) & Digi1Alloc[Port])\
+ { \
+ Data |= 0x80; \
+ } \
+ rInputWait2uS(); \
+ } \
+ *pData = Data; \
+ }
+
+#define CHECKColorState(Port, Status) {\
+ Status = TRUE; \
+ if ((IoFromAvr.AdValue[Port] > 50) || (TRUE == ColorReset[Port])) \
+ { \
+ Status = FALSE; \
+ ColorReset[Port] = FALSE; \
+ } \
+ }
+
+
+#define INPUTExit { \
+ UBYTE Tmp; \
+ *AT91C_ADC_CHDR = (AT91C_ADC_CH1 | AT91C_ADC_CH2 | AT91C_ADC_CH3 | AT91C_ADC_CH7);\
+ for (Tmp = 0; Tmp < NO_OF_INPUTS; Tmp++) \
+ { \
+ INPUTSetInDigi0(Tmp); \
+ INPUTSetInDigi1(Tmp); \
+ } \
+ }
+
+#define CLEARColor100msTimer(No) ColorTimer[No] = (*AT91C_PITC_PIIR);\
+
+#define COLOR100msStatus(No,V) V = FALSE;\
+ if (((*AT91C_PITC_PIIR) - ColorTimer[No]) > TIME100MS)\
+ {\
+ V = TRUE;\
+ }
+
+
+
+void rInputSingleADC(UBYTE Port, UWORD *Val)
+{
+ *Val = *AT91C_ADC_LCDR;
+ *AT91C_ADC_CHER = ADPinDef[Port];
+ ADStart;
+ while(!((*AT91C_ADC_SR) & AT91C_ADC_DRDY));
+ *Val = *AT91C_ADC_LCDR;
+ *AT91C_ADC_CHDR = ADPinDef[Port];
+}
+
+void GetAdVals(COLORSTRUCT *pColStruct, UBYTE Color, UBYTE Status)
+{
+ UBYTE ChCnt;
+ ADStart;
+ for(ChCnt = 0; ChCnt < NO_OF_INPUTS; ChCnt++)
+ {
+ if (Status & (0x01 << ChCnt))
+ {
+ while(!((*AT91C_ADC_SR) & ADPinDef[ChCnt]));
+ pColStruct[ChCnt].ADRaw[Color] = *ADValRegs[ChCnt];
+ }
+ }
+ ADStart;
+ for(ChCnt = 0; ChCnt < NO_OF_INPUTS; ChCnt++)
+ {
+ if (Status & (0x01 << ChCnt))
+ {
+ while(!((*AT91C_ADC_SR) & ADPinDef[ChCnt]));
+ pColStruct[ChCnt].ADRaw[Color] += *ADValRegs[ChCnt];
+ pColStruct[ChCnt].ADRaw[Color] = (pColStruct[ChCnt].ADRaw[Color])>>1;
+ }
+ }
+}
+
+void rInputWait2uS(void)
+{
+ ULONG PitTmr;
+ PitTmr = (*AT91C_PITC_PIIR);
+ while (((*AT91C_PITC_PIIR) - PitTmr) < TIME2US);
+}
+
+void rInputWait20uS(void)
+{
+ ULONG PitTmr;
+ PitTmr = (*AT91C_PITC_PIIR);
+ while (((*AT91C_PITC_PIIR) - PitTmr) < TIME20US);
+}
+
+void rInputWait30uS(void)
+{
+ ULONG PitTmr;
+ PitTmr = (*AT91C_PITC_PIIR);
+ while (((*AT91C_PITC_PIIR) - PitTmr) < TIME30US);
+}
+
+#endif
+
+#ifdef PCWIN
+
+#endif