/******************************************************************************

Copyright (c) 2005 Analog Devices.  All Rights Reserved.

This software is proprietary and confidential.  By using this software you agree
to the terms of the associated Analog Devices License Agreement.  

******************************************************************************/



/******************************************************************************

$File:		lcd.c $
$Revision: 1.3 $
$Date: 2008/03/24 20:03:52 $


Description:
	This file contains functions to control lcd output devices like the NEC
	

Modification History:
====================
Revision 1.0 - BJ 2006/03/27
	Created file
Revision 1.1 - BJ 2006/05/08
	Updated example to support revision to device access functions
Revision 2.0 - BJ 2006/05/08
	Updated to support new device model
	
******************************************************************************/



/******************************************************************************

Include files

******************************************************************************/

#include <SensorCommon/device.h>
#include <SensorCommon/lcd.h>
#include <drivers/lcd/nec/adi_nl6448bc33_54.h>




/******************************************************************************

	Function: lcd_open_nl6448BC33_54
	
	Description: Open the NEC LCD device

******************************************************************************/

ADI_DEV_DEVICE_HANDLE lcd_open_nl6448bc33(
	ADI_DEV_MANAGER_HANDLE	DevManager,
	ADI_DMA_MANAGER_HANDLE	DevDMA,
	ADI_DCB_HANDLE			DevDCB,
	u32 PPI,
	u16 *Data, u8 DataSize, 
	ADI_DCB_CALLBACK_FN Callback,
	ADI_DEV_CMD_VALUE_PAIR *Args)
{
	u32 Code,Blank=0;
	ADI_DEV_DEVICE_HANDLE Handle=NULL;
	
	
	while (Args&&Args->CommandID!=ADI_DEV_CMD_END)
	{
//		switch (Args->CommandID)
//		{
//			case LCD_CMD_CLEAR: Blank=(u32)Args->Value; break;
//		}
		Args++;
	}
	
	
    // try and open the device, if it fails then return error code
	if ((Code=adi_dev_Open(
		DevManager,
		&ADI_NL6448BC3354_EntryPoint,
		0,
		&Handle,
		&Handle,
		ADI_DEV_DIRECTION_OUTBOUND,
		DevDMA,
		DevDCB,
		Callback?Callback:NULL))!=ADI_DEV_RESULT_SUCCESS)
		return NULL;
	
	
	// now configure the device
	if (Code==ADI_DEV_RESULT_SUCCESS)
		Code=adi_dev_Control(Handle,ADI_NL6448BC3354_CMD_OPEN_PPI,(void *)PPI);
	
	
	if (Code==ADI_DEV_RESULT_SUCCESS)
		Code=adi_dev_Control(Handle,ADI_DEV_CMD_SET_DATAFLOW_METHOD,(void *)ADI_DEV_MODE_CHAINED_LOOPBACK);
	
	
	if (Code==ADI_DEV_RESULT_SUCCESS)
	{
		static ADI_DEV_BUFFER Buffer[1];
		GFX_CANVAS Canvas;
		u32 i,Width,Height;
		
		
		gfx_init(&Canvas,GFX_MODE_VGA,(u16 *)Data,0,0,0,0);
		Width=gfx_getframewidth(&Canvas);
		Height=gfx_getframeheight(&Canvas);
		
		
		for (i=0;i<sizeof(Buffer)/sizeof(Buffer[0]);i++)
		{
			Buffer[i].TwoD.Data=Data;
			Buffer[i].TwoD.ElementWidth=DataSize;
			Buffer[i].TwoD.XCount=(Width*sizeof(u16))/Buffer[i].TwoD.ElementWidth;
			Buffer[i].TwoD.XModify=Buffer[i].TwoD.ElementWidth;
			Buffer[i].TwoD.YCount=Height;
			Buffer[i].TwoD.YModify=Buffer[i].TwoD.ElementWidth;
			Buffer[i].TwoD.CallbackParameter=&Buffer[i];
			Buffer[i].TwoD.pNext=NULL;
			Buffer[i].TwoD.pAdditionalInfo=(void *)ADI_DEV_BUFFER_UNDEFINED;
			Code=adi_dev_Write(Handle,ADI_DEV_2D,&Buffer[i]);
		}
	}
	
	
	if (Code==ADI_DEV_RESULT_SUCCESS)
		Code=adi_dev_Control(Handle,ADI_DEV_CMD_SET_DATAFLOW,(void *)true);
	
	
	// If configuration failed close the device
	if (Code!=ADI_DEV_RESULT_SUCCESS)
	{
		adi_dev_Close(Handle);
		Handle=NULL;
	}
	
	
	return Handle;
}

/*****************************************************************************/
