i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)
Posted Mculover666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)相关的知识,希望对你有一定的参考价值。
获取更干净清爽的阅读体验,可以访问我的个人博客网站:i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)。
一、驱动编写思路
(1)编写spi驱动框架,检查probe是否可以正常挂载;
(2)在probe设备中,解析设备树gpio信息、屏幕参数信息;
(3)操作gpio,检查背光控制是否正常
(4)基于linux spi框架适配spi写接口,看lcd_init是否正常
二、设备树节点描述
spilcd: st7789@1
compatible = "spilcd,st7789";
spi-max-frequency = <8000000>;
reg = <1>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_st7789>;
//unuse
//cs-gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
reset-gpio = <&gpio1 1 GPIO_ACTIVE_LOW>;
dc-gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
bl-gpio = <&gpio1 4 GPIO_ACTIVE_LOW>;
width = <240>;
height = <240>;
// 0: normal, 1: left 90, 2: 180, 3: right 90.
direction = <0>;
;
pinctrl节点如下:
pinctrl_st7789: st7789grp
fsl,pins = <
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x10b0
MX6UL_PAD_GPIO1_IO02__GPIO1_IO02 0x10b0
MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0x10b0
>;
;
三、驱动调试中遇到的问题
1. lcd_init初始化之后屏幕没反应
1.1. 问题分析
该问题是由于SPI总线模式设置错误,导致spi无法正常通信,所以屏幕无反应。
1.2. 问题解决
spi->mode = SPI_MODE_3;
2. lcd清屏需要10s
2.1. 问题分析
通过打桩排查到lcd_clear执行需要10s,肯定是spi传输函数写的太慢了。
2.2. 问题解决
清屏的时候,不要逐个字节调用API写入,考虑整块内存先构建好,然后一次性调用API写入。
static int lcd_write_bytes(uint8_t *data, int size)
int ret;
struct spi_transfer t =
.tx_buf = data,
.len = size,
;
struct spi_message msg;
spi_message_init(&msg);
spi_message_add_tail(&t, &msg);
ret = spi_sync(lcd.spi, &msg);
if (ret < 0)
printk(KERN_ERR "lcd_write_bytes fail, ret is %d\\n", ret);
return -1;
return 0;
四、驱动源码及测试
1. 驱动源码
2. 编译
设置编译环境:
source build_env.sh
Makefile中设置linux编译目录:
KERNEL_DIR = /home/mculover666/develop/imx6ull/linux-imx6ull/output
编译:
make
基于我自己移植的Linux 4.1.15内核编译好的驱动模块在ko_release中。
3. 测试
加载模块:
insmod fb_st7789_spi.ko
加载会有如下日志:
[ 269.299961] ------ st7789 spi lcd probe in ------
[ 269.300102] reset-gpio:1, dc-gpio:2, bl-gpio:4 cs-gpio:-2
[ 269.300147] width:240, height:240, direction:0
[ 269.300171] ------ st7789 spi lcd init in ------
[ 269.538824] lcd hard reset finish!
[ 269.668841] lcd sleep out finish!
[ 269.676788] lcd init finish!
[ 269.681107] lcd_fill_rect: lcd_write_color start!
[ 269.769301] lcd_fill_rect: lcd_write_color finish!
[ 269.769339] lcd clear finish!
[ 269.769358] ------ st7789 spi lcd init in ------
[ 269.769377] ------ st7789 spi lcd probe out ------
[ 269.773910] st7789_driver register ok!
屏幕会清屏为白色:
卸载模块:
rmmod fb_st7789_spi
卸载后屏幕背光会关闭。
以上是关于i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)的主要内容,如果未能解决你的问题,请参考以下文章
i.MX6ULL驱动开发 | 13 - Linux SPI 驱动框架
i.MX6ULL驱动开发 | 13 - Linux SPI 驱动框架
i.MX6ULL驱动开发 | 14 - 基于 Linux SPI 驱动框架读取ICM-20608传感器
i.MX6ULL驱动开发 | 36 - 注册spilcd为framebuffer设备并使用lvgl测试