DRM驱动移植spi显示屏(st7789芯片驱动)

引言

        本篇博客介绍了使用DRM驱动开发spi屏幕的开发过程。主要包括:

        1、spi框架驱动屏幕

        2、DRM虚拟驱动

        3、DRM开发spi屏幕显示驱动

一、总体介绍

        1. 学习DRM也点时间了,前段时间被其他事情耽误了,最近才有时间写一下DRM驱动。本篇博客主要介绍了spi屏幕的驱动、虚拟DRM驱动、spi屏幕添加到DRM驱动中,下面分别介绍。     

        2. DRM驱动是linux显示子系统,一个比较复杂的驱动子系统,博主也仅仅只是一些了解,博客里面记录的是我自己对他学习的过程。具体的可以参考博主其他的文章或者其他博主的文章。这里放一下博主以前写的介绍DRM驱动的链接。DRM驱动介绍

        之前对他的学习很不充分,从这篇文章开始,将记录DRM驱动移植到spi接口的st7789屏幕上。

        3. st7789是一个显示芯片,博主使用的是spi接口的,分辨率为240×240,七针接口,3.3v供电。分别是:电源:gdn、vcc;spi通信:sck、sda;  复位:res;dc:数据命令切换;blk:背光。这里放一下图片(防止广告嫌疑,只有图片,具体可以某宝搜一下就有了)。

         4. 博主用的环境:

                虚拟机:ubuntu18

                硬件:stm32mp157(某原子的开发板) + spi屏幕

                开发板内核版本:Linux 5.4.30(开发板带的)

二、使用spi框架驱动spi屏幕

                在设备树中,添加spi屏幕的部分,这里给出我自己的设备节点写的代码。

spidev: htqst7789@0 {
        compatible = "htq,st7789";
        reg = <0>; /* CS #0 */
        scl-gpio = <&gpiof 6  GPIO_ACTIVE_LOW>;
        sda-gpio = <&gpiof 7  GPIO_ACTIVE_LOW>;
        res-gpio = <&gpiof 8  GPIO_ACTIVE_LOW>;
        dc-gpio  = <&gpiof 9  GPIO_ACTIVE_LOW>;
        blk-gpio = <&gpiof 10 GPIO_ACTIVE_LOW>;
        spi-max-frequency = <8000000>;
    };

        最开始,使用的是模拟的spi协议,所以设备节点就用了这个,后面改成硬件spi时,把scl、sda接到硬件spi引脚上,res、dc、blk均没动。这部分跟之前使用spi框架驱动icm20608类似,spi框架部分,详细可以参考博主以前写的spi框架部分。spi框架驱动icm20608,想深入了解spi框架运行部分的,也可以参考博主的这个博文。spi框架分析

        驱动部分也是类似,将之前写的代码拿过来改动下,不同之处在于spi的驱动方式。st7789使用的是SPI_MODE_3,需要配置好,其他的基本类似。

spi->mode = SPI_MODE_3;
spi_setup(spi);

这里将博主写的spi驱动st7789的底层读写函数放一下,代码只是用于学习用的,很多未曾考虑到,比如互斥之类的。

struct st7789_device{
	dev_t                dev_id;             //设备号
	int                  major;              //主设备号
	int                  minor;              //次设备号
	struct cdev	         cdev;               //字符设备
	struct class         *class;             //类
	struct device        *device;            //设备
	struct device_node   *device_node;       //设备节点
	
	void                 *privative_data;    //私有数据
	int                  scl_gpio;           
    int                  sda_gpio;           
    int                  res_gpio;           
    int                  dc_gpio;            
    int                  blk_gpio;           
};

static struct st7789_device  st7789_device; 

#define SPI_RST_L()  { gpio_set_value(st7789_device.res_gpio, 0);}
#define SPI_RST_H()  { gpio_set_value(st7789_device.res_gpio, 1);}

#define SPI_DC_L()   { gpio_set_value(st7789_device.dc_gpio, 0);}
#define SPI_DC_H()   { gpio_set_value(st7789_device.dc_gpio, 1);}

#define SPI_BLK_H() {;}   //背光直接接到3.3v了


void st7789_spi_send_byte(unsigned  char byte)				
{  
	int ret = 0;
	unsigned char tx_data[1];
	
	struct spi_message m;
	struct spi_transfer *t;
	struct spi_device *spi = (struct spi_device *)st7789_device.privative_data;

	t = kzalloc(sizeof(struct spi_tr
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫川宁520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值