Exemple #1
0
static void TPM_SetMode(uint32_t instance, uint8_t chl, TPM_Mode_Type mode)
{
    TPM_InstanceTable[instance]->SC &= ~TPM_SC_CMOD_MASK;
    TPM_InstanceTable[instance]->SC |=  TPM_SC_CMOD(0);
    switch(mode)
    {
        /* FSL: CnSC must be written all bit at one time */
        case kTPM_Mode_EdgeAligned:
            TPM_InstanceTable[instance]->SC &= ~TPM_SC_CPWMS_MASK;
            TPM_InstanceTable[instance]->CONTROLS[chl].CnSC |= TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK;
            TPM_InstanceTable[instance]->CONTROLS[chl].CnSC &= ~TPM_CnSC_MSA_MASK;
            LIB_TRACE("chl:%d\r\n", chl);
            LIB_TRACE("Cnsc:0x%X\r\n", TPM_InstanceTable[instance]->CONTROLS[chl].CnSC);
            break;
        case kTPM_Mode_CenterAligned:
            TPM_InstanceTable[instance]->SC |= TPM_SC_CPWMS_MASK;
            TPM_InstanceTable[instance]->CONTROLS[chl].CnSC |= TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK;
            TPM_InstanceTable[instance]->CONTROLS[chl].CnSC &= ~TPM_CnSC_MSA_MASK;
        case kFTM_Mode_InputCapture:
            TPM_InstanceTable[instance]->SC &= ~TPM_SC_CPWMS_MASK;
            TPM_InstanceTable[instance]->CONTROLS[chl].CnSC &= ~TPM_CnSC_MSB_MASK;
            TPM_InstanceTable[instance]->CONTROLS[chl].CnSC &= ~TPM_CnSC_MSA_MASK;  
            break;
        default:
            break;
    }        
    TPM_InstanceTable[instance]->SC &= ~TPM_SC_CMOD_MASK;
    TPM_InstanceTable[instance]->SC |=  TPM_SC_CMOD(1);
}
Exemple #2
0
/**
 * @brief  设置PDB转换频率
 * @retval None
 */
static void _PDB_SetCounterPeriod(uint32_t srcClock, uint32_t timeInUs)
{
    static const uint8_t MULT[4] = {1, 10, 20, 40};
    uint32_t clkDiv,mult;
    uint32_t i,j;
    for(i=0;i<8;i++)
    {
        for(j=0;j<4;j++)
        {
            if((srcClock/1000000)*timeInUs/((1<<i)*MULT[j]) < 0xFFFF)
            {
                clkDiv = i;
                mult = j;
                break;
            }
        }
    }
    
    LIB_TRACE("clkDiv:%d Mult:%d\r\n",clkDiv, mult);
    
    /* clk div */
    PDB0->SC &= ~PDB_SC_PRESCALER_MASK;
    PDB0->SC |= PDB_SC_PRESCALER(clkDiv);
    
    /* muti */
    PDB0->SC &= ~PDB_SC_MULT_MASK;
    PDB0->SC |= PDB_SC_MULT(mult);
    
    LIB_TRACE("MOD:%d\r\n", (srcClock/1000000)*timeInUs/((1<<clkDiv)*MULT[mult]));
    PDB0->MOD = (srcClock/1000000)*timeInUs/((1<<clkDiv)*MULT[mult]);
    PDB0->IDLY = (srcClock/1000000)*timeInUs/((1<<clkDiv)*MULT[mult]);
}
Exemple #3
0
uint8_t FLASH_WriteSector(uint32_t addr, const uint8_t *buf, uint32_t len)
{
    uint16_t step, ret, i;
	union
	{
		uint32_t  word;
		uint8_t   byte[4];
	} dest;
	dest.word = (uint32_t)addr;

	FTF->FCCOB0 = PROGRAM_CMD;
    
    switch(PROGRAM_CMD)
    {
        case PGM4:
            step = 4;
            break;
        case PGM8:
            step = 8;
            break;
        default:
            LIB_TRACE("FLASH: no program cmd found!\r\n");
            step = 4;
            break;
    }
    
	for(i=0; i<len; i+=step)
	{
        /* set address */
		FTF->FCCOB1 = dest.byte[2];
		FTF->FCCOB2 = dest.byte[1];
		FTF->FCCOB3 = dest.byte[0];

		FTF->FCCOB4 = buf[3];
		FTF->FCCOB5 = buf[2];
		FTF->FCCOB6 = buf[1];
		FTF->FCCOB7 = buf[0];
        
        if(step == 8)
        {
            FTF->FCCOB8 = buf[7];
            FTF->FCCOB9 = buf[6];
            FTF->FCCOBA = buf[5];
            FTF->FCCOBB = buf[4];
        }

		dest.word += step; buf += step;

        __disable_irq();
        ret = _cmd_lunch();
        __enable_irq();
        
		if(FLASH_OK != ret) 
        {
            return FLASH_ERROR;
        }
    }
    return FLASH_OK;
}
Exemple #4
0
uint8_t I2C_Init(uint32_t MAP, uint32_t baudrate)
{
    uint8_t i;
    map_t * pq = (map_t*)&(MAP);
    
    /* open drain and pull up */
    for(i = 0; i < pq->pin_count; i++)
    {
        GPIO_Init(pq->io, pq->pin_start + i, kGPIO_Mode_OPP);
        GPIO_Init(pq->io, pq->pin_start + i, kGPIO_Mode_OPP);
        GPIO_PinWrite(pq->io, pq->pin_start + i, 1);
        SetPinPull(pq->io, pq->pin_start + i, 1);
    }

    /* i2c_gpio struct setup */
    i2c.instace = pq->io;
    
    switch(MAP)
    {
        case I2C1_SCL_PE01_SDA_PE00:
            i2c.scl = 1;i2c.sda = 0;
            break;
        case I2C0_SCL_PE19_SDA_PE18:
            i2c.scl = 19;i2c.sda = 18;
            break;
        case I2C0_SCL_PF22_SDA_PF23:
            i2c.scl = 22;i2c.sda = 23;
            break;
        case I2C0_SCL_PB00_SDA_PB01:
            i2c.scl = 0;i2c.sda = 1;
            break;
        case I2C0_SCL_PB02_SDA_PB03:
            i2c.scl = 2;i2c.sda = 3;
            break;
        case I2C1_SCL_PC10_SDA_PC11:
            i2c.scl = 10;i2c.sda = 11;
            break;
        case I2C0_SCL_PD08_SDA_PD09:
            i2c.scl = 8;i2c.sda = 9;
            break;
        case I2C0_SCL_PE24_SDA_PE25:
            i2c.scl = 24;i2c.sda = 25;
            break;
        case I2C1_SCL_PC01_SDA_PC02:
            i2c.scl = 1;i2c.sda = 2;
            break;
        default:
            LIB_TRACE("no PINMAP found\r\n");
            break;
    }
    return pq->ip;
}
Exemple #5
0
/**
 * @brief  设置RTC的时间
 * @param  datetime  :时间戳结构
 * @retval None
 */
void RTC_SetDateTime(RTC_DateTime_Type * datetime)
{
    uint32_t i;
    if(!datetime)
    {
        return;
    }
    RTC_DateTimeToSecond(datetime, &i);
    LIB_TRACE("Reconfig:%d  %s\r\n", i, __func__);
    RTC->SR &= ~RTC_SR_TCE_MASK;
    RTC->TSR = RTC_TSR_TSR(i);
    RTC->SR |= RTC_SR_TCE_MASK;
}
Exemple #6
0
/**
 * \brief i2c bus scan test
 * @param[in] MAP  I2C引脚配置缩略图,详见i2c.h
 * \retval None
 */
void I2C_Scan(uint32_t MAP)
{
    uint8_t i;
    uint8_t ret;
    uint32_t instance;
    instance = I2C_QuickInit(MAP, 100*1000);
    for(i = 1; i < 127; i++)
    {
        ret = I2C_Probe(instance , i);
        if(!ret)
        {
            LIB_TRACE("ADDR:0x%2X(7BIT) | 0x%2X(8BIT) found!\r\n", i, i<<1);
        }
    }
}
Exemple #7
0
uint32_t FLASH_Test(uint32_t startAddr, uint32_t size)
{
    int addr, i,err;
    
    uint8_t *p;
    uint8_t buf[SECTOR_SIZE];
    
    FLASH_Init();
    
    for(i=0;i<SECTOR_SIZE;i++)
    {
        buf[i] = i % 0xFF;
    }
    
    for (addr = startAddr; addr<size; addr+=SECTOR_SIZE)
    {
        LIB_TRACE("program addr:0x%X ...", addr);
        err = FLASH_EraseSector(addr);
        err += FLASH_WriteSector(addr, buf, SECTOR_SIZE);
        if(err)
        {
            LIB_TRACE("issue command failed\r\n");
            return 1;
        }
        p = (uint8_t*)addr;
        LIB_TRACE("varify addr:0x%X ...", addr);
        for(i=0;i<SECTOR_SIZE;i++)
        {
            if(*p++ != (i%0xFF))
            {
                err++;
                LIB_TRACE("ERR:[%d]:0x%02X ", i, *p);
            }
        }
        if(!err)
            LIB_TRACE("OK\r\n");
        else
            LIB_TRACE("ERR\r\n");
    }
    return err;
}
Exemple #8
0
void assert_failed(char * file, uint32_t line)
{
    LIB_TRACE("assert failed @ %s in %d\r\n", file, line);
	//����ʧ�ܼ��
	while(1);
}
Exemple #9
0
/**
 * \brief 	dspi_hal_set_baud,Internal function
 * \details Set the DSPI baud rate in bits per second.
 * 					This function will take in the desired bitsPerSec (baud rate) and will calculate the nearest
 * 					possible baud rate without exceeding the desired baud rate, and will return the calculated
 * 					baud rate in bits-per-second. It requires that the caller also provide the frequency of the
 * 					module source clock (in Hz).
 */
static uint32_t dspi_hal_set_baud(uint32_t instance, uint8_t whichCtar, uint32_t bitsPerSec, uint32_t sourceClockInHz)                    
{
    uint32_t prescaler, bestPrescaler;
    uint32_t scaler, bestScaler;
    uint32_t dbr, bestDbr;
    uint32_t realBaudrate, bestBaudrate;
    uint32_t diff, min_diff;
    uint32_t baudrate = bitsPerSec;
    /* for master mode configuration, if slave mode detected, return 0*/
    if(!(SPI_InstanceTable[instance]->MCR & SPI_MCR_MSTR_MASK))
    {
        return 0;
    }
    /* find combination of prescaler and scaler resulting in baudrate closest to the */
    /* requested value */
    min_diff = 0xFFFFFFFFU;
    bestPrescaler = 0;
    bestScaler = 0;
    bestDbr = 1;
    bestBaudrate = 0; /* required to avoid compilation warning */

    /* In all for loops, if min_diff = 0, the exit for loop*/
    for (prescaler = 0; (prescaler < 4) && min_diff; prescaler++)
    {
        for (scaler = 0; (scaler < 16) && min_diff; scaler++)
        {
            for (dbr = 1; (dbr < 3) && min_diff; dbr++)
            {
                realBaudrate = ((sourceClockInHz * dbr) /
                                (s_baudratePrescaler[prescaler] * (s_baudrateScaler[scaler])));

                /* calculate the baud rate difference based on the conditional statement*/
                /* that states that the calculated baud rate must not exceed the desired baud rate*/
                if (baudrate >= realBaudrate)
                {
                    diff = baudrate-realBaudrate;
                    if (min_diff > diff)
                    {
                        /* a better match found */
                        min_diff = diff;
                        bestPrescaler = prescaler;
                        bestScaler = scaler;
                        bestBaudrate = realBaudrate;
                        bestDbr = dbr;
                    }
                }
            }
        }
    }

    uint32_t temp;
    /* write the best dbr, prescalar, and baud rate scalar to the CTAR*/
    temp = SPI_InstanceTable[instance]->CTAR[whichCtar];
    temp &= ~(SPI_CTAR_DBR_MASK| SPI_CTAR_PBR_MASK | SPI_CTAR_BR_MASK);
    if((bestDbr-1))
    {
        temp |= SPI_CTAR_DBR_MASK|SPI_CTAR_PBR(bestPrescaler)|SPI_CTAR_BR(bestScaler);
    }
    else
    {
        temp |= SPI_CTAR_PBR(bestPrescaler)|SPI_CTAR_BR(bestScaler);
    }
    SPI_InstanceTable[instance]->CTAR[whichCtar] = temp;
    /* return the actual calculated baud rate*/
    LIB_TRACE("bestBaudrate:%d\r\n", bestBaudrate);
    return bestBaudrate;
}
Exemple #10
0
/**
 * @brief  初始化PWM波产生
 * @code
 *      
 *  //TPM0_CH0_PE24 使用FTM0模块通道0 引脚E24上产生1KHz PWM波
 *   FTM_PWM_QuickInit(TPM0_CH0_PE24, 1000); 
 * @endcode         
 * @param  MAP            : 快速初始化通道
 * @param  frequencyInHZ  : 频率
 * @retval None
 */
uint8_t TPM_PWM_QuickInit(uint32_t MAP, TPM_PWM_Mode_Type mode, uint32_t req)
{
    uint8_t i;
    uint32_t modulo;
    uint32_t clock;
    int32_t pres;
    uint8_t ps = 0;
    QuickInit_Type * pq = (QuickInit_Type*)&(MAP); 
    /* init pinmux */
    for(i = 0; i < pq->io_offset; i++)
    {
        PORT_PinMuxConfig(pq->io_instance, pq->io_base + i, (PORT_PinMux_Type) pq->mux); 
    }
    /* calc req and ps */
    uint32_t min_val = 0xFFFF;
    /* cal ps */
    CLOCK_GetClockFrequency(kMCGOutClock, &clock);
//    if(MCG->C6 & MCG_C6_PLLS_MASK) /* PLL */
//    {
//        clock /= 2;
//    }
//    else /* FLL */
//    {
//        
//    }
    LIB_TRACE("%s %d\r\n", __func__, clock);
    pres = (clock/req)/TPM_MOD_MOD_MASK;
    if((clock/req)/pres > TPM_MOD_MOD_MASK)
    {
        pres++;
    }
    for(i = 0; i < 7; i++)
    {
        if((ABS(pres - (1<<i))) < min_val)
        {
            ps = i;
            min_val = ABS(pres - (1<<i));
        }
    }
    if(pres > (1<<ps)) ps++;
    if(ps > 7) ps = 7;
    modulo = ((clock/(1<<ps))/req) - 1;
    LIB_TRACE("input frequency:%dHz\r\n", req);
    LIB_TRACE("input clk:%d\r\n", clock);
    LIB_TRACE("ps:%d\r\n", pres);
    LIB_TRACE("modulo:%d\r\n", modulo);
    LIB_TRACE("ip_instance:%d\r\n", pq->ip_instance);
    LIB_TRACE("io_instance:%d\r\n", pq->io_instance);
    LIB_TRACE("io_base:%d\r\n", pq->io_base);
    LIB_TRACE("io_offset:%d\r\n", pq->io_offset);
    LIB_TRACE("chl:%d\r\n", pq->channel);
    _TPM_InitBasic(pq->ip_instance, modulo, (TPM_ClockDiv_Type)ps);
    /* set FTM mode */
    switch(mode)
    {
        case kPWM_EdgeAligned:
            TPM_SetMode(pq->ip_instance, pq->channel, kTPM_Mode_EdgeAligned);
            break;
        default:
            LIB_TRACE("error in FTM_PWM_Init\r\n");
            break;
    }
    /* set duty to 50% */
    TPM_PWM_ChangeDuty(pq->ip_instance, pq->channel, 5000);
    return pq->ip_instance;
}
Exemple #11
0
int ili9320_init(void)
{
    int ret;
    ret = 1;
    uint32_t gpio_instance;
    /* ??flexbus???? ?????? ?????????? */
    /* Flexbus Init */
    SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK);
    /*control signals */
    PORTB->PCR[19] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_OE
    PORTD->PCR[1]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // CS0
    PORTA->PCR[26] = PORT_PCR_MUX(6)|PORT_PCR_DSE_MASK;          // A27
    PORTC->PCR[16] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_BE_23_16

    /*
    PORTB->PCR[18] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD15
    PORTC->PCR[0]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD14
    PORTC->PCR[1]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD13
    PORTC->PCR[2]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD12
    PORTC->PCR[4]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD11
    PORTC->PCR[5]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD10
    PORTC->PCR[6]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD9
    PORTC->PCR[7]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD8
    PORTC->PCR[8]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD7
    PORTC->PCR[9]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD6
    PORTC->PCR[10] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD5
    PORTD->PCR[2]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD4
    PORTD->PCR[3]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD3
    PORTD->PCR[4]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD2
    PORTD->PCR[5]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD1
    PORTD->PCR[6]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD0
    */

    PORTB->PCR[17]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD16
    PORTB->PCR[16]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD17
    PORTB->PCR[11]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD18
    PORTB->PCR[10]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD19
    PORTB->PCR[9]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD20
    PORTB->PCR[8]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD21
    PORTB->PCR[7]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD22
    PORTB->PCR[6]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD23
    PORTC->PCR[15]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD24
    PORTC->PCR[14]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD25
    PORTC->PCR[13]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD26
    PORTC->PCR[12]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD27
    PORTB->PCR[23]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD28
    PORTB->PCR[22]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD29
    PORTB->PCR[21]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD30
    PORTB->PCR[20]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;           //  FB_AD31

    FLEXBUS_InitTypeDef FLEXBUS_InitStruct;
    FLEXBUS_InitStruct.ADSpaceMask = 0x800;
    FLEXBUS_InitStruct.autoAckMode = kFLEXBUS_AutoAckEnable;
    FLEXBUS_InitStruct.CSn = kFLEXBUS_CS0;
    FLEXBUS_InitStruct.dataAlignMode = kFLEXBUS_DataLeftAligned;
    FLEXBUS_InitStruct.dataWidth = kFLEXBUS_PortSize_16Bit;
    FLEXBUS_InitStruct.baseAddress = ILI9320_BASE;
    FLEXBUS_InitStruct.ByteEnableMode = kFLEXBUS_BE_AssertedWrite;
    FLEXBUS_InitStruct.div = 1;
    FLEXBUS_Init(&FLEXBUS_InitStruct);

    FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group3, kFLEXBUS_CSPMCR_GROUP3_BE_23_16);

    /* advanced config */
    FLEXBUS_AdvancedConfigTypeDef config;
    config.kFLEXBUS_brustWriteEnable = false;
    config.kFLEXBUS_brustReadEnable = false;
    config.kFLEXBUS_EXTS = true;
    config.kFLEXBUS_ASET = 2;
    config.kFLEXBUS_RDAH = 2;
    config.kFLEXBUS_WRAH = 2;
    config.kFLEXBUS_WS = 6;
    FLEXBUS_AdvancedConfig(FLEXBUS_InitStruct.CSn, &config);

    /* Back light */
    gpio_instance = GPIO_QuickInit(HW_GPIOC, 3, kGPIO_Mode_OPP);
    GPIO_WriteBit(gpio_instance, 3, 1);
    /* reset */
    gpio_instance = GPIO_QuickInit(HW_GPIOC, 19, kGPIO_Mode_OPP);
    GPIO_WriteBit(gpio_instance, 19, 0);
    DelayMs(5);
    GPIO_WriteBit(gpio_instance, 19, 1);
    DelayMs(5);

    lcd_dev.id = ili9320_get_id();
    switch(lcd_dev.id)
    {
    case 0x9341:
        lcd_dev.cmd_setx = 0x2A;
        lcd_dev.cmd_sety = 0x2B;
        lcd_dev.cmd_gram = 0x2C;

        WR_CMD(PWCTLB);
        WR_DATA(0x00);
        WR_DATA(0x81);
        WR_DATA(0x30);
        WR_CMD(PWONSCTL);
        WR_DATA(0x64);
        WR_DATA(0x03);
        WR_DATA(0x12);
        WR_DATA(0x81);
        WR_CMD(DTIMCTLA);
        WR_DATA(0x85);
        WR_DATA(0x10);
        WR_DATA(0x78);
        WR_CMD(PWCTLA);
        WR_DATA(0x39);
        WR_DATA(0x2C);
        WR_DATA(0x00);
        WR_DATA(0x34);
        WR_DATA(0x02);
        WR_CMD(PRCTL);
        WR_DATA(0x20);
        WR_CMD(DTIMCTLB);
        WR_DATA(0x00);
        WR_DATA(0x00);
        WR_CMD(FRMCTR1);
        WR_DATA(0x00);
        WR_DATA(0x1B);
        WR_CMD(DISCTRL);
        WR_DATA(0x0A);
        WR_DATA(0xA2);
        WR_CMD(PWCTRL1);
        WR_DATA(0x35);
        WR_CMD(PWCTRL2);
        WR_DATA(0x11);
        WR_CMD(VMCTRL1);
        WR_DATA(0x45);
        WR_DATA(0x45);
        WR_CMD(VMCTRL2);
        WR_DATA(0xA2);
        WR_CMD(EN3G);
        WR_DATA(0x00);
        WR_CMD(GAMSET);
        WR_DATA(0x01);
        WR_CMD(PGAMCTRL);
        WR_DATA(0x0F);
        WR_DATA(0x26);
        WR_DATA(0x24);
        WR_DATA(0x0B);
        WR_DATA(0x0E);
        WR_DATA(0x09);
        WR_DATA(0x54);
        WR_DATA(0xA8);
        WR_DATA(0x46);
        WR_DATA(0x0C);
        WR_DATA(0x17);
        WR_DATA(0x09);
        WR_DATA(0x0F);
        WR_DATA(0x07);
        WR_DATA(0x00);
        WR_CMD(NGAMCTRL);
        WR_DATA(0x00);
        WR_DATA(0x19);
        WR_DATA(0x1B);
        WR_DATA(0x04);
        WR_DATA(0x10);
        WR_DATA(0x07);
        WR_DATA(0x2A);
        WR_DATA(0x47);
        WR_DATA(0x39);
        WR_DATA(0x03);
        WR_DATA(0x06);
        WR_DATA(0x06);
        WR_DATA(0x30);
        WR_DATA(0x38);
        WR_DATA(0x0F);
        WR_CMD(MADCTL);
        WR_DATA(0x08);
        WR_CMD(CASET);
        WR_DATA(0x00);
        WR_DATA(0x00);
        WR_DATA(0x00);
        WR_DATA(0xEF);
        WR_CMD(PASET);
        WR_DATA(0x00);
        WR_DATA(0x00);
        WR_DATA(0x01);
        WR_DATA(0x3F);
        WR_CMD(PIXSET);
        WR_DATA(0x05);
        WR_CMD(SLPOUT);
        DelayMs(50);
        WR_CMD(DISPON);
        break;
    case 0x9320:
        lcd_dev.cmd_setx = 0x20;
        lcd_dev.cmd_sety = 0x21;
        lcd_dev.cmd_gram = 0x22;

        write_reg(0xe5,0x8000);  // Set the internal vcore voltage
        write_reg(0x00,0x0001);  // start OSC
        write_reg(0x2b,0x0010);  //Set the frame rate as 80 when the internal resistor is used for oscillator circuit
        write_reg(0x01,0x0100);  //s720  to  s1 ; G1 to G320
        write_reg(0x02,0x0700);  //set the line inversion
        //WR_CMD(0x03,0x1018);  //65536 colors
        write_reg(0x03,0x1030);
        //??
#ifdef LCD_USE_HORIZONTAL
        write_reg(0x03,(0<<5)|(0<<4)|(1<<3)|(1<<12));
#else
        write_reg(0x03,(1<<5)|(1<<4)|(0<<3)|(1<<12));
#endif

        write_reg(0x04,0x0000);
        write_reg(0x08,0x0202);
        write_reg(0x09,0x0000);
        write_reg(0x0a,0x0000);
        write_reg(0x0c,0x0000);
        write_reg(0x0d,0x0000);
        write_reg(0x0f,0x0000);
        write_reg(0x50,0x0000);
        write_reg(0x51,0x00ef);
        write_reg(0x52,0x0000);
        write_reg(0x53,0x013f);
        write_reg(0x60,0x2700);
        write_reg(0x61,0x0001);
        write_reg(0x6a,0x0000);
        write_reg(0x80,0x0000);
        write_reg(0x81,0x0000);
        write_reg(0x82,0x0000);
        write_reg(0x83,0x0000);
        write_reg(0x84,0x0000);
        write_reg(0x85,0x0000);
        write_reg(0x90,0x0010);
        write_reg(0x92,0x0000);
        write_reg(0x93,0x0003);
        write_reg(0x95,0x0110);
        write_reg(0x97,0x0000);
        write_reg(0x98,0x0000);

        write_reg(0x10,0x0000);
        write_reg(0x11,0x0000);
        write_reg(0x12,0x0000);
        write_reg(0x13,0x0000);
        DelayMs(5);
        write_reg(0x10,0x17b0);
        write_reg(0x11,0x0004);
        ;
        write_reg(0x12,0x013e);
        ;
        write_reg(0x13,0x1f00);
        write_reg(0x29,0x000f);
        ;
        write_reg(0x20,0x0000);
        write_reg(0x21,0x0000);

        write_reg(0x30,0x0204);
        write_reg(0x31,0x0001);
        write_reg(0x32,0x0000);
        write_reg(0x35,0x0206);
        write_reg(0x36,0x0600);
        write_reg(0x37,0x0500);
        write_reg(0x38,0x0505);
        write_reg(0x39,0x0407);
        write_reg(0x3c,0x0500);
        write_reg(0x3d,0x0503);
        write_reg(0x07,0x0173);
        ret = 0;
        break;
    case 0x8989:
        lcd_dev.cmd_setx =0x4e;
        lcd_dev.cmd_sety =0x4f;
        lcd_dev.cmd_gram =0x22;

        write_reg(0x0000,0x0001);
        write_reg(0x0003,0xA8A4);
        write_reg(0x000C,0x0000);
        write_reg(0x000D,0x080C);
        write_reg(0x000E,0x2B00);
        write_reg(0x001E,0x00B0);
        write_reg(0x0001,0x2B3F);
        write_reg(0x0002,0x0600);
        write_reg(0x0010,0x0000);
        write_reg(0x0011,0x6070);
        write_reg(0x0005,0x0000);
        write_reg(0x0006,0x0000);
        write_reg(0x0016,0xEF1C);
        write_reg(0x0017,0x0003);
        write_reg(0x0007,0x0233);
        write_reg(0x000B,0x0000);
        write_reg(0x000F,0x0000);
        write_reg(0x0041,0x0000);
        write_reg(0x0042,0x0000);
        write_reg(0x0048,0x0000);
        write_reg(0x0049,0x013F);
        write_reg(0x004A,0x0000);
        write_reg(0x004B,0x0000);
        write_reg(0x0044,0xEF00);
        write_reg(0x0045,0x0000);
        write_reg(0x0046,0x013F);
        write_reg(0x0030,0x0707);
        write_reg(0x0031,0x0204);
        write_reg(0x0032,0x0204);
        write_reg(0x0033,0x0502);
        write_reg(0x0034,0x0507);
        write_reg(0x0035,0x0204);
        write_reg(0x0036,0x0204);
        write_reg(0x0037,0x0502);
        write_reg(0x003A,0x0302);
        write_reg(0x003B,0x0302);
        write_reg(0x0023,0x0000);
        write_reg(0x0024,0x0000);
        write_reg(0x0025,0x8000);
        write_reg(0x004f,0);
        write_reg(0x004e,0);
        ret = 0;
        break;
    default:
        break;
    }

    LIB_TRACE("LCD CONTROLLER ID:0x%X\r\n", ili9320_get_id());
    ili9320_clear(BLACK);
    return ret;
}