引言
本篇博客介绍了使用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

5983

被折叠的 条评论
为什么被折叠?



