/***********************************************************************************************************************
* DISCLAIMER
* This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No
* other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all
* applicable laws, including copyright laws.
* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM
* EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES
* SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS
* SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of
* this software. By using this software, you agree to the additional terms and conditions found by accessing the
* following link:
* http://www.renesas.com/disclaimer
*
* Copyright (C) 2012 Renesas Electronics Corporation. All rights reserved.
***********************************************************************************************************************/
/***********************************************************************************************************************
* File Name	   : lcd.c
* Device(s)    : RX
* H/W Platform : RSKRX111
* Description  : Provides variable and function declarations for lcd.c file
***********************************************************************************************************************/
/***********************************************************************************************************************
* History : DD.MM.YYYY Version  Description
*         : 08.11.2012 0.01     Beta Release
***********************************************************************************************************************/

/***********************************************************************************************************************
Includes   <System Includes> , "Project Includes"
***********************************************************************************************************************/
/* Standard string manipulation & formatting functions */
#include <stdio.h>
#include <string.h>
/* Defines standard variable types used in this function */
#include <stdint.h>
/* Bring in board includes. */
#include "platform.h"
/* Following header file provides function prototypes for LCD controlling functions & macro defines */
#include "lcd.h"

/***********************************************************************************************************************
Private global variables and functions
***********************************************************************************************************************/
static void lcd_delay(volatile int32_t nsecs);
static void lcd_nibble_write(uint8_t data_or_ctrl, uint8_t value);
static void lcd_write(uint8_t data_or_ctrl, uint8_t value);

/***********************************************************************************************************************
* Function name : lcd_initialize
* Description   : Initializes the LCD display.
* Arguments     : none
* Return Value  : none
***********************************************************************************************************************/
void lcd_initialize(void)
{
    /* Set LCD data pins as outputs. */
    PORT4.PDR.BYTE |= 0x0F;

    /* Set LCD control pins as outputs. */
    RS_PIN_DDR = 1;
    E_PIN_DDR = 1;

	/* Power Up Delay for the LCD Module */
    lcd_delay(50000000);

	/* Display initialises in 8 bit mode - so send one write (seen as 8 bit) to set to 4 bit mode. */
	lcd_nibble_write(CTRL_WR, 0x03);
    lcd_delay(5000000);
	lcd_nibble_write(CTRL_WR, 0x03);
    lcd_delay(5000000);
	lcd_nibble_write(CTRL_WR, 0x03);
	lcd_delay(5000000);

	/* Function Set */
	lcd_nibble_write(CTRL_WR, 0x02);
    lcd_delay(39000);
	lcd_nibble_write(CTRL_WR, 0x02);
	lcd_nibble_write(CTRL_WR, (LCD_DISPLAY_ON | LCD_TWO_LINE ));
    lcd_delay(39000);

	/* Display ON/OFF control */
	lcd_write(CTRL_WR, LCD_CURSOR_OFF);
    lcd_delay(39000);

	/* Display Clear */
	lcd_write(CTRL_WR, LCD_CLEAR);
    lcd_delay(2000000);

	/* Entry Mode Set */
	lcd_write(CTRL_WR, 0x06);
    lcd_delay(39000);

    /* Home the cursor */
	lcd_write(CTRL_WR, LCD_HOME_L1);
    lcd_delay(5000000);
}

/***********************************************************************************************************************
* Function name : lcd_clear
* Description   : Clears the LCD
* Arguments     : none
* Return Value  : none
***********************************************************************************************************************/
void lcd_clear(void)
{
	/* Display Clear */
	lcd_write(CTRL_WR, LCD_CLEAR);
    lcd_delay(2000000);
}

/***********************************************************************************************************************
* Function name : lcd_display
* Description   : This function controls LCD writes to line 1 or 2 of the LCD.
*                 You need to use the defines LCD_LINE1 and LCD_LINE2 in order to specify the starting position.
*				  For example, to start at the 2nd position on line 1...
*				   		lcd_display(LCD_LINE1 + 1, "Hello")
* Arguments     : position -
*                     Line number of display
*                 string -
*                     Pointer to null terminated string
* Return Value  : none
***********************************************************************************************************************/
void lcd_display(uint8_t position, uint8_t const * string)
{
	/* Declare next position variable */
	static uint8_t next_pos = 0xFF;

	/* Set line position if needed. We don't want to if we don't need to because LCD control operations take longer
       than LCD data operations. */
	if (next_pos != position)
	{
		if(position < LCD_LINE2)
		{
			/* Display on Line 1 */
		  	lcd_write(CTRL_WR, ((uint8_t)(LCD_HOME_L1 + position)));
		}
		else
		{
			/* Display on Line 2 */
		  	lcd_write(CTRL_WR, ((uint8_t)((LCD_HOME_L2 + position) - LCD_LINE2)));
		}

        lcd_delay(39000);

		/* set position index to known value */
		next_pos = position;
	}

	do
	{
        /* Write character to LCD. */
		lcd_write(DATA_WR,*string++);

        lcd_delay(43000);

		/* Increment position index */
		next_pos++;
	}
	while(*string);
}

/***********************************************************************************************************************
* Function name : lcd_delay
* Description   : Implements LCD required delays.
* Arguments     : nsecs -
*                     Number of nanoseconds to delay. RX111 has max clock of 32MHz which gives a cycle time of 31.3ns.
*                     This means that nothing under 313ns should be input. 313ns would be 10 cycles which is still
*                     being optimistic for getting in and out of this function.
* Return Value  : none
***********************************************************************************************************************/
static void lcd_delay(volatile int32_t nsecs)
{
    while (0 < nsecs)
    {
        /* Subtract off 10 cycles per iteration. This number was obtained when using the Renesas toolchain at
           optimization level 2. The number to nanoseconds to subtract off below is calculated off of the ICLK speed. */
        nsecs -= (int32_t)((313.0)*(32000000.0/(float)ICLK_HZ));
    }
}

/***********************************************************************************************************************
* Function name : lcd_nibble_write
* Description   : Writes data to display. Sends command to display.
* Arguments     : value -
*                     The value to write
*                 data_or_ctrl -
*                     Whether to write data or control.
*                     1 = DATA
*                     0 = CONTROL
* Return Value  : none
***********************************************************************************************************************/
static void lcd_nibble_write(uint8_t data_or_ctrl, uint8_t value)
{
	/* Set Register Select pin high for Data */
	if (data_or_ctrl == DATA_WR)
	{
        /* Data write. */
        RS_PIN = 1;
	}
	else
	{
        /* Control write. */
        RS_PIN = 0;
	}

	/* tsu1 delay */
    lcd_delay(60);

  	/* EN enable chip (HIGH) */
    E_PIN = 1;

	/* Output the data */
    PORT4.PODR.BYTE = (value & 0x0F);

	/* tw delay */
    lcd_delay(450);

	/* Latch data by dropping E */
    E_PIN = 0;

	/* th2 delay */
    lcd_delay(10);

	/* tc delay */
    lcd_delay(480);
}

/***********************************************************************************************************************
* Function name : lcd_write
* Description   : This function controls LCD writes to line 1 or 2 of the LCD. You need to use the defines LCD_LINE1 and
*                 LCD_LINE2 in order to specify the starting position.
*				  For example, to start at the 2nd position on line 1...
*				   		lcd_display(LCD_LINE1 + 1, "Hello")
* Arguments     : value -
*                     The value to write
*                 data_or_ctrl -
*                     Whether to write data or control.
*                     1 = DATA
*                     0 = CONTROL
* Return Value  : none
***********************************************************************************************************************/
static void lcd_write(uint8_t data_or_ctrl, uint8_t value)
{
	/* Write upper nibble first */
	lcd_nibble_write(data_or_ctrl, (uint8_t)((value & 0xF0) >> 4));

	/* Write lower nibble second */
	lcd_nibble_write(data_or_ctrl, (uint8_t)(value & 0x0F));
}

