rt-thread/bsp/x1000/drivers/slcd/drv_slcd_ili9341.c

253 lines
6.6 KiB
C
Raw Normal View History

2017-11-11 13:51:56 +08:00
/*
* File : drv_slcdc_ili9341.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2008 - 2016, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2016-08-12 fujie The first version
*/
#include <string.h>
#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "board.h"
#include "drv_gpio.h"
#include "drv_slcdc.h"
#include "drv_clock.h"
#if defined(RT_USING_ILI9341)
rt_uint32_t _ili9341_cmd_table[]=
{
0x2c2c2c2c,
};
const struct slcd_data_table _ili9341_data_table[] =
{
{SMART_CONFIG_CMD, 0x11},
{SMART_CONFIG_UDELAY, 1200},
{SMART_CONFIG_CMD, 0xCF}, //Power control B <20><><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>B <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0xAA},
{SMART_CONFIG_DATA, 0XB0},
{SMART_CONFIG_CMD, 0xED}, //Power on sequence control <20><>Դʱ<D4B4><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{SMART_CONFIG_DATA, 0x64},
{SMART_CONFIG_DATA, 0x03},
{SMART_CONFIG_DATA, 0X12},
{SMART_CONFIG_DATA, 0X81},
{SMART_CONFIG_CMD, 0xE8}, //Driver timing control A
{SMART_CONFIG_DATA, 0x85},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x78},
{SMART_CONFIG_CMD, 0xCB}, //Power control A
{SMART_CONFIG_DATA, 0x39},
{SMART_CONFIG_DATA, 0x2C},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x34},
{SMART_CONFIG_DATA, 0x02},
{SMART_CONFIG_CMD, 0xF7}, //Pump ratio control
{SMART_CONFIG_DATA, 0x20},
{SMART_CONFIG_CMD, 0xEA}, // Driver timing control B
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_CMD, 0xb6}, //Display Function Control
{SMART_CONFIG_DATA, 0x0a},
{SMART_CONFIG_DATA, 0xa2},
{SMART_CONFIG_CMD, 0xC0}, //Power control
{SMART_CONFIG_DATA, 0x26}, //VRH[5:0]
{SMART_CONFIG_CMD, 0xC1}, //Power control
{SMART_CONFIG_DATA, 0x11}, //SAP[2:0];BT[3:0]
{SMART_CONFIG_CMD, 0xC5}, //VCM control
{SMART_CONFIG_DATA, 0x31}, //<2F>Աȶȵ<C8B6><C8B5><EFBFBD> 0x31
{SMART_CONFIG_DATA, 0x3C},
{SMART_CONFIG_CMD, 0xC7}, //VCM control2
{SMART_CONFIG_DATA, 0xd3},
{SMART_CONFIG_CMD, 0x36}, // Memory Access Control
{SMART_CONFIG_DATA, 0x68}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><E6B4A2><EFBFBD>Ķ<EFBFBD>дɨ<D0B4><EFBFBD><E8B7BD> //[<5B><><EFBFBD><EFBFBD>]0x48 0x88 [<5B><><EFBFBD><EFBFBD>]0x28 0xE8 0x68 //0x08
{SMART_CONFIG_CMD, 0x3A}, //COLMOD: Pixel Format Set
{SMART_CONFIG_DATA, 0x55},
{SMART_CONFIG_CMD, 0xB1}, //VCM control
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x14},
{SMART_CONFIG_CMD, 0xF2}, // 3Gamma Function Disable
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_CMD, 0x26}, //Gamma curve selected
{SMART_CONFIG_DATA, 0x01},
{SMART_CONFIG_CMD, 0xE0}, //Set Gamma
{SMART_CONFIG_DATA, 0x0F},
{SMART_CONFIG_DATA, 0x1d},
{SMART_CONFIG_DATA, 0x1a},
{SMART_CONFIG_DATA, 0x09},
{SMART_CONFIG_DATA, 0x0f},
{SMART_CONFIG_DATA, 0x09},
{SMART_CONFIG_DATA, 0x46},
{SMART_CONFIG_DATA, 0x88},
{SMART_CONFIG_DATA, 0x39},
{SMART_CONFIG_DATA, 0x05},
{SMART_CONFIG_DATA, 0x0f},
{SMART_CONFIG_DATA, 0x03},
{SMART_CONFIG_DATA, 0x07},
{SMART_CONFIG_DATA, 0x05},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_CMD, 0XE1}, //Set Gamma
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x22},
{SMART_CONFIG_DATA, 0x25},
{SMART_CONFIG_DATA, 0x06},
{SMART_CONFIG_DATA, 0x10},
{SMART_CONFIG_DATA, 0x06},
{SMART_CONFIG_DATA, 0x39},
{SMART_CONFIG_DATA, 0x22},
{SMART_CONFIG_DATA, 0x4a},
{SMART_CONFIG_DATA, 0x0a},
{SMART_CONFIG_DATA, 0x10},
{SMART_CONFIG_DATA, 0x0C},
{SMART_CONFIG_DATA, 0x38},
{SMART_CONFIG_DATA, 0x3a},
{SMART_CONFIG_DATA, 0x0F},
{SMART_CONFIG_UDELAY, 5},
{SMART_CONFIG_CMD, 0x11}, //Exit Sleep
{SMART_CONFIG_UDELAY, 12},
{SMART_CONFIG_CMD, 0x29}, //Display
// Write the display data into GRAM here
{SMART_CONFIG_CMD, 0x2A},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0xEF},
{SMART_CONFIG_CMD, 0x2B},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x00},
{SMART_CONFIG_DATA, 0x01},
{SMART_CONFIG_DATA, 0x3F},
// {SMART_CONFIG_CMD, 0x2C}, //GRAM start writing
/* set window */
{SMART_CONFIG_CMD, 0x2a},
{SMART_CONFIG_DATA, 0>>8},
{SMART_CONFIG_DATA, 0&0xFF},
{SMART_CONFIG_DATA, 320>>8},
{SMART_CONFIG_DATA, 320&0xFF},
{SMART_CONFIG_CMD, 0x2b},
{SMART_CONFIG_DATA, 0>>8},
{SMART_CONFIG_DATA, 0&0xFF},
{SMART_CONFIG_DATA, 240>>8},
{SMART_CONFIG_DATA, 240&0xFF},
{SMART_CONFIG_CMD, 0X2C}, //GRAM start writing
};
const struct slcd_configure _ili9341_config =
{
.reg_write_twice = 0,
.rsply_cmd_high = 0,
.csply_active_high = 0,
/* write graphic ram command, in word, for example 8-bit bus, write_gram_cmd=C3C2C1C0. */
.newcfg_fmt_conv = 1,
.width = 320,
.height = 240,
.bpp = 16,
.bus_width = 8,
.data_table_num = sizeof(_ili9341_data_table)/sizeof(_ili9341_data_table[0]),
.data_table = &_ili9341_data_table[0],
.cmd_table = &_ili9341_cmd_table[0],
.cmd_table_num = sizeof(_ili9341_cmd_table)/sizeof(_ili9341_cmd_table[0]),
};
void ili9341_bl_set(rt_bool_t isPwrON)
{
if(isPwrON)
gpio_set_value(GPIO_PORT_B, GPIO_Pin_10, 1);
else
gpio_set_value(GPIO_PORT_B, GPIO_Pin_10, 0);
}
int ili9341_init(void)
{
/* enable backlight */
gpio_set_func(GPIO_PORT_B, GPIO_Pin_12, GPIO_OUTPUT0); //LCD Light
/* Reset LCD Driver */
gpio_set_func(GPIO_PORT_B, GPIO_Pin_10, GPIO_OUTPUT0);
rt_thread_delay(20);
gpio_set_value(GPIO_PORT_B, GPIO_Pin_10, 1);
rt_thread_delay(20);
rt_hw_slcd_init((struct slcd_configure *)&_ili9341_config);
// rt_hw_lcd_set_bl_func(ili9341_bl_set);
return 0;
}
#include <finsh.h>
int bl(int argc, char** argv)
{
int enable = 0;
if (argc != 2) return 0;
enable = atoi(argv[1]);
if (enable)
{
rt_kprintf("turn on blight\n");
gpio_set_value(GPIO_PORT_B, GPIO_Pin_12, 1);
}
else
{
rt_kprintf("turn off blight\n");
gpio_set_value(GPIO_PORT_B, GPIO_Pin_12, 0);
}
return 0;
}
MSH_CMD_EXPORT(bl, black light);
#endif //RT_USING_ILI9341