标题 关于全志R11如何驱动ST7789芯片的屏幕 1、本次采用的是4线SPI通信,IM3-0为[1,1,1,0]模式 2、屏的接口为50ping,接线分别为如下 CS接地(或者软件控制) ## 标题 因为是SPI串口通信有些管脚已经被复用,最后二根数据线分别为 目前代码里只控制屏幕所以SDO可以悬空 其他的一些电源接地脚需要自己注意一下,下面为放置在内核中的代码。 #include <linux/init.h> #include <linux/miscdevice.h> #include <linux/module.h> #include <linux/version.h> #include <linux/kernel.h> #include <linux/slab.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/types.h> #include <asm/io.h> #include <linux/wait.h> #include <linux/sched.h> #include <linux/interrupt.h> #include <linux/delay.h> #include <linux/gpio.h>
/*本次通信采用的4线SPI通信 RS直接接地没有处理 RS是数据和命令的控制脚 SCLK为时钟 SDI和SDO为数据线(SDO目前是悬空未进行操作) RST为复位脚 平台为全志R11 */ #define WHITE 0xFFFF #define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F #define GRED 0XFFE0 #define GBLUE 0X07FF #define RED 0xF800 #define MAGENTA 0xF81F #define GREEN 0x07E0 #define CYAN 0x7FFF #define YELLOW 0xFFE0 #define BROWN 0XBC40 //棕色 #define BRRED 0XFC07 //棕红色 #define GRAY 0X8430 //灰色 //GUI颜色
#define DARKBLUE 0X01CF //深蓝色 #define LIGHTBLUE 0X7D7C //浅蓝色 #define GRAYBLUE 0X5458 //灰蓝色 //以上三色为PANEL的颜色
#define LIGHTGREEN 0X841F //浅绿色 #define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色) #define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
#define LCD_W 240 #define LCD_H 320 #define u8 unsigned char #define u16 unsigned int #define u32 unsigned long
#define GPIO_PB_0 160 #define GPIO_PB_1 161 #define GPIO_PB_6 164 #define GPIO_PB_7 165
#define SCLK GPIO_PB_0 #define SDI GPIO_PB_1 #define RS GPIO_PB_6 #define Reset GPIO_PB_7
#define OLED_SCLK_Clr() gpio_direction_output(SCLK, 0)//CLK #define OLED_SCLK_Set() gpio_direction_output(SCLK, 1)
#define OLED_SDIN_Clr() gpio_direction_output(SDI, 0)//DIN #define OLED_SDIN_Set() gpio_direction_output(SDI, 1)
#define OLED_RST_Clr() gpio_direction_output(Reset, 0)//RES #define OLED_RST_Set() gpio_direction_output(Reset, 1)
#define OLED_DC_Clr() gpio_direction_output(RS, 0)//DC #define OLED_DC_Set() gpio_direction_output(RS, 1)
//先释放一下几个gpio口为了方便以后的占用 static void spi_free_gpio(void) { gpio_free(SDI); gpio_free(SCLK); gpio_free(RS); gpio_free(Reset); }
//申请GPIO口资源 static int spi_request_gpio(void) { if (gpio_request(SDI, “spi_SDI”) < 0) { printk(“fail to request SDI\n”); return -1; } if (gpio_request(SCLK, “spi_sclk\n”) < 0) { printk(“fail to request sclk\n”); return -1; } if (gpio_request(RS, “spi_RS”) < 0) { printk(“fail to request RS\n”); return -1; } if (gpio_request(Reset, “spi_reset”) < 0) { printk(“fail to request reset\n”); return -1; } return 0; }
u16 BACK_COLOR, POINT_COLOR; //背景色,画笔色 void LCD_Writ_Bus(char dat) //串行数据写入 { u8 i;
for(i=0;i<8;i++) { OLED_SCLK_Clr(); if(dat&0x80) OLED_SDIN_Set(); else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; }}
void LCD_WR_DATA8(char da) //发送数据-8位参数 { //OLED_CS_Clr(); OLED_DC_Set(); LCD_Writ_Bus(da); //OLED_CS_Set(); } void LCD_WR_DATA(int da) {// OLED_CS_Clr(); OLED_DC_Set(); LCD_Writ_Bus(da>>8); LCD_Writ_Bus(da); // OLED_CS_Set(); } void LCD_WR_REG(char da) { // OLED_CS_Clr(); OLED_DC_Clr(); LCD_Writ_Bus(da); // OLED_CS_Set(); } void LCD_WR_REG_DATA(int reg,int da) {// OLED_CS_Clr(); LCD_WR_REG(reg); LCD_WR_DATA(da); // OLED_CS_Set(); }
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) { LCD_WR_REG(0x2a); LCD_WR_DATA8(x1>>8); LCD_WR_DATA8(x1); LCD_WR_DATA8(x2>>8); LCD_WR_DATA8(x2);
LCD_WR_REG(0x2b); LCD_WR_DATA8(y1>>8); LCD_WR_DATA8(y1); LCD_WR_DATA8(y2>>8); LCD_WR_DATA8(y2);
LCD_WR_REG(0x2C); }
//清屏函数 //Color:要清屏的填充色 void LCD_Clear(u16 Color) { u16 i,j; Address_set(0,0,LCD_W-1,LCD_H-1); for(i=0;i<LCD_W;i++) { for (j=0;j<LCD_H;j++) { LCD_WR_DATA(Color); }
}}
void Lcd_Init(void) { // spi_free_gpio(); // mdelay(120); // spi_request_gpio(); // mdelay(120); //OLED_CS_Clr(); //打开片选使能 OLED_RST_Clr(); mdelay(20); OLED_RST_Set(); mdelay(20); // OLED_BLK_Set();
//************* Start Initial Sequence **********// LCD_WR_REG(0x36); LCD_WR_DATA8(0x00);
LCD_WR_REG(0x3A); LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7); LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB); LCD_WR_DATA8(0x19);
LCD_WR_REG(0xC0); LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2); LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3); LCD_WR_DATA8(0x12);
LCD_WR_REG(0xC4); LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6); LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0); LCD_WR_DATA8(0xA4); LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0); LCD_WR_DATA8(0xD0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x2B); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x54); LCD_WR_DATA8(0x4C); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x23);
LCD_WR_REG(0xE1); LCD_WR_DATA8(0xD0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x44); LCD_WR_DATA8(0x51); LCD_WR_DATA8(0x2F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x23);
LCD_WR_REG(0x21);
LCD_WR_REG(0x11); //Delay (120);
LCD_WR_REG(0x29);
// delay_ms (120); // LCD_WR_REG(0x23); }
//入口主函数 static int __init ya15c_spi_init(void) {
spi_free_gpio(); mdelay(50); if (spi_request_gpio()) { printk("ya15c spi initializer failure...\n"); return -1; } mdelay(50); OLED_SCLK_Set(); OLED_SDIN_Set(); OLED_RST_Set(); OLED_DC_Set(); mdelay(50);// printk("\n\n\n\n\n\n111111111111111111111111111===================\n\n\n\n\n\n\n\n\n"); // printk(“start 11to set color! …\n”); Lcd_Init(); mdelay(120);
LCD_Clear(WHITE); //清屏 return 0; }
static void __exit ya15c_spi_exit(void) { printk(“ya15c exit!\n”); }
module_init(ya15c_spi_init); module_exit(ya15c_spi_exit); MODULE_LICENSE(“GPL”);
调试的过程中遇到的坑是真的不少。希望能够帮助到大家