Linux下SPI子系统配置1.8寸LCD屏

平台: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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值