source: rtems/c/src/lib/libbsp/arm/gp32/console/conio.c @ 32cf23b1

4.104.114.84.95
Last change on this file since 32cf23b1 was 32cf23b1, checked in by Joel Sherrill <joel.sherrill@…>, on 06/02/05 at 13:41:35

2005-06-01 Philippe Simons <loki_666@…>

  • bsp_specs: Add rules for cpp support
  • include/bsp.h: Add gp32 support fct prototypes
  • console/conio.c: Moved video buffer to 0x0c7ed000
  • startup/bspstart.c: Add some init code, some cleaning...
  • Property mode set to 100644
File size: 10.2 KB
Line 
1/*
2 * conio.c :  ARM GBA BSP
3 *
4 * This file contains the GBA conio I/O package.
5 *
6 *
7 *  Copyright (c) 2004  Markku Puro <markku.puro@kopteri.net>
8 *
9 *  This source file is based on work by Rafael Vuijk (aka Dark Fader)
10 *  MyLib by Rafael Vuijk (aka Dark Fader)
11 *
12 *  The license and distribution terms for this file may be
13 *  found in found in the file LICENSE in this distribution or at
14 *  http://www.rtems.com/license/LICENSE.
15 *
16 *  $Id$
17*/
18
19
20/*---------------------------------------------------------------------------*
21 *   Includes                                                                *
22 *---------------------------------------------------------------------------*/
23#include <rtems/score/types.h>
24#include <s3c2400.h>
25#include <bsp.h>
26#include <conio.h>
27#include <stdio.h>
28#include <stdarg.h>
29
30#define gp_initButtons() {rPBCON=0x0;}
31#define gp_getButtons() ((((~rPEDAT >> 6) & 0x3) << 8) | \
32                         ((~rPBDAT >> 8) & 0xFF))
33
34/*---------------------------------------------------------------------------*
35 * Defines                                                                   *
36 *---------------------------------------------------------------------------*/
37#define DEFAULT_FONT_WIDTH  4
38#define DEFAULT_FONT_HEIGHT 6
39#define W                   (LCD_WIDTH/DEFAULT_FONT_WIDTH)
40#define H                   (LCD_HEIGHT/DEFAULT_FONT_HEIGHT)
41
42typedef unsigned char       Bitmap[LCD_HEIGHT][LCD_WIDTH];
43#define GP32_CONIO_VRAM 0x0c7ed000
44#define bg_bitmap          (*(Bitmap *)GP32_CONIO_VRAM)
45
46/* color conversion */
47#define RGB(r,g,b)              ( (r)<<11 | (g)<<6 | (b)<<1 )
48
49int  _wherex;
50int  _wherey;
51int  _textattr;
52
53
54/*---------------------------------------------------------------------------*
55 *  Defaultfont                                                              *
56 *---------------------------------------------------------------------------*/
57#include "defaultfont.c"
58
59/*---------------------------------------------------------------------------*
60 *  gp32_gotoxy                                                                *
61 *---------------------------------------------------------------------------*/
62void gpconio_gotoxy(int _x, int _y)
63{
64    _wherex = _x;
65    _wherey = _y;
66}
67
68
69/*---------------------------------------------------------------------------*
70 *  PutChar                                                                   *
71 *---------------------------------------------------------------------------*/
72void PutChar(char c, int textattr, int x, int y)
73{
74    int        f = textattr & 0x0F;
75    int        b = textattr >> 4;
76    uint32_t fmask = f | (f << 8) | (f << 16) | (f << 24);
77    uint32_t bmask = b | (b << 8) | (b << 16) | (b << 24);
78    uint32_t *dest = (uint32_t *)&bg_bitmap[((y << 1) + y) << 1][x << 2];
79    const uint32_t *src = (uint32_t *)&(font3x5[(int)c]);   
80    uint32_t s;
81
82    s = *src++;
83    *dest = (fmask&s) | (bmask&~s);
84    dest += LCD_WIDTH / sizeof(uint32_t);
85
86    s = *src++;
87    *dest = (fmask&s) | (bmask&~s);
88    dest += LCD_WIDTH / sizeof(uint32_t);
89
90    s = *src++;
91    *dest = (fmask&s) | (bmask&~s);
92    dest += LCD_WIDTH / sizeof(uint32_t);
93
94    s = *src++;
95    *dest = (fmask&s) | (bmask&~s);
96    dest += LCD_WIDTH / sizeof(uint32_t);
97
98    s = *src++;
99    *dest = (fmask&s) | (bmask&~s);
100    dest += LCD_WIDTH / sizeof(uint32_t);
101
102    s = *src++;
103    *dest = (fmask&s) | (bmask&~s);
104    dest += LCD_WIDTH / sizeof(uint32_t);
105}
106
107
108/*---------------------------------------------------------------------------*
109 *  gp32_textattr                                                             *
110 *---------------------------------------------------------------------------*/
111void gpconio_textattr(int _attr)
112{
113    _textattr = _attr;
114}
115
116/*---------------------------------------------------------------------------*
117 *  gp32_textbackground                                                       *
118 *---------------------------------------------------------------------------*/
119void gpconio_textbackground(int _color)
120{
121    _textattr = (_textattr & 0x0F) | (_color << 4);
122}
123
124/*---------------------------------------------------------------------------*
125 *  gp32_textcolor                                                            *
126 *---------------------------------------------------------------------------*/
127void gpconio_textcolor(int _color)
128{
129    _textattr = (_textattr & 0xF0) | (_color);
130}
131
132
133/*---------------------------------------------------------------------------*
134 *  ClrLine                                                                  *
135 *---------------------------------------------------------------------------*/
136void ClrLine(int y)
137{
138    int x;
139
140    for(x=0 ; x<=W ; x++)  PutChar(0, _textattr, x, y);
141}
142
143/*---------------------------------------------------------------------------*
144 *  NextLine                                                                 *
145 *---------------------------------------------------------------------------*/
146void NextLine()
147{
148    _wherex = 0;
149
150    if (++_wherey >= H) {
151        _wherey = 0;
152    }
153
154    ClrLine(_wherey);
155}
156
157/*---------------------------------------------------------------------------*
158 *  clrscr                                                                   *
159 *---------------------------------------------------------------------------*/
160void gpconio_clrscr()
161{
162    int y;
163
164    for(y=0 ; y<=H ; y++) {
165        ClrLine(y);
166    }
167
168    gpconio_gotoxy(0,0);
169}
170
171/*---------------------------------------------------------------------------*
172 *  gp32_put                                                                  *
173 *---------------------------------------------------------------------------*/
174void gpconio_put(char _c)
175{
176  /* We have save some memory with fonts */
177  _c = _c & 0x7F;   /* no extened chars */
178  _c = _c - 0x20;   /* no cntr chars    */
179  PutChar(_c, _textattr, _wherex, _wherey);
180}
181
182/*---------------------------------------------------------------------------*
183 *  gp32_putch                                                                *
184 *---------------------------------------------------------------------------*/
185void gpconio_putch(char _c)
186{
187    switch (_c) {
188    case ASCII_LF:
189        NextLine();
190        break;
191    case ASCII_CR:
192        gpconio_gotoxy(0, _wherey);
193        break;
194    default:
195        gpconio_put(_c);
196        if (++_wherex >= W) {
197            NextLine();
198        }
199        break;
200    }
201    return;
202}
203
204/*---------------------------------------------------------------------------*
205 *  gp32_puts                                                                 *
206 *---------------------------------------------------------------------------*/
207void gpconio_puts(const char *_str)
208{
209    while (*_str) {
210        gpconio_putch(*_str++);
211    }
212    return;
213}
214
215/*---------------------------------------------------------------------------*
216 *  gp32_printf                                                               *
217 *---------------------------------------------------------------------------*/
218int gpconio_printf(const char *_format, ...)
219{
220    char s[256];
221    va_list marker;
222    va_start(marker, _format);
223    int r = vsprintf(s, _format, marker);
224
225    va_end(marker);
226    gpconio_puts(s);
227    return r;
228}
229
230void ShowConIO()
231{
232    unsigned short BPPMODE = 11;
233    unsigned short CLKVAL = (get_HCLK()/(83385*2*60))-1;
234    uint32_t LCDBANK  =  GP32_CONIO_VRAM >> 22;
235    uint32_t LCDBASEU = (GP32_CONIO_VRAM & 0x3FFFFF) >> 1;
236    uint32_t LCDBASEL;
237    unsigned short OFFSIZE = 0;
238    unsigned short PAGEWIDTH;
239
240    rLCDCON1 = (CLKVAL<<8) | (0<<7) | (3<<5) | (BPPMODE<<1) | (1<<0) ;
241    rLCDCON2 = 0;
242    rLCDCON2 = (1<<24) | (319<<14) | (2<<6) | (1<<0) ;
243    rLCDCON3 = 0;
244    rLCDCON3 = (6<<19) | (239<<8) | (2<<0) ;
245    rLCDCON4 = 0;
246    rLCDCON4 = (0<<24) | (0<<16) | (0<<8) | (4<<0) ;
247    rLCDCON5 = 0;
248    rLCDCON5 = ((1<<10) | (1<<9) | (1<<8) | (0<<7) |
249                (0<<6) | (0<<4) | (0<<2) | (1<<1) | (0<<0)) ;
250
251    LCDBASEL  = LCDBASEU + 320*120;
252    PAGEWIDTH = 120;
253
254    rLCDSADDR1 = (LCDBANK<<21) | (LCDBASEU<<0) ;
255    rLCDSADDR2 = (LCDBASEL<<0) ;
256    rLCDSADDR3 = (OFFSIZE<<11) | (PAGEWIDTH<<0) ;
257}
258
259
260/*---------------------------------------------------------------------------*
261 *  InitConIO                                                                *
262 *---------------------------------------------------------------------------*/
263void InitConIO()
264{
265    ShowConIO();
266   
267    gp_initButtons();
268    gpconio_textattr(0);
269    gpconio_textcolor(DEF_TEXTCOLOR);
270    gpconio_textbackground(DEF_TEXTBACKGROUND);
271    gpconio_clrscr();
272}
273
274
275static void delay_loop(unsigned int count)
276{
277    int i;
278
279    for(i = 0; i < count; i++) {
280        i = i;
281    }
282
283}
284
285/*---------------------------------------------------------------------------*
286 *  gp32_getch                                                                *
287 *---------------------------------------------------------------------------*/
288static unsigned char inputch = ASCII_CR;
289char gpconio_getch(void)
290{
291    int  keyx;
292    int key  = 0;
293
294    while(1) {
295        key = gp_getButtons();
296
297        do {
298            keyx = gp_getButtons();
299        } while (keyx == key);
300
301        switch (key) {
302        case GP32_KEY_SELECT:
303            gpconio_put(inputch);
304            return inputch;
305            break;
306       
307        case GP32_KEY_START:
308            gpconio_put(' ');
309            inputch = ASCII_CR;
310            return inputch;
311            break;
312
313        case GP32_KEY_A:
314            inputch = 'A';
315            break;
316
317        case GP32_KEY_B:
318            inputch = 'Z';
319            break;
320
321        case GP32_KEY_UP:
322            if ((inputch-1) >= 0x20) {
323                inputch--;
324            }
325            break;
326
327        case GP32_KEY_DOWN:
328            if ((inputch+1) <=  0x7E) {
329                inputch++;
330            }
331            break;
332
333        case GP32_KEY_LEFT:
334            if ((inputch - 0x20) >= 0x20) {
335                inputch -= 0x20;
336            }
337            break;
338
339        case GP32_KEY_RIGHT:
340            if ((inputch + 0x20) <= 0x7E) {
341                inputch += 0x20;
342            }
343            break;
344
345        case GP32_KEY_R:
346            inputch = '1';
347            break;
348
349        case GP32_KEY_L:
350            inputch = '9';
351            break;
352
353        default:
354            break;
355        }
356
357        gpconio_put(inputch);
358        delay_loop(10000);
359    }
360}
Note: See TracBrowser for help on using the repository browser.