summaryrefslogtreecommitdiff
path: root/AT91SAM7S256/Source/d_display.r
blob: d4328b785d1766f4fd056abaa3b702c175e917e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
//
// Programmer
//
// Date init       14.12.2004
//
// Reviser         $Author:: Dktochpe                                        $
//
// Revision date   $Date:: 20-12-05 12:28                                    $
//
// Filename        $Workfile:: d_display.r                                   $
//
// Version         $Revision:: 18                                            $
//
// Archive         $Archive:: /LMS2006/Sys01/Main/Firmware/Source/d_display. $
//
// Platform        C
//

#ifdef    SAM7S256

// Display 128 x 64
// 1/65 duty, 1/9 bias
// VLCD 12.0V

// SPI interface
//
// PCB        LCD       ARM       PIO
// ------     -----     ----      -----
// CS_DIS     -CS1      PA10      NPCS2 (PB)
// DIS_A0     A0        PA12      PA12
// DIS_SCL    SCL       PA14      SPCK  (PA)
// DIS_SDA    SI        PA13      MOSI  (PA)


// CPOL = 0, NCPHA=0,

#define   BT_RESET_OUT      AT91C_PIO_PA11
#define   BT_RESET_IN       AT91C_PIO_PA29
#define   BT_MOSI_OUT       AT91C_PIO_PA13
#define   BT_MOSI_IN        AT91C_PIO_PA20
#define   BT_CLK_OUT        AT91C_PIO_PA14
#define   BT_CLK_IN         AT91C_PIO_PA28
#define   BT_CE_OUT         AT91C_PIO_PA31
#define   BT_CE_IN          AT91C_PIO_PA19
#define   BT_REA_OUT        AT91C_PIO_PA7
#define   BT_MISO_OUT       AT91C_PIO_PA6
#define   BT_MISO_IN        AT91C_PIO_PA12

#pragma optimize=s 9

__ramfunc void SpiBtIo(void)
{
  register ULONG Port;
  
  *AT91C_AIC_IDCR    = 0xFFFFFFFF;        /* Disable all interrupts   */

  *AT91C_PIOA_PER    = BT_RESET_OUT;      /* Enable pin RESET out     */
  *AT91C_PIOA_OER    = BT_RESET_OUT;      /* Set output               */ 
  *AT91C_PIOA_SODR   = BT_RESET_OUT;      /* Set high                 */

  *AT91C_PIOA_PER    = BT_MOSI_OUT;       /* Enable pin MOSI out      */
  *AT91C_PIOA_OER    = BT_MOSI_OUT;       /* Set output               */

  *AT91C_PIOA_PER    = BT_CLK_OUT;        /* Enable pin CLK out       */
  *AT91C_PIOA_OER    = BT_CLK_OUT;        /* Set output               */

  *AT91C_PIOA_PER    = BT_CE_OUT;         /* Enable pin CE out        */
  *AT91C_PIOA_OER    = BT_CE_OUT;         /* Set output               */

  *AT91C_PIOA_PER    = BT_REA_OUT;        /* Enable pin REA out       */
  *AT91C_PIOA_OER    = BT_REA_OUT;        /* Set output               */
  *AT91C_PIOA_SODR   = BT_REA_OUT;        /* Set high                 */

  *AT91C_PIOA_PER    = BT_MISO_OUT;       /* Enable pin MISO out      */
  *AT91C_PIOA_OER    = BT_MISO_OUT;       /* Set output               */

  *AT91C_PIOA_PER    = BT_RESET_IN;       /* Enable pin RESET in      */
  *AT91C_PIOA_ODR    = BT_RESET_IN;       /* Set input                */
  *AT91C_PIOA_IFDR   = BT_RESET_IN;       /* Disable filter           */
  *AT91C_PIOA_IDR    = BT_RESET_IN;       /* Disable interrupt        */
  *AT91C_PIOA_MDDR   = BT_RESET_IN;       /* Disable multidriver      */
  *AT91C_PIOA_PPUDR  = BT_RESET_IN;       /* Disable pullup           */

  *AT91C_PIOA_PER    = BT_MOSI_IN;        /* Enable pin MOSI in       */
  *AT91C_PIOA_ODR    = BT_MOSI_IN;        /* Set input                */
  *AT91C_PIOA_IFDR   = BT_MOSI_IN;        /* Disable filter           */
  *AT91C_PIOA_IDR    = BT_MOSI_IN;        /* Disable interrupt        */
  *AT91C_PIOA_MDDR   = BT_MOSI_IN;        /* Disable multidriver      */
  *AT91C_PIOA_PPUDR  = BT_MOSI_IN;        /* Disable pullup           */

  *AT91C_PIOA_PER    = BT_CLK_IN;         /* Enable pin CLK in        */
  *AT91C_PIOA_ODR    = BT_CLK_IN;         /* Set input                */
  *AT91C_PIOA_IFDR   = BT_CLK_IN;         /* Disable filter           */
  *AT91C_PIOA_IDR    = BT_CLK_IN;         /* Disable interrupt        */
  *AT91C_PIOA_MDDR   = BT_CLK_IN;         /* Disable multidriver      */
  *AT91C_PIOA_PPUDR  = BT_CLK_IN;         /* Disable pullup           */

  *AT91C_PIOA_PER    = BT_CE_IN;          /* Enable pin CE in         */
  *AT91C_PIOA_ODR    = BT_CE_IN;          /* Set input                */
  *AT91C_PIOA_IFDR   = BT_CE_IN;          /* Disable filter           */
  *AT91C_PIOA_IDR    = BT_CE_IN;          /* Disable interrupt        */
  *AT91C_PIOA_MDDR   = BT_CE_IN;          /* Disable multidriver      */
  *AT91C_PIOA_PPUDR  = BT_CE_IN;          /* Disable pullup           */

  *AT91C_PIOA_PER    = BT_MISO_IN;        /* Enable pin MISO in       */
  *AT91C_PIOA_ODR    = BT_MISO_IN;        /* Set input                */
  *AT91C_PIOA_IFDR   = BT_MISO_IN;        /* Disable filter           */
  *AT91C_PIOA_IDR    = BT_MISO_IN;        /* Disable interrupt        */
  *AT91C_PIOA_MDDR   = BT_MISO_IN;        /* Disable multidriver      */
  *AT91C_PIOA_PPUDR  = BT_MISO_IN;        /* Disable pullup           */

  while (1)
  {
    Port = *AT91C_PIOA_PDSR;
    if ((Port & BT_MISO_IN))
    {
      *AT91C_PIOA_SODR = BT_MISO_OUT;
    }
    else
    {
      *AT91C_PIOA_CODR = BT_MISO_OUT;
    }
    if ((Port & BT_MOSI_IN))
    {
      *AT91C_PIOA_SODR = BT_MOSI_OUT;
    }
    else
    {
      *AT91C_PIOA_CODR = BT_MOSI_OUT;
    }
    if ((Port & BT_CLK_IN))
    {
      *AT91C_PIOA_SODR = BT_CLK_OUT;
    }
    else
    {
      *AT91C_PIOA_CODR = BT_CLK_OUT;
    }
    if ((Port & BT_CE_IN))
    {
      *AT91C_PIOA_SODR = BT_CE_OUT;
    }
    else
    {
      *AT91C_PIOA_CODR = BT_CE_OUT;
    }
  }
  
}


void      BtIo(void)
{
  SpiBtIo();
}



#define   SPI_BITRATE                   2000000

#define   SPIA0High                     {\
                                          *AT91C_PIOA_SODR = AT91C_PIO_PA12;\
                                        }


#define   SPIA0Low                      {\
                                          *AT91C_PIOA_CODR = AT91C_PIO_PA12;\
                                        }


#define   SPIInit                       {\
                                          *AT91C_PMC_PCER             = (1L << AT91C_ID_SPI);       /* Enable MCK clock     */\
                                          *AT91C_PIOA_PER             = AT91C_PIO_PA12;             /* Enable A0 on PA12    */\
                                          *AT91C_PIOA_OER             = AT91C_PIO_PA12;\
                                          *AT91C_PIOA_CODR            = AT91C_PIO_PA12;\
                                          *AT91C_PIOA_PDR             = AT91C_PA14_SPCK;            /* Enable SPCK on PA14  */\
                                          *AT91C_PIOA_ASR             = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_ODR             = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_OWER            = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_MDDR            = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_PPUDR           = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_IFDR            = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_CODR            = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_IDR             = AT91C_PA14_SPCK;\
                                          *AT91C_PIOA_PDR             = AT91C_PA13_MOSI;            /* Enable mosi on PA13  */\
                                          *AT91C_PIOA_ASR             = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_ODR             = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_OWER            = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_MDDR            = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_PPUDR           = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_IFDR            = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_CODR            = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_IDR             = AT91C_PA13_MOSI;\
                                          *AT91C_PIOA_PDR             = AT91C_PA10_NPCS2;           /* Enable npcs0 on PA11  */\
                                          *AT91C_PIOA_BSR             = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_ODR             = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_OWER            = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_MDDR            = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_PPUDR           = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_IFDR            = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_CODR            = AT91C_PA10_NPCS2;\
                                          *AT91C_PIOA_IDR             = AT91C_PA10_NPCS2;\
                                          *AT91C_SPI_CR               = AT91C_SPI_SWRST;            /* Soft reset           */\
                                          *AT91C_SPI_CR               = AT91C_SPI_SPIEN;            /* Enable spi           */\
                                          *AT91C_SPI_MR               = AT91C_SPI_MSTR  | AT91C_SPI_MODFDIS | (0xB << 16);\
                                          AT91C_SPI_CSR[2]              = ((OSC / SPI_BITRATE) << 8) | AT91C_SPI_CPOL;\
                                        }


#define   SPIWrite(pString,Length)      {\
                                          *AT91C_SPI_TPR = (unsigned int)pString;\
                                          *AT91C_SPI_TCR = (unsigned int)Length;\
                                          *AT91C_SPI_PTCR = AT91C_PDC_TXTEN;\
                                        }



#define   CMD             0
#define   DAT             1
#define   DISP_LINES      8

#if       defined (PROTOTYPE_PCB_3) || (PROTOTYPE_PCB_4)

#define   ACTUAL_WIDTH                      100

UBYTE     DisplayInitString[] =
{
  0xEB,   // LCD bias setting = 1/9         0xEB
  0x2F,   // Power control    = internal    0x2F
  0xA4,   // All points not on              0xA4
  0xA6,   // Not inverse                    0xA6
  0x40,   // Start line = 0                 0x40
  0x81,   // Electronic volume              0x81
  0x5A,   //      -"-                       0x5F
  0xC4,   // LCD mapping                    0xC4
  0x27,   // Set temp comp.                 0x27-
  0x29,   // Panel loading                  0x28    0-1
  0xA0,   // Framerate                      0xA0-
  0x88,   // CA++                           0x88-
  0x23,   // Multiplex 1:65                 0x23
  0xAF    // Display on                     0xAF
};

#else

#define   ACTUAL_WIDTH                      128

UBYTE     DisplayInitString[] =
{
  0xA2,   // LCD bias setting = 1/9
  0x2F,   // Power control    = internal
  0xA4,   // All points not on
  0xA6,   // Not inverse
  0x40,   // Start line = 0
  0x81,   // Electronic volume
  0x3F,   //      -"-
  0xA0,   // LCD mapping
  0x27,   // Resistor ratio
  0xC8,   // Common output state selection
  0xF8,   // Booster ratio
  0x00,   //      -"-
  0xE3,   // nop
  0xAF    // Display on
};

#endif

UBYTE     DisplayLineString[DISP_LINES][3] =
{
  { 0xB0,0x10,0x00 },
  { 0xB1,0x10,0x00 },
  { 0xB2,0x10,0x00 },
  { 0xB3,0x10,0x00 },
  { 0xB4,0x10,0x00 },
  { 0xB5,0x10,0x00 },
  { 0xB6,0x10,0x00 },
  { 0xB7,0x10,0x00 }
};

UBYTE     DisplayWrite(UBYTE Type,UBYTE *pData,UWORD Length)
{
  UBYTE   Result = FALSE;

  if ((*AT91C_SPI_SR & AT91C_SPI_TXEMPTY))
  {
    if (Type)
    {
      SPIA0High;
    }
    else
    {
      SPIA0Low;
    }
    SPIWrite(pData,Length);
    Result = TRUE;
  }

  return (Result);
}

UBYTE     DisplayUpdate(UWORD Height,UWORD Width,UBYTE *pImage)
{
  static  UWORD State = 0;
  static  UWORD Line;

  if (State == 0)
  {
    if (DisplayWrite(CMD,(UBYTE*)DisplayInitString,sizeof(DisplayInitString)) == TRUE)
    {
      Line = 0;
      State++;
    }
  }
  else
  {
    if ((State & 1))
    {
      if (DisplayWrite(CMD,(UBYTE*)DisplayLineString[Line],3) == TRUE)
      {
        State++;
      }
    }
    else
    {
      if (DisplayWrite(DAT,(UBYTE*)&pImage[Line * Width],ACTUAL_WIDTH) == TRUE)
      {
        State++;
        if (++Line >= (Height / 8))
        {
          State = 0;
        }
      }
    }
  }

  return (State);
}


#if       defined (PROTOTYPE_PCB_3)

#define   DISPLAYInit                   {\
                                          TSTInit;\
                                          TSTOn;\
                                          SPIInit;\
                                        }
                                        
#else

#define   DISPLAYInit                   {\
                                          SPIInit;\
                                        }
                                        
#endif                                        

#define   DISPLAYOn                     {\
                                          DisplayInitString[6]  = 0x5A;\
                                          DisplayInitString[13] = 0xAF;\
                                        }

#define   DISPLAYOff                    {\
                                          DisplayInitString[6]  = 0x00;\
                                          DisplayInitString[13] = 0xAE;\
                                        }

#define   DISPLAYUpdate(H,W,I)          DisplayUpdate(H,W,I)

#define   DISPLAYExit

#endif

#ifdef    PCWIN

#endif