ssd1322有四种驱动方式:
- 8-bit 6800/8080-series parallel interface
- 3/4-wire Serial Peripheral Interface
我选择的是用3线SPI模式对屏幕进行驱动。
驱动代码如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/spi/spi.h>
#include <linux/delay.h>
#include "fbtft.h"
#define DRVNAME "fb_ssd1322"
#define WIDTH 256
#define HEIGHT 64
static int init_display(struct fbtft_par *par)
{
par->fbtftops.reset(par);
mdelay(100);
write_reg(par, 0xFD, 0x12);
write_reg(par, 0xAE);
write_reg(par, 0xB3, 0x91);
write_reg(par, 0xCA, 0x3F);
write_reg(par, 0xA2, 0x00);
write_reg(par, 0xA1, 0x00);
write_reg(par, 0xA0, 0x14, 0x11);
write_reg(par, 0xB5, 0x00);
write_reg(par, 0xAB, 0x01);
write_reg(par, 0xB4, 0xA0, 0xF8);
write_reg(par, 0xC1, 0xEF);
write_reg(par, 0xC7, 0xFF);
write_reg(par, 0xB8, 0x0C, 0x18, 0x24, 0x30, 0x3C, 0x48, 0x54, 0x60, 0x6C, 0x78, 0x84, 0x90, 0x9C, 0xA8, 0xB4);
write_reg(par, 0x00);
write_reg(par, 0xB1, 0xE2);
write_reg(par, 0xD1, 0xA2, 0x20);
write_reg(par, 0xBB, 0x1F);
write_reg(par, 0xB6, 0x08);
write_reg(par, 0xBE, 0x07);
write_reg(par, 0xA6);
write_reg(par, 0xA9);
mdelay(100);
write_reg(par, 0xAF);
return 0;
}
static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
{
write_reg(par, 0x15, 0x00, 0x7F);
write_reg(par, 0x75, 0x00, 0x7F);
write_reg(par, 0x5c);
}
static int blank(struct fbtft_par *par, bool on)
{
fbtft_par_dbg(DEBUG_BLANK, par, "%s(blank=%s)\n", __func__, on ? "true" : "false");
if (on)
write_reg(par, 0xAE);
else
write_reg(par, 0xAF);
return 0;
}
static struct fbtft_display display = {
.regwidth = 8,
.width = WIDTH,
.height = HEIGHT,
.fbtftops = {
.init_display = init_display,
.set_addr_win = set_addr_win,
.blank = blank,
},
};
FBTFT_REGISTER_DRIVER(DRVNAME, "solomon,ssd1322", &display);
MODULE_ALIAS("spi:" DRVNAME);
MODULE_ALIAS("platform:" DRVNAME);
MODULE_ALIAS("spi:ssd1322");
MODULE_ALIAS("platform:ssd1322");
MODUL