/*---------------------------------------------------------------------------
* Copyright (C) 2005-2007, Freescale Semiconductor, Inc. All Rights Reserved.
* THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
* AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT 
*--------------------------------------------------------------------------*/
//------------------------------------------------------------------------------
//
//  File:  bspbacklight.c
//
//  Provides BSP-specific configuration routines for the backlight driver.
//  The routines in this file assume that we use IPU built-in pulse-width
//  modulator,
//
//------------------------------------------------------------------------------
#pragma warning(push)
#pragma warning(disable: 4201)
#include <windows.h>
#pragma warning(pop)

#include "bsp.h"
#include "pwmdefs.h"

//------------------------------------------------------------------------------
// External Functions


//------------------------------------------------------------------------------
// External Variables


//------------------------------------------------------------------------------
// Defines
#define PWM_DEVICE_NAME                 L"PWM1:"
#define PWM_FREQUENCY                   1000
#define PWM_SOURCE_FREQUENCY            32000
#define PWM_PWMPR_PERIOD                ((PWM_SOURCE_FREQUENCY - (((PWM_FREQUENCY) * 3) / 2)) / (PWM_FREQUENCY))
#define INTENSITY_MAXIMUM               255   // 0 - 255

//------------------------------------------------------------------------------
// Types


//------------------------------------------------------------------------------
// Global Variables


//------------------------------------------------------------------------------
// Local Variables
static HANDLE g_hDriver=INVALID_HANDLE_VALUE;
static PwmSample_t g_PWMSample;

//------------------------------------------------------------------------------
// Local Functions


//------------------------------------------------------------------------------
//
// Function: BSPBacklightInitialize
//
// This function maps the IPU registers.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void BSPBacklightInitialize()
{
   // Config LCD_BACKLIGHT_PWR pin as GPIO Output0
   GPIO_DDKIomuxSetPinMux(LCD_BACKLIGHT_PWR);
   GPIO_DDKIomuxSetPadConfig(LCD_BACKLIGHT_PWR);
   GPIO_DDKGpioWriteDataPinLow(LCD_BACKLIGHT_PWR);
   GPIO_DDKGpioSetConfigIntNone(LCD_BACKLIGHT_PWR, DIR_OUT);
   
   // Clear g_PWMSample variable
   memset(&g_PWMSample, 0, sizeof(g_PWMSample));
   
   g_hDriver = CreateFile(PWM_DEVICE_NAME, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, NULL);
   if (g_hDriver == INVALID_HANDLE_VALUE) {
      ERRORMSG(1, (__WFUNCTION__ TEXT(": CreateFile(") PWM_DEVICE_NAME TEXT(") Failed!\r\n")));
   }
   
   return;
}


//------------------------------------------------------------------------------
//
// Function: BSPBacklightRelease
//
// This function unmaps the IPU registers.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void BSPBacklightRelease()
{
   if (g_hDriver != INVALID_HANDLE_VALUE) {
      CloseHandle(g_hDriver);
      g_hDriver = INVALID_HANDLE_VALUE;
   }
   
   GPIO_DDKGpioSetConfigIntNone(LCD_BACKLIGHT_PWR, DIR_IN);
   
   return;
}


//------------------------------------------------------------------------------
//
// Function: BSPBacklightSetIntensity
//
// This function set backlight level.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
void BSPBacklightSetIntensity(DWORD level)
{
   DWORD bytesWritten;
   
   if (level != 0) {
      if (level > INTENSITY_MAXIMUM) {
         level = INTENSITY_MAXIMUM;
      }
      g_PWMSample.sample = (level * (PWM_PWMPR_PERIOD + 2)) / INTENSITY_MAXIMUM;
      g_PWMSample.period = PWM_PWMPR_PERIOD;
      g_PWMSample.duration = (UINT32)(-1);
      if (g_hDriver != INVALID_HANDLE_VALUE) {
         if (!WriteFile(g_hDriver, &g_PWMSample, sizeof(g_PWMSample), (LPDWORD)&bytesWritten, NULL)) {
            // Error Process
            RETAILMSG(1, (__WFUNCTION__ TEXT(": WriteFile Failed!\r\n")));
         }
      }
      
      // Turn On backlight power
      GPIO_DDKGpioWriteDataPinHigh(LCD_BACKLIGHT_PWR);
   }
   else {
      // Turn Off backlight power
      GPIO_DDKGpioWriteDataPinLow(LCD_BACKLIGHT_PWR);
   }
   
   return;
}
