]>
git.ipfire.org Git - people/ms/u-boot.git/blob - board/eltec/mhpc/mhpc.c
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
[ CFG_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
*) CFG_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 ( CFG_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 ( " \n Enter 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 ( CFG_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 long int initdram ( int board_type
)
256 volatile immap_t
* immap
= ( immap_t
*) CFG_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
= CFG_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
= CFG_OR1_PRELIM
;
271 memctl
-> memc_br1
= CFG_BR1_PRELIM
;
275 * Map controller SDRAM bank 1
277 memctl
-> memc_or2
= CFG_OR2
;
278 memctl
-> memc_br2
= CFG_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
*) CFG_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 *) ( CFG_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 /* ------------------------------------------------------------------------- */