4 * Frank Gottschling <fgottschling@eltec.de>
6 * Board specific routines for the miniHiPerCam
8 * - initialisation (eeprom)
10 * - serial io initialisation
11 * - ethernet io initialisation
13 * -----------------------------------------------------------------
14 * See file CREDITS for list of people who contributed to this
17 * This program is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU General Public License as
19 * published by the Free Software Foundation; either version 2 of
20 * the License, or (at your option) any later version.
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
33 #include <linux/ctype.h>
38 /* imports from common/main.c */
39 extern char console_buffer
[CONFIG_SYS_CBSIZE
];
41 extern void eeprom_init (void);
42 extern int eeprom_read (unsigned dev_addr
, unsigned offset
,
43 unsigned char *buffer
, unsigned cnt
);
44 extern int eeprom_write (unsigned dev_addr
, unsigned offset
,
45 unsigned char *buffer
, unsigned cnt
);
48 void *video_hw_init (void);
49 void video_set_lut (unsigned int index
, /* color number */
50 unsigned char r
, /* red */
51 unsigned char g
, /* green */
52 unsigned char b
/* blue */
58 static void video_circle (char *center
, int radius
, int color
, int pitch
);
59 static void video_test_image (void);
60 static void video_default_lut (unsigned int clut_type
);
62 /* revision info foer MHPC EEPROM offset 480 */
64 char board
[12]; /* 000 - Board Revision information */
65 char sensor
; /* 012 - Sensor Type information */
66 char serial
[8]; /* 013 - Board serial number */
67 char etheraddr
[6]; /* 021 - Ethernet node addresse */
68 char revision
[2]; /* 027 - Revision code */
69 char option
[3]; /* 029 - resevered for options */
72 /* ------------------------------------------------------------------------- */
74 static const unsigned int sdram_table
[] = {
75 /* read single beat cycle */
76 0xef0efc04, 0x0e2dac04, 0x01ba5c04, 0x1ff5fc00,
77 0xfffffc05, 0xeffafc34, 0x0ff0bc34, 0x1ff57c35,
79 /* read burst cycle */
80 0xef0efc04, 0x0e3dac04, 0x10ff5c04, 0xf0fffc00,
81 0xf0fffc00, 0xf1fffc00, 0xfffffc00, 0xfffffc05,
82 0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
83 0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
85 /* write single beat cycle */
86 0xef0efc04, 0x0e29ac00, 0x01b25c04, 0x1ff5fc05,
87 0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
89 /* write burst cycle */
90 0xef0ef804, 0x0e39a000, 0x10f75000, 0xf0fff440,
91 0xf0fffc40, 0xf1fffc04, 0xfffffc05, 0xfffffc04,
92 0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
93 0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
95 /* periodic timer expired */
96 0xeffebc84, 0x1ffd7c04, 0xfffffc04, 0xfffffc84,
97 0xeffebc04, 0x1ffd7c04, 0xfffffc04, 0xfffffc05,
98 0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
101 0xfffffc04, 0xfffffc05, 0xfffffc04, 0xfffffc04
104 /* ------------------------------------------------------------------------- */
106 int board_early_init_f (void)
108 volatile immap_t
*im
= (immap_t
*) CONFIG_SYS_IMMR
;
109 volatile cpm8xx_t
*cp
= &(im
->im_cpm
);
110 volatile iop8xx_t
*ip
= (iop8xx_t
*) & (im
->im_ioport
);
112 /* reset the port A s.a. cpm-routines */
113 ip
->iop_padat
= 0x0000;
114 ip
->iop_papar
= 0x0000;
115 ip
->iop_padir
= 0x0800;
116 ip
->iop_paodr
= 0x0000;
118 /* reset the port B for digital and LCD output */
119 cp
->cp_pbdat
= 0x0300;
120 cp
->cp_pbpar
= 0x5001;
121 cp
->cp_pbdir
= 0x5301;
122 cp
->cp_pbodr
= 0x0000;
124 /* reset the port C configured for SMC1 serial port and aqc. control */
125 ip
->iop_pcdat
= 0x0800;
126 ip
->iop_pcpar
= 0x0000;
127 ip
->iop_pcdir
= 0x0e30;
128 ip
->iop_pcso
= 0x0000;
130 /* Config port D for LCD output */
131 ip
->iop_pdpar
= 0x1fff;
132 ip
->iop_pddir
= 0x1fff;
137 /* ------------------------------------------------------------------------- */
140 * Check Board Identity
142 int checkboard (void)
144 puts ("Board: ELTEC miniHiperCam\n");
148 /* ------------------------------------------------------------------------- */
150 int misc_init_r (void)
154 char *mhpcSensorTypes
[] = { "OMNIVISON OV7610/7620 color",
155 "OMNIVISON OV7110 b&w", NULL
157 char hex
[23] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0,
158 0, 0, 0, 0, 10, 11, 12, 13, 14, 15
162 /* check revision data */
163 eeprom_read (CONFIG_SYS_I2C_EEPROM_ADDR
, 480, (uchar
*) &mhpcRevInfo
, 32);
165 if (strncmp ((char *) &mhpcRevInfo
.board
[2], "MHPC", 4) != 0) {
166 printf ("Enter revision number (0-9): %c ",
167 mhpcRevInfo
.revision
[0]);
168 if (0 != readline (NULL
)) {
169 mhpcRevInfo
.revision
[0] =
170 (char) toupper (console_buffer
[0]);
173 printf ("Enter revision character (A-Z): %c ",
174 mhpcRevInfo
.revision
[1]);
175 if (1 == readline (NULL
)) {
176 mhpcRevInfo
.revision
[1] =
177 (char) toupper (console_buffer
[0]);
180 printf ("Enter board name (V-XXXX-XXXX): %s ",
181 (char *) &mhpcRevInfo
.board
);
182 if (11 == readline (NULL
)) {
183 for (i
= 0; i
< 11; i
++) {
184 mhpcRevInfo
.board
[i
] =
185 (char) toupper (console_buffer
[i
]);
186 mhpcRevInfo
.board
[11] = '\0';
190 printf ("Supported sensor types:\n");
193 printf ("\n \'%d\' : %s\n", i
, mhpcSensorTypes
[i
]);
194 } while (mhpcSensorTypes
[++i
] != NULL
);
197 printf ("\nEnter sensor number (0-255): %d ",
198 (int) mhpcRevInfo
.sensor
);
199 if (0 != readline (NULL
)) {
202 simple_strtoul (console_buffer
, NULL
,
205 } while (mhpcRevInfo
.sensor
>= i
);
207 printf ("Enter serial number: %s ",
208 (char *) &mhpcRevInfo
.serial
);
209 if (6 == readline (NULL
)) {
210 for (i
= 0; i
< 6; i
++) {
211 mhpcRevInfo
.serial
[i
] = console_buffer
[i
];
213 mhpcRevInfo
.serial
[6] = '\0';
216 printf ("Enter ether node ID with leading zero (HEX): %02x%02x%02x%02x%02x%02x ", mhpcRevInfo
.etheraddr
[0], mhpcRevInfo
.etheraddr
[1], mhpcRevInfo
.etheraddr
[2], mhpcRevInfo
.etheraddr
[3], mhpcRevInfo
.etheraddr
[4], mhpcRevInfo
.etheraddr
[5]);
217 if (12 == readline (NULL
)) {
218 for (i
= 0; i
< 12; i
+= 2) {
219 mhpcRevInfo
.etheraddr
[i
>> 1] =
222 (console_buffer
[i
]) -
225 (console_buffer
[i
+ 1]) -
230 /* setup new revision data */
231 eeprom_write (CONFIG_SYS_I2C_EEPROM_ADDR
, 480, (uchar
*) &mhpcRevInfo
,
235 /* set environment */
236 sprintf (nid
, "%02x:%02x:%02x:%02x:%02x:%02x",
237 mhpcRevInfo
.etheraddr
[0], mhpcRevInfo
.etheraddr
[1],
238 mhpcRevInfo
.etheraddr
[2], mhpcRevInfo
.etheraddr
[3],
239 mhpcRevInfo
.etheraddr
[4], mhpcRevInfo
.etheraddr
[5]);
240 setenv ("ethaddr", nid
);
242 /* print actual board identification */
243 printf ("Ident: %s %s Ser %s Rev %c%c\n",
245 (mhpcRevInfo
.sensor
== 0 ? "color" : "b&w"),
246 (char *) &mhpcRevInfo
.serial
, mhpcRevInfo
.revision
[0],
247 mhpcRevInfo
.revision
[1]);
252 /* ------------------------------------------------------------------------- */
254 phys_size_t
initdram (int board_type
)
256 volatile immap_t
*immap
= (immap_t
*) CONFIG_SYS_IMMR
;
257 volatile memctl8xx_t
*memctl
= &immap
->im_memctl
;
259 upmconfig (UPMA
, (uint
*) sdram_table
,
260 sizeof (sdram_table
) / sizeof (uint
));
262 memctl
->memc_mamr
= CONFIG_SYS_MAMR
& (~(MAMR_PTAE
)); /* no refresh yet */
263 memctl
->memc_mbmr
= MBMR_GPL_B4DIS
; /* should this be mamr? - NTL */
264 memctl
->memc_mptpr
= MPTPR_PTP_DIV64
;
265 memctl
->memc_mar
= 0x00008800;
268 * Map controller SDRAM bank 0
270 memctl
->memc_or1
= CONFIG_SYS_OR1_PRELIM
;
271 memctl
->memc_br1
= CONFIG_SYS_BR1_PRELIM
;
275 * Map controller SDRAM bank 1
277 memctl
->memc_or2
= CONFIG_SYS_OR2
;
278 memctl
->memc_br2
= CONFIG_SYS_BR2
;
281 * Perform SDRAM initializsation sequence
283 memctl
->memc_mcr
= 0x80002105; /* SDRAM bank 0 */
285 memctl
->memc_mcr
= 0x80002730; /* SDRAM bank 0 - execute twice */
287 memctl
->memc_mamr
|= MAMR_PTAE
; /* enable refresh */
291 /* leave place for framebuffers */
292 return (SDRAM_MAX_SIZE
- SDRAM_RES_SIZE
);
295 /* ------------------------------------------------------------------------- */
297 static void video_circle (char *center
, int radius
, int color
, int pitch
)
299 int x
, y
, d
, dE
, dSE
;
305 dSE
= -2 * radius
+ 5;
307 *(center
+ x
+ y
* pitch
) = color
;
308 *(center
+ y
+ x
* pitch
) = color
;
309 *(center
+ y
- x
* pitch
) = color
;
310 *(center
+ x
- y
* pitch
) = color
;
311 *(center
- x
- y
* pitch
) = color
;
312 *(center
- y
- x
* pitch
) = color
;
313 *(center
- y
+ x
* pitch
) = color
;
314 *(center
- x
+ y
* pitch
) = color
;
328 *(center
+ x
+ y
* pitch
) = color
;
329 *(center
+ y
+ x
* pitch
) = color
;
330 *(center
+ y
- x
* pitch
) = color
;
331 *(center
+ x
- y
* pitch
) = color
;
332 *(center
- x
- y
* pitch
) = color
;
333 *(center
- y
- x
* pitch
) = color
;
334 *(center
- y
+ x
* pitch
) = color
;
335 *(center
- x
+ y
* pitch
) = color
;
339 /* ------------------------------------------------------------------------- */
341 static void video_test_image (void)
347 for (i
= 0; i
< LCD_VIDEO_ROWS
; i
+= 32) {
348 memset ((char *) (LCD_VIDEO_ADDR
+ i
* LCD_VIDEO_COLS
),
349 LCD_VIDEO_FG
, LCD_VIDEO_COLS
);
350 for (n
= i
+ 1; n
< i
+ 32; n
++)
351 memset ((char *) (LCD_VIDEO_ADDR
+
352 n
* LCD_VIDEO_COLS
), LCD_VIDEO_BG
,
356 for (i
= 0; i
< LCD_VIDEO_COLS
; i
+= 32) {
357 for (n
= 0; n
< LCD_VIDEO_ROWS
; n
++)
358 *(char *) (LCD_VIDEO_ADDR
+ n
* LCD_VIDEO_COLS
+ i
) =
363 di
= (char *) (LCD_VIDEO_ADDR
+ (LCD_VIDEO_COLS
- 256) / 64 * 32 +
364 97 * LCD_VIDEO_COLS
);
365 for (n
= 0; n
< 63; n
++) {
366 for (i
= 0; i
< 256; i
++) {
368 *(di
+ LCD_VIDEO_COLS
* 64) = (i
& 1) * 255;
370 di
+= LCD_VIDEO_COLS
- 256;
373 video_circle ((char *) LCD_VIDEO_ADDR
+ LCD_VIDEO_COLS
/ 2 +
374 LCD_VIDEO_ROWS
/ 2 * LCD_VIDEO_COLS
, LCD_VIDEO_ROWS
/ 2,
375 LCD_VIDEO_FG
, LCD_VIDEO_COLS
);
378 /* ------------------------------------------------------------------------- */
380 static void video_default_lut (unsigned int clut_type
)
383 unsigned char RGB
[] = {
384 0x00, 0x00, 0x00, /* black */
385 0x80, 0x80, 0x80, /* gray */
386 0xff, 0x00, 0x00, /* red */
387 0x00, 0xff, 0x00, /* green */
388 0x00, 0x00, 0xff, /* blue */
389 0x00, 0xff, 0xff, /* cyan */
390 0xff, 0x00, 0xff, /* magenta */
391 0xff, 0xff, 0x00, /* yellow */
392 0x80, 0x00, 0x00, /* dark red */
393 0x00, 0x80, 0x00, /* dark green */
394 0x00, 0x00, 0x80, /* dark blue */
395 0x00, 0x80, 0x80, /* dark cyan */
396 0x80, 0x00, 0x80, /* dark magenta */
397 0x80, 0x80, 0x00, /* dark yellow */
398 0xc0, 0xc0, 0xc0, /* light gray */
399 0xff, 0xff, 0xff, /* white */
404 for (i
= 0; i
< 240; i
++)
405 video_set_lut (i
, i
, i
, i
);
406 for (i
= 0; i
< 16; i
++)
407 video_set_lut (i
+ 240, RGB
[i
* 3], RGB
[i
* 3 + 1],
411 for (i
= 0; i
< 256; i
++)
412 video_set_lut (i
, i
, i
, i
);
416 /* ------------------------------------------------------------------------- */
418 void *video_hw_init (void)
420 unsigned int clut
= 0;
422 immap_t
*immr
= (immap_t
*) CONFIG_SYS_IMMR
;
424 /* enable video only on CLUT value */
425 if ((penv
= (uchar
*)getenv ("clut")) != NULL
)
426 clut
= (u_int
) simple_strtoul ((char *)penv
, NULL
, 10);
430 /* disable graphic before write LCD regs. */
431 immr
->im_lcd
.lcd_lccr
= 0x96000866;
433 /* config LCD regs. */
434 immr
->im_lcd
.lcd_lcfaa
= LCD_VIDEO_ADDR
;
435 immr
->im_lcd
.lcd_lchcr
= 0x010a0093;
436 immr
->im_lcd
.lcd_lcvcr
= 0x900f0024;
438 printf ("Video: 640x480 8Bit Index Lut %s\n",
439 (clut
== 1 ? "240/16 (gray/vga)" : "256(gray)"));
441 video_default_lut (clut
);
443 /* clear framebuffer */
444 memset ((char *) (LCD_VIDEO_ADDR
), LCD_VIDEO_BG
,
445 LCD_VIDEO_ROWS
* LCD_VIDEO_COLS
);
448 immr
->im_lcd
.lcd_lccr
= 0x96000867;
450 /* fill in Graphic Device */
451 gdev
.frameAdrs
= LCD_VIDEO_ADDR
;
452 gdev
.winSizeX
= LCD_VIDEO_COLS
;
453 gdev
.winSizeY
= LCD_VIDEO_ROWS
;
455 gdev
.gdfIndex
= GDF__8BIT_INDEX
;
458 /* return Graphic Device for console */
459 return (void *) &gdev
;
461 /* just graphic enabled - draw something beautiful */
464 return NULL
; /* this disabels cfb - console */
467 /* ------------------------------------------------------------------------- */
469 void video_set_lut (unsigned int index
,
470 unsigned char r
, unsigned char g
, unsigned char b
)
473 unsigned short *pLut
= (unsigned short *) (CONFIG_SYS_IMMR
+ 0x0e00);
475 /* 16 bit lut values, 12 bit used, xxxx BBGG RRii iiii */
476 /* y = 0.299*R + 0.587*G + 0.114*B */
477 lum
= (2990 * r
+ 5870 * g
+ 1140 * b
) / 10000;
479 ((b
& 0xc0) << 4) | ((g
& 0xc0) << 2) | (r
& 0xc0) | (lum
&
483 /* ------------------------------------------------------------------------- */