文章目录
- ST7789 linux4.x驱动
- 设备树配置
- 驱动程序
- 编译驱动
- 测试驱动
ST7789 linux4.x驱动
设备树配置
pinctrl_ecspi2_cs_1: ecspi2_cs_grp-1 {fsl,pins = <MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x40017059>;
};pinctrl_ecspi2_1: escpi2grp {fsl,pins = <MX6UL_PAD_CSI_DATA00__ECSPI2_SCLK 0x100b1MX6UL_PAD_CSI_DATA02__ECSPI2_MOSI 0x100b1MX6UL_PAD_CSI_DATA03__ECSPI2_MISO 0x100b1>;
};
&ecspi2 {fsl,spi-num-chipselects = <1>;cs-gpios = <&gpio4 22 0>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_ecspi2_1 &pinctrl_ecspi2_cs_1>;status = "okay";fbftf: st7789v@0 {compatible = "sitronix,st7789v";spi-max-frequency = <8000000>;dc-gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;rst-gpio = <&gpio2 22 GPIO_ACTIVE_HIGH>;led-gpios = <&gpio2 19 GPIO_ACTIVE_LOW>;reg = <0>;//bgr = <1>;//rotate = <0>;buswidth = <8>;//width = <240>;//height= <320>;//debug = <0>;fps = <60>;};
};
驱动程序
drivers/staging/fbtft/fb_st7789v.c
/** FB driver for the ST7789V LCD Controller** Copyright (C) 2015 Dennis Menschel** 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.*/#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <video/mipi_display.h>#include "fbtft.h"#define DRVNAME "fb_st7789v"/*#define DEFAULT_GAMMA \"70 2C 2E 15 10 09 48 33 53 0B 19 18 20 25\n" \"70 2C 2E 15 10 09 48 33 53 0B 19 18 20 25"*/#define DEFAULT_GAMMA \"f0 00 0a 10 12 1b 39 44 47 28 12 10 16 1b\n" \"f0 00 0a 10 11 1a 3b 34 4e 3a 17 16 21 22"/*** enum st7789v_command - ST7789V display controller commands** @PORCTRL: porch setting* @GCTRL: gate control* @VCOMS: VCOM setting* @VDVVRHEN: VDV and VRH command enable* @VRHS: VRH set* @VDVS: VDV set* @VCMOFSET: VCOM offset set* @PWCTRL1: power control 1* @PVGAMCTRL: positive voltage gamma control* @NVGAMCTRL: negative voltage gamma control** The command names are the same as those found in the datasheet to ease* looking up their semantics and usage.** Note that the ST7789V display controller offers quite a few more commands* which have been omitted from this list as they are not used at the moment.* Furthermore, commands that are compliant with the MIPI DCS have been left* out as well to avoid duplicate entries.*/
enum st7789v_command {PORCTRL = 0xB2,GCTRL = 0xB7,VCOMS = 0xBB,VDVVRHEN = 0xC2,VRHS = 0xC3,VDVS = 0xC4,VCMOFSET = 0xC5,PWCTRL1 = 0xD0,PVGAMCTRL = 0xE0,NVGAMCTRL = 0xE1,
};#define MADCTL_BGR BIT(3) /* bitmask for RGB/BGR order */
#define MADCTL_MV BIT(5) /* bitmask for page/column order */
#define MADCTL_MX BIT(6) /* bitmask for column address order */
#define MADCTL_MY BIT(7) /* bitmask for page address order *//*** init_display() - initialize the display controller** @par: FBTFT parameter object** Most of the commands in this init function set their parameters to the* same default values which are already in place after the display has been* powered up. (The main exception to this rule is the pixel format which* would default to 18 instead of 16 bit per pixel.)* Nonetheless, this sequence can be used as a template for concrete* displays which usually need some adjustments.** Return: 0 on success, < 0 if error occurred.*/
static int init_display(struct fbtft_par *par)
{/* turn off sleep mode */write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE);mdelay(120);write_reg(par, 0xb2, 0x0c, 0x0c, 0x00, 0x33, 0x33);write_reg(par, 0xb7, 0x35);write_reg(par, 0xbb, 0x33);write_reg(par, 0xc3, 0x1a);write_reg(par, 0xc4, 0x18);write_reg(par, 0xc6, 0x01);write_reg(par, 0xd0, 0xa4, 0xb3);write_reg(par, 0xe0, 0xf0, 0x00, 0x0a, 0x10, 0x12, 0x1b, 0x39, 0x44, 0x47, 0x28, 0x12, 0x10, 0x16, 0x1b);write_reg(par, 0xe1, 0xf0, 0x00, 0x0a, 0x10, 0x11, 0x1a, 0x3b, 0x34, 0x4e, 0x3a, 0x17, 0x16, 0x21, 0x22);write_reg(par, 0x3a, 0x55);write_reg(par, 0x2a, 0x00, 0x00, 0x00, 0xef);write_reg(par, 0x2b, 0x00, 0x00, 0x01, 0x3f);write_reg(par, 0x21);write_reg(par, 0x29);write_reg(par, 0x2c);return 0;
}/*** set_var() - apply LCD properties like rotation and BGR mode** @par: FBTFT parameter object** Return: 0 on success, < 0 if error occurred.*/
static int set_var(struct fbtft_par *par)
{u8 madctl_par = 0;if (par->bgr)madctl_par |= MADCTL_BGR;switch (par->info->var.rotate) {case 0:break;case 90:madctl_par |= (MADCTL_MV | MADCTL_MY);break;case 180:madctl_par |= (MADCTL_MX | MADCTL_MY);break;case 270:madctl_par |= (MADCTL_MV | MADCTL_MX);break;default:return -EINVAL;}write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, madctl_par);return 0;
}/*** set_gamma() - set gamma curves** @par: FBTFT parameter object* @curves: gamma curves** Before the gamma curves are applied, they are preprocessed with a bitmask* to ensure syntactically correct input for the display controller.* This implies that the curves input parameter might be changed by this* function and that illegal gamma values are auto-corrected and not* reported as errors.** Return: 0 on success, < 0 if error occurred.*/
static int set_gamma(struct fbtft_par *par, unsigned long *curves)
{int i;int j;int c; /* curve index offset *//** Bitmasks for gamma curve command parameters.* The masks are the same for both positive and negative voltage* gamma curves.*/const u8 gamma_par_mask[] = {0xFF, /* V63[3:0], V0[3:0]*/0x3F, /* V1[5:0] */0x3F, /* V2[5:0] */0x1F, /* V4[4:0] */0x1F, /* V6[4:0] */0x3F, /* J0[1:0], V13[3:0] */0x7F, /* V20[6:0] */0x77, /* V36[2:0], V27[2:0] */0x7F, /* V43[6:0] */0x3F, /* J1[1:0], V50[3:0] */0x1F, /* V57[4:0] */0x1F, /* V59[4:0] */0x3F, /* V61[5:0] */0x3F, /* V62[5:0] */};for (i = 0; i < par->gamma.num_curves; i++) {c = i * par->gamma.num_values;for (j = 0; j < par->gamma.num_values; j++)curves[c + j] &= gamma_par_mask[j];write_reg(par, PVGAMCTRL + i,curves[c + 0], curves[c + 1], curves[c + 2],curves[c + 3], curves[c + 4], curves[c + 5],curves[c + 6], curves[c + 7], curves[c + 8],curves[c + 9], curves[c + 10], curves[c + 11],curves[c + 12], curves[c + 13]);}return 0;
}/*** blank() - blank the display** @par: FBTFT parameter object* @on: whether to enable or disable blanking the display** Return: 0 on success, < 0 if error occurred.*/
static int blank(struct fbtft_par *par, bool on)
{if (on)write_reg(par, MIPI_DCS_SET_DISPLAY_OFF);elsewrite_reg(par, MIPI_DCS_SET_DISPLAY_ON);return 0;
}static struct fbtft_display display = {.regwidth = 8,.width = 240,.height = 320,.gamma_num = 2,.gamma_len = 14,.gamma = DEFAULT_GAMMA,.fbtftops = {.init_display = init_display,.set_var = set_var,.set_gamma = set_gamma,.blank = blank,},
};FBTFT_REGISTER_DRIVER(DRVNAME, "sitronix,st7789v", &display);MODULE_ALIAS("spi:" DRVNAME);
MODULE_ALIAS("platform:" DRVNAME);
MODULE_ALIAS("spi:st7789v");
MODULE_ALIAS("platform:st7789v");MODULE_DESCRIPTION("FB driver for the ST7789V LCD Controller");
MODULE_AUTHOR("Dennis Menschel");
MODULE_LICENSE("GPL");
drivers/staging/fbtft/Makefile
obj-$(CONFIG_FB_TFT_ST7789V) += fb_st7789v.o
drivers/staging/fbtft/Kconfig
config FB_TFT_ST7789Vtristate "FB driver for the ST7789V LCD Controller"depends on FB_TFThelpThis enables generic framebuffer support for the Sitronix ST7789Vdisplay controller. The controller is intended for small colordisplays with a resolution of up to 320x240 pixels.Say Y if you have such a display that utilizes this controller.
编译驱动
make ARCH=arm menuconfig
make ARCH=arm -j8
测试驱动
fb-test
fb-test 1.1.1 (rosetta)
fb res 240x320 virtual 240x320, line_len 480, bpp 16