⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w_driver.c

📁 bu1566dsp芯片用来处理ov7660或其他30万摄像模组的图像预览.图像拍照(jpeg压缩)
💻 C
字号:
#define _W_DRIVER_C_

#include "W_Driver.h"

#if defined _LCD_INDIRECT_WRITE_
static void LcdIndirectWriteData(UINT16 u16Param)
{
    data_write(MLCDCMD1, u16Param);
    data_write(MLCDCNT, 0x0093);
    wait(10);
//    aDSC_GIO_Write(BU15xx_GIO6, HIGH);
//    aDSC_GIO_Write(BU15xx_GIO6, LOW);
}
static void LcdIndirectWriteCmd(UINT16 u16Param)
{
    data_write(MLCDCMD1, u16Param);
    data_write(MLCDCNT, 0x0091);
    wait(10);
//    aDSC_GIO_Write(BU15xx_GIO6, HIGH);
//    aDSC_GIO_Write(BU15xx_GIO6, LOW);
}
#endif                          //#if defined _LCD_INDIRECT_WRITE_

void BU15xx_GIO_Write(UINT8 u8GioIndex, UINT8 u8Bit)
{
    bit_write(GIOCNT, 0x1<<u8GioIndex, LOW); 
    bit_write(GIOOUT, 0x1<<u8GioIndex, u8Bit);   
}
void sensor_init(void)
{
    UINT16 i, u16NumSequence = 0;
    UINT16 u16HalfDeviceID;

    bit_write(CLKCNT, bLCDFREN | bSCKEN, LOW);
    clk_div1_set(0x000f);
    bit_write(CLKCNT, bLCDFREN | bSCKEN, HIGH);

    u16NumSequence = sizeof(tSensor) / sizeof(t_SensorParam);

#if defined CSV1061_SENSOR
    u16HalfDeviceID = 0x11;
    cam_if_set(0x0602);
    aDSC_GIO_Write(BU15xx_GIO2, HIGH);
    wait(5);

#elif defined OV7648_SENSOR
    u16HalfDeviceID = 0x21;
    cam_if_set(0x0602);

#elif defined OV7660_SENSOR
    u16HalfDeviceID = 0x21;
    cam_if_set(0x0200);
    bit_write(GIOOUT,0x0004,LOW); wait(5);
    bit_write(GIOOUT,0x0004,HIGH); wait(5);
    bit_write(GIOOUT,0x0004,LOW); wait(5);
//    BU15xx_I2C_Dummy_Set(u16HalfDeviceID<<1,0x12,0x00);   

#elif defined MT9V111_SENSOR
    u16HalfDeviceID = 0x5c;
    cam_if_set(0x0602);
//    data_write(GIOOUT, 0x007b);  //standy off
    wait(100);                  //wait sensor reset

#elif defined CSV1411_SENSOR
    u16HalfDeviceID = 0x6e;
    cam_if_set(0x0602);

    aDSC_GIO_Write(BU15xx_GIO2, HIGH);
    wait(5);
    aDSC_GIO_Write(BU15xx_GIO2, LOW);
    wait(5);
    aDSC_GIO_Write(BU15xx_GIO2, HIGH);
    wait(5);

#elif defined S5K53BEA_SENSOR
    u16HalfDeviceID = 0x2D;
    cam_if_set(0x0600);
    aDSC_GIO_Write(BU15xx_GIO0, HIGH); //reset
    wait(5);
    aDSC_GIO_Write(BU15xx_GIO0, LOW);
    wait(5);
    aDSC_GIO_Write(BU15xx_GIO0, HIGH);
    wait(5);
    aDSC_GIO_Write(BU15xx_GIO3, HIGH); //standby off
    wait(5);

#endif

    for (i = 0; i < u16NumSequence; i++)
    {
        aDSC_i2c_set(sDEV_7BIT, u16HalfDeviceID, tSensor[i].u8RegAddr,
                     tSensor[i].u8RegData, 0x0f, sSERI_WRITE);

        wait(tSensor[i].u16WaitTime);
    }

    bit_write(CLKCNT, bLCDFREN | bSCKEN, LOW);
    clk_div1_set(0x0000);
    bit_write(CLKCNT, bLCDFREN | bSCKEN, HIGH);
}

void mainlcd_init(void)
{
    UINT16 i;
    UINT16 u16NumSequence = sizeof(tLcd) / sizeof(t_LcdInitParam);

    hostcnt_write(sDIRECT_ACS | sDIRECT_ENABLE | HOST_TYPE);
    aDSC_lcdaccess_set(sMAIN_ACS);

#if defined _LCD_INDIRECT_WRITE_
    {
        UINT16 u16RegBack1, u16RegBack2, u16RegBack3;

        u16RegBack1 = data_read(HWMODE);
        u16RegBack2 = data_read(MLCDCNT);
        u16RegBack3 = data_read(MLCDCMD1);

	 hostcnt_write(sBU15XX_ACS | sDIRECT_DISABLE | HOST_TYPE);
        mode_change(sREADY);
        mode_change(sLCDMANUAL);

        for (i = 0; i < u16NumSequence; i++)
        {
            if (tLcd[i].u16DataType == CMD)
                LcdIndirectWriteCmd(tLcd[i].u16Data);
            else if (tLcd[i].u16DataType == PDAT)
                LcdIndirectWriteData(tLcd[i].u16Data);
            wait(tLcd[i].u16WaitTime);
        }

        column_page_set(0, M_LCD_WSIZE - 1, 0, M_LCD_HSIZE - 1);
        LcdIndirectWriteCmd(M_CMD_DATA1);
        data_write(MLCDCMD1, 0xe07f);

        clk_cnt_set(sGIO6_ENABLE | sVDEDG_UP | sVD | sLCDFR_ENABLE | sSCK_ENABLE | sCMCK_ENABLE);       //LCDFR,SCLK,CAMCKO Enable
        aDSC_GIO_Write(BU15xx_GIO6, LOW);
        for (i = 0; i < M_LCD_WSIZE * M_LCD_HSIZE; i++)
        {
            //LcdIndirectWriteData(0xe07f);
            data_write(MLCDCNT, 0x0093);
            bit_write(GIOOUT, 0x1 << BU15xx_GIO6, HIGH);
            bit_write(GIOOUT, 0x1 << BU15xx_GIO6, LOW);
        }

        mode_change(sREADY);
        data_write(HWMODE, u16RegBack1);
        data_write(MLCDCNT, u16RegBack2);
        data_write(MLCDCMD1, u16RegBack3);
    }
#else                           //defined _LCD_INDIRECT_WRITE_

#if defined LCDBUS_9BIT

    for (i = 0; i < u16NumSequence; i++)
    {
        reg_write(tLcd[i].u16DataType, (tLcd[i].u16Data&0xFE00)>>9);
        reg_write(tLcd[i].u16DataType, tLcd[i].u16Data&0x01FF);
        wait(tLcd[i].u16WaitTime);
    }

    reg_write(CMD, (0x21&0xFE00)>>9);
    reg_write(CMD, 0x21&0x01FF);
    reg_write(PDAT, 0x0);
    reg_write(PDAT, 0x0);
    reg_write(CMD, (0x16&0xFE00)>>9);
    reg_write(CMD, 0x16&0x01FF);
    reg_write(PDAT, (((M_LCD_WSIZE - 1) << 8)&0xFE00)>>9);
    reg_write(PDAT, ((M_LCD_WSIZE - 1) << 8)&0x01FF);
    reg_write(CMD, (0x17&0xFE00)>>9);
    reg_write(CMD, 0x17&0x01FF);
    reg_write(PDAT, (((M_LCD_HSIZE - 1) << 8)&0xFE00)>>9);
    reg_write(PDAT, ((M_LCD_HSIZE - 1) << 8)&0x01FF);

    reg_write(CMD, (0x0022&0xFE00)>>9);
    reg_write(CMD, 0x0022&0x01FF);

    for (i = 0; i < M_LCD_WSIZE * M_LCD_HSIZE/2; i++)
    {
        reg_write(PDAT, (0xf000&0xFE00)>>9);
        reg_write(PDAT, 0xf000&0x01FF);
    }
    for (i = 0; i < M_LCD_WSIZE * M_LCD_HSIZE/2; i++)
    {
        reg_write(PDAT, (0x00f&0xFE00)>>9);
        reg_write(PDAT, 0x00f&0x01FF);
    }
    
#else  //defined LCDBUS_9BIT

    for (i = 0; i < u16NumSequence; i++)
    {
        reg_write(tLcd[i].u16DataType, tLcd[i].u16Data);
        wait(tLcd[i].u16WaitTime);
    }

   column_page_set(0, M_LCD_WSIZE - 1, 0, M_LCD_HSIZE - 1);
    reg_write(CMD, M_CMD_DATA1);        //Display RAM write command
    for (i = 0; i < M_LCD_WSIZE * M_LCD_HSIZE/2; i++)
    {
        reg_write(PDAT, 0xf000);
    }
    for (i = 0; i < M_LCD_WSIZE * M_LCD_HSIZE/2; i++)
    {
        reg_write(PDAT, 0x00f);
    }
    
#endif //defined LCDBUS_9BIT

#endif                          //defined _LCD_INDIRECT_WRITE_

}

void sublcd_init(void)
{
    UINT16 i;
    UINT16 u16NumSequence = sizeof(tLcd) / sizeof(t_LcdInitParam);

    aDSC_lcdaccess_set(sSUB_ACS);

#if defined _LCD_INDIRECT_WRITE_
    {
        UINT16 u16RegBack1, u16RegBack2, u16RegBack3;

        u16RegBack1 = data_read(HWMODE);
        u16RegBack2 = data_read(MLCDCNT);
        u16RegBack3 = data_read(MLCDCMD1);

	 hostcnt_write(sBU15XX_ACS | sDIRECT_DISABLE | HOST_TYPE);
        mode_change(sREADY);
        mode_change(sLCDMANUAL);

        for (i = 0; i < u16NumSequence; i++)
        {
            if (tLcd[i].u16DataType == CMD)
                LcdIndirectWriteCmd(tLcd[i].u16Data);
            else if (tLcd[i].u16DataType == PDAT)
                LcdIndirectWriteData(tLcd[i].u16Data);
            wait(tLcd[i].u16WaitTime);
        }

        column_page_set(0, S_LCD_WSIZE - 1, 0, S_LCD_HSIZE - 1);
        LcdIndirectWriteCmd(S_CMD_DATA1);
        data_write(MLCDCMD1, 0xe07f);

        clk_cnt_set(sGIO6_ENABLE | sVDEDG_UP | sVD | sLCDFR_ENABLE | sSCK_ENABLE | sCMCK_ENABLE);       //LCDFR,SCLK,CAMCKO Enable
        aDSC_GIO_Write(BU15xx_GIO6, LOW);
        for (i = 0; i < S_LCD_WSIZE * S_LCD_HSIZE; i++)
        {
            //LcdIndirectWriteData(0xe07f);
            data_write(MLCDCNT, 0x0093);
            bit_write(GIOOUT, 0x1 << BU15xx_GIO6, HIGH);
            bit_write(GIOOUT, 0x1 << BU15xx_GIO6, LOW);
        }

        mode_change(sREADY);
        data_write(HWMODE, u16RegBack1);
        data_write(MLCDCNT, u16RegBack2);
        data_write(MLCDCMD1, u16RegBack3);
    }
#else                           //defined _LCD_INDIRECT_WRITE_

    for (i = 0; i < u16NumSequence; i++)
    {
        reg_write(tLcd[i].u16DataType, tLcd[i].u16Data);
        wait(tLcd[i].u16WaitTime);
    }

    column_page_set(0, S_LCD_WSIZE - 1, 0, S_LCD_HSIZE - 1);
    reg_write(CMD, S_CMD_DATA1);        //Display RAM write command
    for (i = 0; i < S_LCD_WSIZE * S_LCD_HSIZE; i++)
    {
        reg_write(PDAT, 0x0000);
    }

#endif                          //defined _LCD_INDIRECT_WRITE_

}

void MainLcdAreaPosSet(UINT16 u16HoriStart, UINT16 u16HoriEnd,
                       UINT16 u16VertStart, UINT16 u16VertEnd)
{
#if defined _LCD_INDIRECT_WRITE_
    UINT16 u16RegBack1, u16RegBack2, u16RegBack3;
    u16RegBack1 = data_read(HWMODE);
    u16RegBack2 = data_read(MLCDCNT);
    u16RegBack3 = data_read(MLCDCMD1);
    hostcnt_write(sBU15XX_ACS | sDIRECT_DISABLE | HOST_TYPE);
    mode_change(sREADY);
    mode_change(sLCDMANUAL);

#if (defined TMD_LTM022A05D) || (defined TMD_LTM018A02A)
    LcdIndirectWriteCmd(0x0200 | u16HoriStart);
    LcdIndirectWriteCmd(0x0300 | u16VertStart);
    LcdIndirectWriteCmd(0x0400 | u16HoriEnd);
    LcdIndirectWriteCmd(0x0500 | u16VertEnd);
#elif defined NEC_502i
    LcdIndirectWriteCmd(0x21);
    LcdIndirectWriteData((u16VertStart << 8) | (u16HoriStart + MLCD_START_H));
    LcdIndirectWriteCmd(0x34);
    LcdIndirectWriteData(((u16HoriEnd + MLCD_START_H) << 8) | (u16HoriStart + MLCD_START_H));
    LcdIndirectWriteCmd(0x35);
    LcdIndirectWriteData((u16VertEnd << 8) | u16VertStart);
#elif defined HD66777_LCD
    LcdIndirectWriteCmd(0x0050);
    LcdIndirectWriteData(u16HoriStart);
    LcdIndirectWriteCmd(0x0051);
    LcdIndirectWriteData(u16HoriEnd);
    LcdIndirectWriteCmd(0x0052);
    LcdIndirectWriteData(u16VertStart);
    LcdIndirectWriteCmd(0x0053);
    LcdIndirectWriteData(u16VertEnd);

    LcdIndirectWriteCmd(0x0020);
    LcdIndirectWriteData(u16HoriEnd);
    LcdIndirectWriteCmd(0x0021);
    LcdIndirectWriteData(u16VertStart);
#elif defined HD66773_LCD

#elif (defined S6B33B3A) || (defined S6B33B2)

#endif                          //select LCD

    mode_change(sREADY);
    data_write(HWMODE, u16RegBack1);
    data_write(MLCDCNT, u16RegBack2);
    data_write(MLCDCMD1, u16RegBack3);

#else                           //defined _LCD_INDIRECT_WRITE_

#if (defined TMD_LTM022A05D) || (defined TMD_LTM018A02A)
    reg_write(CMD, 0x0200 | u16HoriStart);
    reg_write(CMD, 0x0300 | u16VertStart);
    reg_write(CMD, 0x0400 | u16HoriEnd);
    reg_write(CMD, 0x0500 | u16VertEnd);
#elif defined NEC_502i
    reg_write(CMD, 0x21);
    reg_write(PDAT, (u16VertStart << 8) | (u16HoriStart + MLCD_START_H));
    reg_write(CMD, 0x34);
    reg_write(PDAT, ((u16HoriEnd + MLCD_START_H) << 8) | (u16HoriStart + MLCD_START_H));
    reg_write(CMD, 0x35);
    reg_write(PDAT, (u16VertEnd << 8) | u16VertStart);
#elif defined HD66777_LCD
    reg_write(CMD, 0x0050);
    reg_write(PDAT, u16HoriStart);
    reg_write(CMD, 0x0051);
    reg_write(PDAT, u16HoriEnd);
    reg_write(CMD, 0x0052);
    reg_write(PDAT, u16VertStart);
    reg_write(CMD, 0x0053);
    reg_write(PDAT, u16VertEnd);

    reg_write(CMD, 0x0020);
    reg_write(PDAT, u16HoriEnd);
    reg_write(CMD, 0x0021);
    reg_write(PDAT, u16VertStart);
#elif defined HD66773_LCD
    reg_write(CMD, 0x21);
    reg_write(PDAT, (u16VertStart << 8) | (u16HoriStart + MLCD_START_H));
    reg_write(CMD, 0x16);
    reg_write(PDAT, ((u16HoriEnd + MLCD_START_H) << 8) | (u16HoriStart + MLCD_START_H));
    reg_write(CMD, 0x17);
    reg_write(PDAT, (u16VertEnd << 8) | u16VertStart);
#elif (defined S6B33B3A) || (defined S6B33B2)
    reg_write(CMD, 0x43);
    reg_write(CMD, u16HoriStart+MLCD_START_H);
    reg_write(CMD, u16HoriEnd+MLCD_START_H);
    reg_write(CMD, 0x42);
    reg_write(CMD, u16VertStart+MLCD_START_V);
    reg_write(CMD, u16VertEnd+MLCD_START_V);
#endif                          //select LCD

#endif                          //defined _LCD_INDIRECT_WRITE_

}

void SubLcdAreaPosSet(UINT16 u16HoriStart, UINT16 u16HoriEnd,
                      UINT16 u16VertStart, UINT16 u16VertEnd)
{
#if (defined TMD_LTM022A05D) || (defined TMD_LTM018A02A)
    reg_write(CMD, 0x0200 | u16HoriStart);
    reg_write(CMD, 0x0300 | u16VertStart);
    reg_write(CMD, 0x0400 | u16HoriEnd);
    reg_write(CMD, 0x0500 | u16VertEnd);
#elif defined NEC_502i
    reg_write(CMD, 0x21);
    reg_write(PDAT, (u16VertStart << 8) | (u16HoriStart + MLCD_START_H));
    reg_write(CMD, 0x34);       // ***** SD_CSET ***** 
    reg_write(PDAT, ((u16HoriEnd + MLCD_START_H) << 8) | (u16HoriStart + MLCD_START_H));
    reg_write(CMD, 0x35);       // ***** SD_PSET ***** 
    reg_write(PDAT, (u16VertEnd << 8) | u16VertStart);  // P1L
#elif defined HD66777_LCD
    reg_write(CMD, 0x0050);
    reg_write(PDAT, u16HoriStart);
    reg_write(CMD, 0x0051);
    reg_write(PDAT, u16HoriEnd);
    reg_write(CMD, 0x0052);
    reg_write(PDAT, u16VertStart);
    reg_write(CMD, 0x0053);
    reg_write(PDAT, u16VertEnd);

    reg_write(CMD, 0x0020);
    reg_write(PDAT, u16HoriEnd);
    reg_write(CMD, 0x0021);
    reg_write(PDAT, u16VertStart);
#elif defined HD66773_LCD
#elif (defined S6B33B3A) || (defined S6B33B2)
#endif                          //select LCD
}

#undef _W_DRIVER_C_

⌨️ 快捷键说明

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