/*
 * (C) Copyright 2001
 * ELTEC Elektronik AG
 * Frank Gottschling <fgottschling@eltec.de>
 *
 * Board specific routines for the miniHiPerCam
 *
 * - initialisation (eeprom)
 * - memory controller
 * - serial io initialisation
 * - ethernet io initialisation
 *
 * -----------------------------------------------------------------
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
#include <common.h>
#include <linux/ctype.h>
#include <commproc.h>
#include "mpc8xx.h"
#include <video_fb.h>

/* imports from common/main.c */
extern char console_buffer[CFG_CBSIZE];

extern void eeprom_init  (void);
extern int  eeprom_read  (unsigned dev_addr, unsigned offset,
			  unsigned char *buffer, unsigned cnt);
extern int  eeprom_write (unsigned dev_addr, unsigned offset,
			  unsigned char *buffer, unsigned cnt);

/* globals */
void *video_hw_init(void);
void video_set_lut (unsigned int index,     /* color number */
		    unsigned char r,        /* red */
		    unsigned char g,        /* green */
		    unsigned char b         /* blue */
		    );

GraphicDevice gdev;

/* locals */
static void video_circle (char *center, int radius, int color, int pitch);
static void video_test_image (void);
static void video_default_lut (unsigned int clut_type);

/* revision info foer MHPC EEPROM offset 480 */
typedef struct  {
    char    board[12];      /* 000 - Board Revision information */
    char    sensor;         /* 012 - Sensor Type information */
    char    serial[8];      /* 013 - Board serial number */
    char    etheraddr[6];   /* 021 - Ethernet node addresse */
    char    revision[2];    /* 027 - Revision code */
    char    option[3];      /* 029 - resevered for options */
} revinfo;

/* ------------------------------------------------------------------------- */

static const unsigned int sdram_table[] =
{
    /* read single beat cycle */
    0xef0efc04, 0x0e2dac04, 0x01ba5c04, 0x1ff5fc00,
    0xfffffc05, 0xeffafc34, 0x0ff0bc34, 0x1ff57c35,

    /* read burst cycle */
    0xef0efc04, 0x0e3dac04, 0x10ff5c04, 0xf0fffc00,
    0xf0fffc00, 0xf1fffc00, 0xfffffc00, 0xfffffc05,
    0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
    0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,

    /* write single beat cycle */
    0xef0efc04, 0x0e29ac00, 0x01b25c04, 0x1ff5fc05,
    0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,

    /* write burst cycle */
    0xef0ef804, 0x0e39a000, 0x10f75000, 0xf0fff440,
    0xf0fffc40, 0xf1fffc04, 0xfffffc05, 0xfffffc04,
    0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,
    0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,

    /* periodic timer expired */
    0xeffebc84, 0x1ffd7c04, 0xfffffc04, 0xfffffc84,
    0xeffebc04, 0x1ffd7c04, 0xfffffc04, 0xfffffc05,
    0xfffffc04, 0xfffffc04, 0xfffffc04, 0xfffffc04,

    /* exception */
    0xfffffc04, 0xfffffc05, 0xfffffc04, 0xfffffc04
};

/* ------------------------------------------------------------------------- */

int board_early_init_f (void)
{
    volatile immap_t  *im = (immap_t *)CFG_IMMR;
    volatile cpm8xx_t *cp = &(im->im_cpm);
    volatile iop8xx_t *ip = (iop8xx_t *)&(im->im_ioport);

    /* reset the port A s.a. cpm-routines */
    ip->iop_padat = 0x0000;
    ip->iop_papar = 0x0000;
    ip->iop_padir = 0x0800;
    ip->iop_paodr = 0x0000;

    /* reset the port B for digital and LCD output */
    cp->cp_pbdat  = 0x0300;
    cp->cp_pbpar  = 0x5001;
    cp->cp_pbdir  = 0x5301;
    cp->cp_pbodr  = 0x0000;

    /* reset the port C configured for SMC1 serial port and aqc. control */
    ip->iop_pcdat = 0x0800;
    ip->iop_pcpar = 0x0000;
    ip->iop_pcdir = 0x0e30;
    ip->iop_pcso  = 0x0000;

    /* Config port D for LCD output */
    ip->iop_pdpar = 0x1fff;
    ip->iop_pddir = 0x1fff;

    return (0);
}

/* ------------------------------------------------------------------------- */

/*
 * Check Board Identity
 */
int checkboard (void)
{
    puts ("Board: ELTEC miniHiperCam\n");
    return(0);
}

/* ------------------------------------------------------------------------- */

int misc_init_r(void)
{
    revinfo  mhpcRevInfo;
    char     nid[32];
    char     *mhpcSensorTypes[] = { "OMNIVISON OV7610/7620 color",
				    "OMNIVISON OV7110 b&w", NULL };
    char     hex[23] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0,
			 0, 0, 0, 0, 10, 11, 12, 13, 14, 15 };
    int      i;

    /* check revision data */
    eeprom_read (CFG_I2C_EEPROM_ADDR, 480, (char*)&mhpcRevInfo, 32);

    if (strncmp((char *)&mhpcRevInfo.board[2], "MHPC", 4) != 0)
    {
    printf ("Enter revision number (0-9): %c  ", mhpcRevInfo.revision[0]);
    if (0 != readline (NULL))
    {
	mhpcRevInfo.revision[0] = (char)toupper(console_buffer[0]);
    }

    printf ("Enter revision character (A-Z): %c  ", mhpcRevInfo.revision[1]);
    if (1 == readline (NULL))
    {
	mhpcRevInfo.revision[1] = (char)toupper(console_buffer[0]);
    }

    printf("Enter board name (V-XXXX-XXXX): %s  ", (char *)&mhpcRevInfo.board);
    if (11 == readline (NULL))
    {
	for (i=0; i<11; i++)
	{
	    mhpcRevInfo.board[i] =  (char)toupper(console_buffer[i]);
	    mhpcRevInfo.board[11] = '\0';
	}
    }

    printf("Supported sensor types:\n");
    i=0;
    do
    {
	printf("\n    \'%d\' : %s\n", i, mhpcSensorTypes[i]);
    } while ( mhpcSensorTypes[++i] != NULL );

    do
    {
	printf("\nEnter sensor number (0-255): %d  ", (int)mhpcRevInfo.sensor );
	if (0 != readline (NULL))
	{
	mhpcRevInfo.sensor = (unsigned char)simple_strtoul(console_buffer, NULL, 10);
	}
    } while ( mhpcRevInfo.sensor >= i );

    printf("Enter serial number: %s ", (char *)&mhpcRevInfo.serial );
    if (6 == readline (NULL))
    {
	for (i=0; i<6; i++)
	{
	mhpcRevInfo.serial[i] = console_buffer[i];
	}
	mhpcRevInfo.serial[6] = '\0';
    }

    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]  );
    if (12 == readline (NULL))
    {
	for (i=0; i<12; i+=2)
	{
	mhpcRevInfo.etheraddr[i>>1] = (char)(16*hex[toupper(console_buffer[i])-'0'] +
			     hex[toupper(console_buffer[i+1])-'0']);
	}
    }

    /* setup new revision data */
    eeprom_write (CFG_I2C_EEPROM_ADDR, 480, (char*)&mhpcRevInfo, 32);
    }

    /* set environment */
    sprintf( nid, "%02x:%02x:%02x:%02x:%02x:%02x",
		  mhpcRevInfo.etheraddr[0], mhpcRevInfo.etheraddr[1],
		  mhpcRevInfo.etheraddr[2], mhpcRevInfo.etheraddr[3],
		  mhpcRevInfo.etheraddr[4], mhpcRevInfo.etheraddr[5]);
    setenv("ethaddr", nid);

    /* print actual board identification */
    printf("Ident: %s %s Ser %s Rev %c%c\n",
	    mhpcRevInfo.board, (mhpcRevInfo.sensor==0?"color":"b&w"),
	    (char *)&mhpcRevInfo.serial,
	    mhpcRevInfo.revision[0], mhpcRevInfo.revision[1]);

    return (0);
}

/* ------------------------------------------------------------------------- */

long int initdram (int board_type)
{
    volatile immap_t     *immap  = (immap_t *)CFG_IMMR;
    volatile memctl8xx_t *memctl = &immap->im_memctl;

    upmconfig(UPMA, (uint *)sdram_table, sizeof(sdram_table)/sizeof(uint));

    memctl->memc_mamr  = CFG_MAMR & (~(MAMR_PTAE)); /* no refresh yet */
    memctl->memc_mbmr  = MBMR_GPL_B4DIS;	/* should this be mamr? - NTL */
    memctl->memc_mptpr = MPTPR_PTP_DIV64;
    memctl->memc_mar   = 0x00008800;

    /*
     * Map controller SDRAM bank 0
     */
    memctl->memc_or1 = CFG_OR1_PRELIM;
    memctl->memc_br1 = CFG_BR1_PRELIM;
    udelay(200);

    /*
     * Map controller SDRAM bank 1
     */
    memctl->memc_or2 = CFG_OR2;
    memctl->memc_br2 = CFG_BR2;

    /*
     * Perform SDRAM initializsation sequence
     */
    memctl->memc_mcr  = 0x80002105;    /* SDRAM bank 0 */
    udelay(1);
    memctl->memc_mcr  = 0x80002730;    /* SDRAM bank 0 - execute twice */
    udelay(1);
    memctl->memc_mamr |= MAMR_PTAE;    /* enable refresh */

    udelay(10000);

    /* leave place for framebuffers */
    return (SDRAM_MAX_SIZE-SDRAM_RES_SIZE);
}

/* ------------------------------------------------------------------------- */

static void video_circle (char *center, int radius, int color, int pitch)
{
    int x,y,d,dE,dSE;

    x   = 0;
    y   = radius;
    d   = 1-radius;
    dE  = 3;
    dSE = -2*radius+5;

    *(center+x+y*pitch) = color;
    *(center+y+x*pitch) = color;
    *(center+y-x*pitch) = color;
    *(center+x-y*pitch) = color;
    *(center-x-y*pitch) = color;
    *(center-y-x*pitch) = color;
    *(center-y+x*pitch) = color;
    *(center-x+y*pitch) = color;
    while(y>x)
    {
	if (d<0)
	{
	    d   += dE;
	    dE  += 2;
	    dSE += 2;
	    x++;
	}
	else
	{
	    d   += dSE;
	    dE  += 2;
	    dSE += 4;
	    x++;
	    y--;
	}
	*(center+x+y*pitch) = color;
	*(center+y+x*pitch) = color;
	*(center+y-x*pitch) = color;
	*(center+x-y*pitch) = color;
	*(center-x-y*pitch) = color;
	*(center-y-x*pitch) = color;
	*(center-y+x*pitch) = color;
	*(center-x+y*pitch) = color;
    }
}

/* ------------------------------------------------------------------------- */

static void video_test_image(void)
{
    char *di;
    int i, n;

    /* draw raster */
    for (i=0; i<LCD_VIDEO_ROWS; i+=32)
    {
	memset((char*)(LCD_VIDEO_ADDR+i*LCD_VIDEO_COLS), LCD_VIDEO_FG, LCD_VIDEO_COLS);
	for (n=i+1;n<i+32;n++)
	    memset((char*)(LCD_VIDEO_ADDR+n*LCD_VIDEO_COLS), LCD_VIDEO_BG, LCD_VIDEO_COLS);
    }

    for (i=0; i<LCD_VIDEO_COLS; i+=32)
    {
	for (n=0; n<LCD_VIDEO_ROWS; n++)
	    *(char*)(LCD_VIDEO_ADDR+n*LCD_VIDEO_COLS+i) = LCD_VIDEO_FG;
    }

    /* draw gray bar */
    di = (char *)(LCD_VIDEO_ADDR + (LCD_VIDEO_COLS-256)/64*32 + 97*LCD_VIDEO_COLS);
    for (n=0; n<63; n++)
    {
	for (i=0; i<256; i++)
	{
	    *di++ = (char)i;
	    *(di+LCD_VIDEO_COLS*64) = (i&1)*255;
	}
	di += LCD_VIDEO_COLS-256;
    }

    video_circle ((char*)LCD_VIDEO_ADDR+LCD_VIDEO_COLS/2+LCD_VIDEO_ROWS/2*LCD_VIDEO_COLS,
		  LCD_VIDEO_ROWS/2,LCD_VIDEO_FG, LCD_VIDEO_COLS);
}

/* ------------------------------------------------------------------------- */

static void video_default_lut (unsigned int clut_type)
{
    unsigned int i;
    unsigned char RGB[] =
	{
	0x00, 0x00, 0x00,   /* black */
	0x80, 0x80, 0x80,   /* gray */
	0xff, 0x00, 0x00,   /* red */
	0x00, 0xff, 0x00,   /* green */
	0x00, 0x00, 0xff,   /* blue */
	0x00, 0xff, 0xff,   /* cyan */
	0xff, 0x00, 0xff,   /* magenta */
	0xff, 0xff, 0x00,   /* yellow */
	0x80, 0x00, 0x00,   /* dark red */
	0x00, 0x80, 0x00,   /* dark green */
	0x00, 0x00, 0x80,   /* dark blue */
	0x00, 0x80, 0x80,   /* dark cyan */
	0x80, 0x00, 0x80,   /* dark magenta */
	0x80, 0x80, 0x00,   /* dark yellow */
	0xc0, 0xc0, 0xc0,   /* light gray */
	0xff, 0xff, 0xff,   /* white */
	};

    switch (clut_type)
    {
    case 1:
	for (i=0; i<240; i++)
	    video_set_lut (i, i, i, i);
	for (i=0; i<16; i++)
	    video_set_lut (i+240, RGB[i*3], RGB[i*3+1], RGB[i*3+2]);
	break;
    default:
	for (i=0; i<256; i++)
	    video_set_lut (i, i, i, i);
    }
}

/* ------------------------------------------------------------------------- */

void *video_hw_init (void)
{
    unsigned int clut = 0;
    unsigned char *penv;
    immap_t *immr = (immap_t *) CFG_IMMR;

    /* enable video only on CLUT value */
    if ((penv = getenv ("clut")) != NULL)
	clut = (u_int)simple_strtoul (penv, NULL, 10);
    else
	return NULL;

    /* disable graphic before write LCD regs. */
    immr->im_lcd.lcd_lccr = 0x96000866;

    /* config LCD regs. */
    immr->im_lcd.lcd_lcfaa = LCD_VIDEO_ADDR;
    immr->im_lcd.lcd_lchcr = 0x010a0093;
    immr->im_lcd.lcd_lcvcr = 0x900f0024;

    printf ("Video: 640x480 8Bit Index Lut %s\n",
	    (clut==1?"240/16 (gray/vga)":"256(gray)"));

    video_default_lut (clut);

    /* clear framebuffer */
    memset ( (char*)(LCD_VIDEO_ADDR), LCD_VIDEO_BG, LCD_VIDEO_ROWS*LCD_VIDEO_COLS );

    /* enable graphic */
    immr->im_lcd.lcd_lccr = 0x96000867;

    /* fill in Graphic Device */
    gdev.frameAdrs = LCD_VIDEO_ADDR;
    gdev.winSizeX = LCD_VIDEO_COLS;
    gdev.winSizeY = LCD_VIDEO_ROWS;
    gdev.gdfBytesPP = 1;
    gdev.gdfIndex = GDF__8BIT_INDEX;

    if (clut > 1)
	/* return Graphic Device for console */
	return (void *)&gdev;
    else
	/* just graphic enabled - draw something beautiful */
	video_test_image();

    return NULL;            /* this disabels cfb - console */
}

/* ------------------------------------------------------------------------- */

void video_set_lut (unsigned int index,
		    unsigned char r, unsigned char g, unsigned char b)
{
    unsigned int lum;
    unsigned short *pLut = (unsigned short *)(CFG_IMMR + 0x0e00);

    /* 16 bit lut values, 12 bit used, xxxx BBGG RRii iiii */
    /* y = 0.299*R + 0.587*G + 0.114*B */
    lum = (2990*r + 5870*g + 1140*b)/10000;
    pLut[index] = ((b & 0xc0)<<4) | ((g & 0xc0)<<2) | (r & 0xc0) | (lum & 0x3f);
}

/* ------------------------------------------------------------------------- */
