s3c6410_ldi.c

来自「6410BSP3」· C语言 代码 · 共 1,274 行 · 第 1/3 页

C
1,274
字号

    return error;
}



static void LDI_SMRP_LTE480WV_RGB_port_initialize(void)
{
    LDI_MSG((_T("[LDI]++LDI_SMRP_LTE480WV_RGB_port_initialize()\n\r")));

    // PCI                    : GPF[14]
    // LCD_PANNEL_ON        : GPF[13]

    // set GPIO Initial Value to Low
    g_pGPIOReg->GPFDAT &= ~(0x3<<13);    // PCI, LCD_PANNEL_ON

    // Pull Up/Down Disable
    g_pGPIOReg->GPFPUD &= ~(0xf<<26);    // PCI, LCD_PANNEL_ON

    // Set GPIO direction to output
    g_pGPIOReg->GPFCON = (g_pGPIOReg->GPFCON & ~(0xf<<26)) | (5<<26);    // PCI, LCD_PANNEL_ON

    LDI_MSG((_T("[LDI]--LDI_SMRP_LTE480WV_RGB_port_initialize()\n\r")));
}

static LDI_ERROR LDI_SMRP_LTE480WV_RGB_power_on(void)
{
    LDI_ERROR error = LDI_SUCCESS;

    LDI_MSG((_T("[LDI]++LDI_SMRP_LTE480WV_RGB_power_on()\n\r")));

    // PCI                    : GPF[14]
    // LCD_PANNEL_ON        : GPF[13]

    // Envid Disable
    g_pDispConReg->VIDCON0 &= ~0x3;    //~(ENVID_ENABLE | ENVID_F_ENABLE);    // Direct Off

    // LCD Pannel Power On
    g_pGPIOReg->GPFDAT &= ~(1<<14);    // PCI Low
    g_pGPIOReg->GPFDAT |= (1<<13);        // LCD_PANNEL_ON High
    DelayLoop_1ms(10);                    // tp-sig > 10 ms

    // Envid Enable (Start output through RGB I/F)
    g_pDispConReg->VIDCON0 |= 0x3;        //(ENVID_ENABLE | ENVID_F_ENABLE);
    DelayLoop_1ms(20);                    // tvsync-don > 1 frame (16.7 ms)

    // Set PCI to High
    g_pGPIOReg->GPFDAT |= (0x1<<14);    // PCI

    LDI_MSG((_T("[LDI]--LDI_SMRP_LTE480WV_RGB_power_on() : %d\n\r"), error));

    return error;
}

static LDI_ERROR LDI_SMRP_LTE480WV_RGB_power_off(void)
{
    LDI_ERROR error = LDI_SUCCESS;

    LDI_MSG((_T("[LDI]++LDI_SMRP_LTE480WV_RGB_power_off()\n\r")));

    // PCI                    : GPF[14]
    // LCD_PANNEL_ON        : GPF[13]

    // Set PCI to Low
    g_pGPIOReg->GPFDAT &= ~(0x1<<14);    // PCI
    DelayLoop_1ms(40);                    // twht1 > 2 frame (33.3 ms)
    DelayLoop_1ms(20);                    // tpoff > 1 frame (16.7 ms)

    // Envid Disable
    g_pDispConReg->VIDCON0 &= ~(0x1);    //~(ENVID_F_ENABLE);    // Per Frame Off
    DelayLoop_1ms(20);                    // Wait for frame finished (16.7 ms)
    DelayLoop_1ms(10);                    // tsig0ff-vdd > 10 ms

    // LCD Pannel Power Off
    g_pGPIOReg->GPFDAT &= ~(1<<13);    // LCD_PANNEL_ON High

    LDI_MSG((_T("[LDI]--LDI_SMRP_LTE480WV_RGB_power_off() : %d\n\r"), error));

    return error;
}

static LDI_ERROR LDI_SMRP_LTE480WV_RGB_initialize(void)
{
    LDI_ERROR error = LDI_SUCCESS;

    LDI_MSG((_T("[LDI]++LDI_SMRP_LTE480WV_RGB_initialize()\n\r")));

    // There is No Power Sequence for LTP480WV

    LDI_MSG((_T("[LDI]--LDI_SMRP_LTE480WV_RGB_initialize() : %d\n\r"), error));

    return error;
}



static void LDI_LTS222QV_write(unsigned int address, unsigned int data)
{
    int j;

    //LDI_MSG((_T("[LDI]++LDI_LTS222QV_write(0x%08x, 0x%08x)\n\r"), address, data));

    LCD_CLK_Hi;
    LCD_MOSI_Lo;
    DelayLoop(SPI_DELAY);

    g_pDispConReg->SIFCCON0 = 0x11;    // RS:LO nCS:LO nOE:HI nWE:HI, Manual
    g_pDispConReg->SIFCCON0 = 0x13;    // RS:LO nCS:LO nOE:HI nWE:LO, Manual
    DelayLoop(SPI_DELAY);

    for (j = 7; j >= 0; j--)
    {
        LCD_CLK_Lo;

        if ((address >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCD_MOSI_Hi;
        }
        else
        {
            LCD_MOSI_Lo;
        }

        DelayLoop(SPI_DELAY);

        LCD_CLK_Hi;            // CLOCK = High
        DelayLoop(SPI_DELAY);
    }

    LCD_MOSI_Lo;
    DelayLoop(SPI_DELAY);

    g_pDispConReg->SIFCCON0 = 0x11;    // RS:LO nCS:LO nOE:HI nWE:HI, Manual
    g_pDispConReg->SIFCCON0 = 0x01;    // RS:LO nCS:HI nOE:HI nWE:HI, Manual
    DelayLoop(SPI_DELAY);

    g_pDispConReg->SIFCCON0 = 0x11;    // RS:LO nCS:LO nOE:HI nWE:HI, Manual
    g_pDispConReg->SIFCCON0 = 0x13;    // RS:LO nCS:LO nOE:HI nWE:LO, Manual
    DelayLoop(SPI_DELAY);

    for (j = 7; j >= 0; j--)
    {
        LCD_CLK_Lo;                            //    SCL Low

        if ((data >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCD_MOSI_Hi;
        }
        else
        {
            LCD_MOSI_Lo;
        }

        DelayLoop(SPI_DELAY);

        LCD_CLK_Hi;            // CLOCK = High
        DelayLoop(SPI_DELAY);
    }

    g_pDispConReg->SIFCCON0 = 0x11;    // RS:LO nCS:LO nOE:HI nWE:HI, Manual
    g_pDispConReg->SIFCCON0 = 0x01;    // RS:LO nCS:HI nOE:HI nWE:HI, Manual
    DelayLoop(SPI_DELAY);

    LCD_MOSI_Lo;
    DelayLoop(SPI_DELAY);

    //LDI_MSG((_T("[LDI]--LDI_LTS222QV_write()\n\r")));
}

static void LDI_LTV350QV_write(unsigned int address, unsigned int data)
{
    unsigned char dev_id_code = 0x1D;
    int j;

    //LDI_MSG((_T("[LDI]++LDI_LTV350QV_write(0x%08x, 0x%08x)\n\r"), address, data));

    LCD_nSS_Hi;         //    EN = High                    CS high
    LCD_CLK_Hi;                            //    SCL High
    LCD_MOSI_Hi;                            //    Data Low

    DelayLoop(SPI_DELAY);

    LCD_nSS_Lo;         //    EN = Low                CS Low
    DelayLoop(SPI_DELAY);

    for (j = 5; j >= 0; j--)
    {
        LCD_CLK_Lo;                            //    SCL Low

        if ((dev_id_code >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCD_MOSI_Hi;
        }
        else
        {
            LCD_MOSI_Lo;
        }

        DelayLoop(SPI_DELAY);

        LCD_CLK_Hi;            // CLOCK = High
        DelayLoop(SPI_DELAY);

    }

    // RS = "0" : index data
    LCD_CLK_Lo;            // CLOCK = Low
    LCD_MOSI_Lo;
    DelayLoop(SPI_DELAY);
    LCD_CLK_Hi;            // CLOCK = High
    DelayLoop(SPI_DELAY);

    // Write
    LCD_CLK_Lo;            // CLOCK = Low
    LCD_MOSI_Lo;
    DelayLoop(SPI_DELAY);
    LCD_CLK_Hi;            // CLOCK = High
    DelayLoop(SPI_DELAY);

    for (j = 15; j >= 0; j--)
    {
        LCD_CLK_Lo;                            //    SCL Low

        if ((address >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCD_MOSI_Hi;
        }
        else
        {
            LCD_MOSI_Lo;
        }

        DelayLoop(SPI_DELAY);

        LCD_CLK_Hi;            // CLOCK = High
        DelayLoop(SPI_DELAY);

    }

    LCD_MOSI_Hi;
    DelayLoop(SPI_DELAY);

    LCD_nSS_Hi;                 // EN = High
    DelayLoop(SPI_DELAY*10);

    LCD_nSS_Lo;         //    EN = Low                CS Low
    DelayLoop(SPI_DELAY);

    for (j = 5; j >= 0; j--)
    {
        LCD_CLK_Lo;                            //    SCL Low

        if ((dev_id_code >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCD_MOSI_Hi;
        }
        else
        {
            LCD_MOSI_Lo;
        }

        DelayLoop(SPI_DELAY);

        LCD_CLK_Hi;            // CLOCK = High
        DelayLoop(SPI_DELAY);

    }

    // RS = "1" instruction data
    LCD_CLK_Lo;            // CLOCK = Low
    LCD_MOSI_Hi;
    DelayLoop(SPI_DELAY);
    LCD_CLK_Hi;            // CLOCK = High
    DelayLoop(SPI_DELAY);

    // Write
    LCD_CLK_Lo;            // CLOCK = Low
    LCD_MOSI_Lo;
    DelayLoop(SPI_DELAY);
    LCD_CLK_Hi;            // CLOCK = High
    DelayLoop(SPI_DELAY);

    for (j = 15; j >= 0; j--)
    {
        LCD_CLK_Lo;                            //    SCL Low

        if ((data >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCD_MOSI_Hi;
        }
        else
        {
            LCD_MOSI_Lo;
        }

        DelayLoop(SPI_DELAY);

        LCD_CLK_Hi;            // CLOCK = High
        DelayLoop(SPI_DELAY);

    }

    LCD_nSS_Hi;                 // EN = High
    DelayLoop(SPI_DELAY);

    //LDI_MSG((_T("[LDI]--LDI_LTV350QV_write()\n\r")));
}

static void LDI_LTM030DK_write(unsigned int address, unsigned int data)
{
    int j;

//    LDI_MSG((_T("[LDI]++LDI_LTV350QV_write(0x%08x, 0x%08x)\n\r"), address, data));

    LCDP_nSS_Hi;                         //    EN = High       CS high
    LCDP_CLK_Lo;                         //    SCL Low

    DelayLoop(10);

    LCDP_nSS_Lo;         //    EN = Low                CS Low

    DelayLoop(10);        
    
    for (j = 7; j >= 0; j--)
    {
        LCDP_MOSI_Lo;
        LCDP_CLK_Lo;                            //    SCL Low
        DelayLoop(10);
        LCDP_CLK_Hi;
        DelayLoop(10);
    }

    LCDP_CLK_Lo;            // CLOCK = Low
    DelayLoop(100);
    
    // addr write
    for (j = 7; j >= 0; j--)
    {
        LCDP_CLK_Lo;                            //    SCL Low

        if ((address >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCDP_MOSI_Hi;
        }
        else
        {
            LCDP_MOSI_Lo;
        }

        DelayLoop(10);

        LCDP_CLK_Hi;            // CLOCK = High
        DelayLoop(10);

    }

 //   LCD_nSS_Lo;         //    EN = Low                CS Low
    LCDP_CLK_Lo;
    DelayLoop(100);

    // write operation and data selection
    for (j = 6; j >= 0; j--)
    {
        LCDP_MOSI_Lo;
        LCDP_CLK_Lo;                            //    SCL Low
        DelayLoop(10);
        LCDP_CLK_Hi;            // CLOCK = High
        DelayLoop(10);

    }
    
    // RS = "1" instruction data
    LCDP_MOSI_Hi;    
    LCDP_CLK_Lo;            // CLOCK = Low
    DelayLoop(10);
    LCDP_CLK_Hi;            // CLOCK = High
    DelayLoop(10);

    // Write
    LCDP_CLK_Lo;            // CLOCK = Low
    DelayLoop(100);

    // data write
    for (j = 7; j >= 0; j--)
    {
        LCDP_CLK_Lo;                            //    SCL Low

        if ((data >> j) & 0x0001)    // DATA HIGH or LOW
        {
            LCDP_MOSI_Hi;
        }
        else
        {
            LCDP_MOSI_Lo;
        }

        DelayLoop(100);

        LCDP_CLK_Hi;            // CLOCK = High
        DelayLoop(10);

    }

    LCDP_CLK_Lo;
    DelayLoop(100);
    
    LCDP_nSS_Hi;                 // EN = High
    DelayLoop(10);
    
}

static void DelayLoop_1ms(int msec)
{
    volatile int j;
    for(j = 0; j < LCD_DELAY_1MS*msec; j++)  ;
}

static void DelayLoop(int delay)
{
    volatile int j;
    for(j = 0; j < delay; j++)  ;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?