/******************************************************************************
�� �� ����BU98R10.c
����������BU98R10����Һ������������������ļ�
��    �ߣ�����
��    ����V1.0
��    �ڣ�2017.4.28
******************************************************************************/
#include "dr7f701441.dvf.h"
#include "BU98R10.h"
#include "rh850_macros.h"
#include "GPIO.h"

#ifndef   BU98R10_0_SD
#define   BU98R10_0_SD                      SD0_MCU_OUT
#endif

#ifndef   BU98R10_0_SCL
#define   BU98R10_0_SCL                     SCL0_MCU_OUT
#endif

#ifndef   BU98R10_0_CSB
#define   BU98R10_0_CSB                     CSB0_MCU_OUT
#endif



#ifndef   BU98R10_1_SD
#define   BU98R10_1_SD                      SD1_MCU_OUT
#endif

#ifndef   BU98R10_1_SCL
#define   BU98R10_1_SCL                     SCL1_MCU_OUT
#endif

#ifndef   BU98R10_1_CSB
#define   BU98R10_1_CSB                     CSB1_MCU_OUT
#endif


#if   USE_BU98R10_CHIP_0
volatile BU98R10DDRAMUnion        BU98R10Chip0DDRAM;
BU98R10DDRAMUnion                 BU98R10Chip0DDRAMBackup;
#endif

#if   USE_BU98R10_CHIP_1
volatile BU98R10DDRAMUnion        BU98R10Chip1DDRAM;
BU98R10DDRAMUnion                 BU98R10Chip1DDRAMBackup;
#endif

BU98R10UpdateCtrlStruct           BU98R10Update;

/******************************************************************************
��������BU98R10_Init
��  �ܣ���ʼ��BU98R10
��  ������
����ֵ����
******************************************************************************/
void BU98R10_Init(void)
{
    uint8_t i;

/*    for (i == 0 ; i++ ; i < BU98R10_DDRAM_SIZE)
        BU98R10Chip1DDRAM.Byte[i] = 0 ;

    for (i == 0 ; i++ ; i < BU98R10_DDRAM_SIZE)
        BU98R10Chip0DDRAM.Byte[i] = 0 ;*/

#if     BU98R10_WRITE_AT_SAME_TIME

    BU98R10_All_Command_Write(BU98R10_CMD_SWRST);

    BU98R10_All_Command_Write(BU98R10_CMD_ICSET | BU98R10_PAR_ICSET_RGB);

    BU98R10_All_Command_Write(BU98R10_CMD_DRVCTRL | BU98R10_PAR_DRVCTRL_NORMAL);

    BU98R10_All_Command_Write(BU98R10_CMD_FREQ);
    BU98R10_All_Data_Write(BU98R10_FRAME_FREQ, BU98R10_FRAME_FREQ);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_CTRL);
    BU98R10_All_Data_Write(0x12, 0x12);

    BU98R10_All_Command_Write(BU98R10_CMD_SEG_R);
    BU98R10_All_Data_Write(BU98R10_REG_SEG_R, BU98R10_REG_SEG_R);

    BU98R10_All_Command_Write(BU98R10_CMD_SEG_G);
    BU98R10_All_Data_Write(BU98R10_REG_SEG_G, BU98R10_REG_SEG_G);

    BU98R10_All_Command_Write(BU98R10_CMD_SEG_B);
    BU98R10_All_Data_Write(BU98R10_REG_SEG_B, BU98R10_REG_SEG_B);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_STARTR);
    BU98R10_All_Data_Write(BU98R10_LRS, BU98R10_LRS);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_STARTG);
    BU98R10_All_Data_Write(BU98R10_LGS, BU98R10_LGS);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_STARTB);
    BU98R10_All_Data_Write(BU98R10_LBS, BU98R10_LBS);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_WIDTHR);
    BU98R10_All_Data_Write(BU98R10_LRW, BU98R10_LRW);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_WIDTHG);
    BU98R10_All_Data_Write(BU98R10_LGW, BU98R10_LGW);

    BU98R10_All_Command_Write(BU98R10_CMD_LED_WIDTHB);
    BU98R10_All_Data_Write(BU98R10_LBW, BU98R10_LBW);

    BU98R10_All_Command_Write(BU98R10_CMD_ADSET);
    BU98R10_All_Data_Write(0x00, 0x00);

    BU98R10_All_Command_Write(BU98R10_CMD_DATWR);
    for (i = 0; i < 90; i++)
        BU98R10_All_Data_Write(BU98R10_DEFAULT_BYTE, BU98R10_DEFAULT_BYTE);

    for (i = 0; i < BU98R10_DDRAM_SIZE; i++)
    {
        BU98R10Chip0DDRAM.Byte[i] = BU98R10_DEFAULT_BYTE;
        BU98R10Chip0DDRAMBackup.Byte[i] = BU98R10_DEFAULT_BYTE;

        BU98R10Chip1DDRAM.Byte[i] = BU98R10_DEFAULT_BYTE;
        BU98R10Chip1DDRAMBackup.Byte[i] = BU98R10_DEFAULT_BYTE;
    }

    BU98R10_All_Command_Write(BU98R10_CMD_DISPON);

#endif

    BU98R10Update.En   = 0;
    BU98R10Update.Step = 0;
    BU98R10Update.Cont = 0;
    BU98R10Update.Addr = 0;

#if    USE_BU98R10_CHIP_0
    BU98R10Update.Chip = 0;
#elif  USE_BU98R10_CHIP_1
    BU98R10Update.Chip = 1;
#else
    BU98R10Update.Chip = 255;
#endif
}


void BU98R10_Shutdown(void)
{
#if     BU98R10_WRITE_AT_SAME_TIME
    BU98R10_All_Command_Write(BU98R10_CMD_DISPOFF);
#endif
}

/******************************************************************************
��������BU98R10_Update_Request
��  �ܣ�����ˢ��BU98R10�Ķ�����ʾ
��  ������
����ֵ����
******************************************************************************/
void BU98R10_Update_Request(void)
{
    BU98R10Update.En = 1;

#if    USE_BU98R10_CHIP_0
    BU98R10Update.Chip = 0;
#elif  USE_BU98R10_CHIP_1
    BU98R10Update.Chip = 1;
#else
    BU98R10Update.Chip = 255;
#endif
}

/******************************************************************************
��������BU98R10_Update_Service
��   �ܣ�BU98R10������ʾˢ�·���
��   ������
����ֵ����
*******************************************************************************
ע  �⣺�÷���������ÿ��ϵͳ����ʱʵʱ����
******************************************************************************/
void BU98R10_OPENWINDOW(void)
{

    if (SEG0_MCU_OUT == 1)
    {
        SEG0_MCU_OUT = 0;
        COMM_MCU_OUT = 1;
    }
    else
    {
        SEG0_MCU_OUT = 1;
        COMM_MCU_OUT = 0;
    }

}




void BU98R10_Update_Service(void)
{
    if (BU98R10Update.En)
    {
#if BU98R10_WRITE_AT_SAME_TIME

        switch (BU98R10Update.Step)
        {
        case 0  :
            if ((BU98R10Chip0DDRAM.Byte[BU98R10Update.Addr] != BU98R10Chip0DDRAMBackup.Byte[BU98R10Update.Addr]) || \
                    (BU98R10Chip1DDRAM.Byte[BU98R10Update.Addr] != BU98R10Chip1DDRAMBackup.Byte[BU98R10Update.Addr])
               )
            {
                BU98R10Chip0DDRAMBackup.Byte[BU98R10Update.Addr] = BU98R10Chip0DDRAM.Byte[BU98R10Update.Addr];
                BU98R10Chip1DDRAMBackup.Byte[BU98R10Update.Addr] = BU98R10Chip1DDRAM.Byte[BU98R10Update.Addr];

                if (BU98R10Update.Cont)
                    BU98R10Update.Step = 4;
                else
                    BU98R10Update.Step = 1;
            }
            else
            {
                BU98R10Update.Cont = 0;
                BU98R10Update.Addr++;
                if (BU98R10Update.Addr >= BU98R10_DDRAM_SIZE)
                {
                    BU98R10Update.Addr = 0;
                    BU98R10Update.En   = 0;
                }
            }
            break;

        case 1  :
            BU98R10_All_Command_Write(BU98R10_CMD_ADSET);
            BU98R10Update.Step = 2;
            break;

        case 2  :
#if BU98R10_COLORFUL_LCD_MODE
            BU98R10_All_Data_Write(BU98R10Update.Addr, BU98R10Update.Addr);
#else
            BU98R10_All_Data_Write(BU98R10Update.Addr * 4, BU98R10Update.Addr * 4);
#endif
            BU98R10Update.Step = 3;
            break;

        case 3  :
            BU98R10_All_Command_Write(BU98R10_CMD_DATWR);
            BU98R10Update.Step = 4;
            break;

        case 4  :
            BU98R10_All_Data_Write(BU98R10Chip0DDRAMBackup.Byte[BU98R10Update.Addr], BU98R10Chip1DDRAMBackup.Byte[BU98R10Update.Addr]);
            BU98R10Update.Step = 5;
            break;

        case 5  :
            BU98R10Update.Addr++;
            if (BU98R10Update.Addr >= BU98R10_DDRAM_SIZE)
            {
                BU98R10Update.Addr = 0;
                BU98R10Update.En   = 0;
                BU98R10Update.Cont = 0;
            }
            else
                BU98R10Update.Cont = 1;

            BU98R10Update.Step = 0;
            break;

        default : BU98R10Update.En   = 0;
            BU98R10Update.Step = 0;
            BU98R10Update.Cont = 0;
            BU98R10Update.Addr = 0;
            break;
        }
#endif
    }
}

#if   USE_BU98R10_CHIP_0
void BU98R10_0_Command_Write(uint8_t Cmd)
{
    uint8_t i;

    BU98R10_0_SD  = 0;
    BU98R10_0_SCL = 0;
    BU98R10_0_CSB = 0;

    nop();
    nop();
    nop();

    BU98R10_0_SCL = 1;

    for (i = 0; i < 8; i++)
    {
        BU98R10_0_SCL = 0;

        if (Cmd & 0x80)
            BU98R10_0_SD = 1;
        else
            BU98R10_0_SD = 0;

        nop();
        nop();
        nop();

        BU98R10_0_SCL = 1;

        Cmd <<= 1;
    }

    BU98R10_0_CSB = 1;
}

void BU98R10_0_Data_Write(uint8_t Dat)
{
    uint8_t i;

    BU98R10_0_SD  = 1;
    BU98R10_0_SCL = 0;
    BU98R10_0_CSB = 0;

    nop();
    nop();
    nop();

    BU98R10_0_SCL = 1;

    for (i = 0; i < 8; i++)
    {
        BU98R10_0_SCL = 0;

        if (Dat & 0x80)
            BU98R10_0_SD = 1;
        else
            BU98R10_0_SD = 0;

        nop();
        nop();
        nop();

        BU98R10_0_SCL = 1;

        Dat <<= 1;
    }

    BU98R10_0_CSB = 1;
}
#endif

#if   USE_BU98R10_CHIP_1
void BU98R10_1_Command_Write(uint8_t Cmd)
{
    uint8_t i;

    BU98R10_1_SD  = 0;
    BU98R10_1_SCL = 0;
    BU98R10_1_CSB = 0;

    nop();
    nop();
    nop();

    BU98R10_1_SCL = 1;

    for (i = 0; i < 8; i++)
    {
        BU98R10_1_SCL = 0;

        if (Cmd & 0x80)
            BU98R10_1_SD = 1;
        else
            BU98R10_1_SD = 0;

        nop();
        nop();
        nop();

        BU98R10_1_SCL = 1;

        Cmd <<= 1;
    }

    BU98R10_1_CSB = 1;
}

void BU98R10_1_Data_Write(uint8_t Dat)
{
    uint8_t i;

    BU98R10_1_SD  = 1;
    BU98R10_1_SCL = 0;
    BU98R10_1_CSB = 0;

    nop();
    nop();
    nop();

    BU98R10_1_SCL = 1;

    for (i = 0; i < 8; i++)
    {
        BU98R10_1_SCL = 0;

        if (Dat & 0x80)
            BU98R10_1_SD = 1;
        else
            BU98R10_1_SD = 0;

        nop();
        nop();
        nop();

        BU98R10_1_SCL = 1;

        Dat <<= 1;
    }

    BU98R10_1_CSB = 1;
}

#endif




#if   BU98R10_WRITE_AT_SAME_TIME

void BU98R10_All_Command_Write(uint8_t Cmd)
{
    uint8_t i, j;

    BU98R10_0_SD  = 0;
    BU98R10_1_SD  = 0;

    BU98R10_0_SCL = 0;
    BU98R10_1_SCL = 0;

    BU98R10_0_CSB = 0;
    BU98R10_1_CSB = 0;

    for (j = 0; j < 50; j++)
    {
        nop();
        nop();
        nop();
        nop();
        nop();
    }

    BU98R10_0_SCL = 1;
    BU98R10_1_SCL = 1;

    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 25; j++)
        {
            nop();
            nop();
            nop();
            nop();
            nop();
        }

        BU98R10_0_SCL = 0;
        BU98R10_1_SCL = 0;

        if (Cmd & 0x80)
        {
            BU98R10_0_SD = 1;
            BU98R10_1_SD = 1;
        }
        else
        {
            BU98R10_0_SD = 0;
            BU98R10_1_SD = 0;
        }

        for (j = 0; j < 25; j++)
        {
            nop();
            nop();
            nop();
            nop();
            nop();
        }

        BU98R10_0_SCL = 1;
        BU98R10_1_SCL = 1;

        Cmd <<= 1;
    }

    for (j = 0; j < 50; j++)
    {
        nop();
        nop();
        nop();
        nop();
        nop();
    }
    BU98R10_0_CSB = 1;
    BU98R10_1_CSB = 1;
}


void BU98R10_All_Data_Write(uint8_t Dat0, uint8_t Dat1)
{
    uint8_t i, j;

    BU98R10_0_SD  = 1;
    BU98R10_1_SD  = 1;

    BU98R10_0_SCL = 0;
    BU98R10_1_SCL = 0;

    BU98R10_0_CSB = 0;
    BU98R10_1_CSB = 0;

    for (j = 0; j < 50; j++)
    {
        nop();
        nop();
        nop();
        nop();
        nop();
    }


    BU98R10_0_SCL = 1;
    BU98R10_1_SCL = 1;

    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 50; j++)
        {
            nop();
            nop();
            nop();
            nop();
            nop();
        }

        BU98R10_0_SCL = 0;
        BU98R10_1_SCL = 0;

        if (Dat0 & 0x80)
            BU98R10_0_SD = 1;
        else
            BU98R10_0_SD = 0;

        if (Dat1 & 0x80)
            BU98R10_1_SD = 1;
        else
            BU98R10_1_SD = 0;

        for (j = 0; j < 50; j++)
        {
            nop();
            nop();
            nop();
            nop();
            nop();
        }

        BU98R10_0_SCL = 1;
        BU98R10_1_SCL = 1;

        Dat0 <<= 1;
        Dat1 <<= 1;
    }

    for (j = 0; j < 50; j++)
    {
        nop();
        nop();
        nop();
        nop();
        nop();
    }
    BU98R10_0_CSB = 1;
    BU98R10_1_CSB = 1;
}
#endif