平台:rk3288-firefly
内核:Linux4.4
编译工具:arm-linux-gnueabihf-
小屏幕:128x160lcd ST7735
配置设备树:
&spi0 {
status = "okay";
max-freq = <48000000>;
spidev@00 {
compatible = "spi,oled";
reg = <0x00>;
spi-max-frequency = <48000000>;
spi-cpha = <1>;
spi-cpol = <1>;
poll_mode = <0>;
type = <0>;
spi-rst = <&gpio5 8 GPIO_ACTIVE_LOW>;
spi-dc = <&gpio5 9 GPIO_ACTIVE_LOW>;
};
};
代码:“显示部分已经改进,但是坐标设置不太准确”
#include <linux/init.h>
#include <linux/module.h>
#include <linux/spi/spi.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
// #include "picc.h"
// LCD TFT 4-line-serial mode
#define RED 0xf800
#define GREEN 0x07e0
#define BLUE 0x001f
#define WHITE 0xffff
#define BLACK 0x0000
#define YELLOW 0xFFE0
#define GRAY0 0xEF7D //灰色0 3165 00110 001011 00101
#define GRAY1 0x8410 //灰色1 00000 000000 00000
#define GRAY2 0x4208 //灰色2 1111111111011111
#define DRIVER_NAME "spi-lcd_driver"
#define LCDDEV_CNT 1
#define LCDDEV_NAME "gpio-lcd-kevin"
#define Width 128
#define Height 160
struct spi_lcd_dev {
dev_t devid;
struct cdev cdev;
struct class* class;
struct device* device;
struct device_node *nd;
int major;
int minor;
void *private_data; //私有数据
int dc_gpio;
int rest_gpio;
};
static struct spi_lcd_dev lcd_dev;
static int LCD_WriteCommand(struct spi_lcd_dev *dev, unsigned char c)
{
int ret;
struct spi_message m;
struct spi_transfer *t;
struct spi_device *spi = dev->private_data;
unsigned char txdata = c;
t = kzalloc(sizeof(struct spi_transfer), GFP_KERNEL); /* 申请内存 */
if(t == NULL)
{
printk(KERN_ALERT "alloc spi transfer failed !\r\n");
return -EINVAL;
}
gpio_set_value(dev->dc_gpio, 0); /* 拉低发命令 */
t->tx_buf = &txdata;
t->len = 1;
t->bits_per_word = 8;
spi_message_init(&m); /* 初始化spi_message */
spi_message_add_tail(t, &m); /* 将spi_transfer添加到spi_message队列 */
ret = spi_sync(spi, &m); /* 使用同步发送 */
kfree(t);
return ret;
}
static int LCD_WriteData(struct spi_lcd_dev *dev, unsigned char dat)
{
int ret;
struct spi_message m;
struct spi_transfer *t;
struct spi_device *spi = dev->private_data;
unsigned char txdata = dat;
t = kzalloc(sizeof(struct spi_transfer), GFP_KERNEL); /* 申请内存 */
if(t == NULL)
{
printk(KERN_ALERT "alloc spi transfer failed !\r\n");
return -EINVAL;
}
gpio_set_value(dev->dc_gpio, 1); /* 拉高发数据 */
t->tx_buf = &txdata;
t->len = 1;
t->bits_per_word = 8;
spi_message_init(&m); /* 初始化spi_message */
spi_message_add_tail(t, &m); /* 将spi_transfer添加到spi_message队列 */
ret = spi_sync(spi, &m); /* 使用同步发送 */
kfree(t);
return ret;
}