151 lines
3.8 KiB
C
151 lines
3.8 KiB
C
|
/*
|
|||
|
* (C) Copyright 2002
|
|||
|
* St<EFBFBD>ubli Faverges - <www.staubli.com>
|
|||
|
* Pierre AUBERT p.aubert@staubli.com
|
|||
|
*
|
|||
|
* (C) Copyright 2005
|
|||
|
* Martin Krause TQ-Systems GmbH martin.krause@tqs.de
|
|||
|
*
|
|||
|
* 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
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* Basic video support for SMI SM501 "Voyager" graphic controller
|
|||
|
*/
|
|||
|
|
|||
|
#include <common.h>
|
|||
|
|
|||
|
#ifdef CONFIG_VIDEO_SM501
|
|||
|
|
|||
|
#include <video_fb.h>
|
|||
|
#include <sm501.h>
|
|||
|
|
|||
|
#define read8(ptrReg) \
|
|||
|
*(volatile unsigned char *)(sm501.isaBase + ptrReg)
|
|||
|
|
|||
|
#define write8(ptrReg,value) \
|
|||
|
*(volatile unsigned char *)(sm501.isaBase + ptrReg) = value
|
|||
|
|
|||
|
#define read16(ptrReg) \
|
|||
|
(*(volatile unsigned short *)(sm501.isaBase + ptrReg))
|
|||
|
|
|||
|
#define write16(ptrReg,value) \
|
|||
|
(*(volatile unsigned short *)(sm501.isaBase + ptrReg) = value)
|
|||
|
|
|||
|
#define read32(ptrReg) \
|
|||
|
(*(volatile unsigned int *)(sm501.isaBase + ptrReg))
|
|||
|
|
|||
|
#define write32(ptrReg, value) \
|
|||
|
(*(volatile unsigned int *)(sm501.isaBase + ptrReg) = value)
|
|||
|
|
|||
|
GraphicDevice sm501;
|
|||
|
|
|||
|
/*-----------------------------------------------------------------------------
|
|||
|
* SmiSetRegs --
|
|||
|
*-----------------------------------------------------------------------------
|
|||
|
*/
|
|||
|
static void SmiSetRegs (void)
|
|||
|
{
|
|||
|
/*
|
|||
|
* The content of the chipset register depends on the board (clocks,
|
|||
|
* ...)
|
|||
|
*/
|
|||
|
const SMI_REGS *preg = board_get_regs ();
|
|||
|
while (preg->Index) {
|
|||
|
write32 (preg->Index, preg->Value);
|
|||
|
/*
|
|||
|
* Insert a delay between
|
|||
|
*/
|
|||
|
udelay (1000);
|
|||
|
preg ++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*-----------------------------------------------------------------------------
|
|||
|
* video_hw_init --
|
|||
|
*-----------------------------------------------------------------------------
|
|||
|
*/
|
|||
|
void *video_hw_init (void)
|
|||
|
{
|
|||
|
unsigned int *vm, i;
|
|||
|
|
|||
|
memset (&sm501, 0, sizeof (GraphicDevice));
|
|||
|
|
|||
|
/*
|
|||
|
* Initialization of the access to the graphic chipset Retreive base
|
|||
|
* address of the chipset (see board/RPXClassic/eccx.c)
|
|||
|
*/
|
|||
|
if ((sm501.isaBase = board_video_init ()) == 0) {
|
|||
|
return (NULL);
|
|||
|
}
|
|||
|
|
|||
|
if ((sm501.frameAdrs = board_video_get_fb ()) == 0) {
|
|||
|
return (NULL);
|
|||
|
}
|
|||
|
|
|||
|
sm501.winSizeX = board_get_width ();
|
|||
|
sm501.winSizeY = board_get_height ();
|
|||
|
|
|||
|
#if defined(CONFIG_VIDEO_SM501_8BPP)
|
|||
|
sm501.gdfIndex = GDF__8BIT_INDEX;
|
|||
|
sm501.gdfBytesPP = 1;
|
|||
|
|
|||
|
#elif defined(CONFIG_VIDEO_SM501_16BPP)
|
|||
|
sm501.gdfIndex = GDF_16BIT_565RGB;
|
|||
|
sm501.gdfBytesPP = 2;
|
|||
|
|
|||
|
#elif defined(CONFIG_VIDEO_SM501_32BPP)
|
|||
|
sm501.gdfIndex = GDF_32BIT_X888RGB;
|
|||
|
sm501.gdfBytesPP = 4;
|
|||
|
#else
|
|||
|
#error Unsupported SM501 BPP
|
|||
|
#endif
|
|||
|
|
|||
|
sm501.memSize = sm501.winSizeX * sm501.winSizeY * sm501.gdfBytesPP;
|
|||
|
|
|||
|
/* Load Smi registers */
|
|||
|
SmiSetRegs ();
|
|||
|
|
|||
|
/* (see board/RPXClassic/RPXClassic.c) */
|
|||
|
board_validate_screen (sm501.isaBase);
|
|||
|
|
|||
|
/* Clear video memory */
|
|||
|
i = sm501.memSize/4;
|
|||
|
vm = (unsigned int *)sm501.frameAdrs;
|
|||
|
while(i--)
|
|||
|
*vm++ = 0;
|
|||
|
|
|||
|
return (&sm501);
|
|||
|
}
|
|||
|
|
|||
|
/*-----------------------------------------------------------------------------
|
|||
|
* video_set_lut --
|
|||
|
*-----------------------------------------------------------------------------
|
|||
|
*/
|
|||
|
void video_set_lut (
|
|||
|
unsigned int index, /* color number */
|
|||
|
unsigned char r, /* red */
|
|||
|
unsigned char g, /* green */
|
|||
|
unsigned char b /* blue */
|
|||
|
)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
#endif /* CONFIG_VIDEO_SM501 */
|