【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

  • 背景
  • (一)spi设备树
    • 1、修改设备树
    • 2、完善设备树
  • (二)使能内核
  • (三)兼容性修改
  • (四)测试

背景

  • 本来想直接驱动mipi屏幕的,但是发现有一点点难度,所以想先研究一下小屏幕如何驱动。
  • 本文章使用的芯片为全志T113-s3,目前使用的核心板是100ask的,但是官方开发板上面的spi接口不齐全,所以自制了一块板子进一步学习。

(一)spi设备树

1、修改设备树

在原本的设备树中,配置是错误的,引脚都对不上,应该是参考D1-H的文档,然后拷贝过来的。
然后看了芯片的手册,引脚配置如下:

在 Function4 中有spi1相关的配置,从PD10到PD15
修改设备树 spi1 的引脚,如下:

 spi1_pins_a: spi1@0 {pins = "PD11", "PD12", "PD13","PD14", "PD15"; /*clk mosi miso hold wp*/function = "spi1";drive-strength = <10>;};spi1_pins_b: spi1@1 {pins = "PD10";function = "spi1";drive-strength = <10>;bias-pull-up;   // only CS should be pulled up};spi1_pins_c: spi1@2 {allwinner,pins = "PD10", "PD11", "PD12", "PD13","PD14", "PD15";allwinner,function = "gpio_in";allwinner,muxsel = <0>;drive-strength = <10>;};


此时spi总线已经配置好了

2、完善设备树

因为我们本次驱动的屏幕为ili9341,改屏幕的驱动已经在内核里,直接使能使用即可,但是我们要修改设备树,参考修改手册:

手册上说明,一定要配置
- compatible: "adafruit,yx240qv29", "ilitek,ili9341"
- dc-gpios: D/C pin
- reset-gpios: Reset pin
但是可以参考一下配置进行设置:
在 spi1 节点下:

ili9341@0{#address-cells = <1>;#size-cells = <1>;compatible = "ilitek,ili9341";reg = <0>;spi-max-frequency = <32000000>;dc-gpios = <&pio PD 16 GPIO_ACTIVE_HIGH>;reset-gpios = <&pio PD 17 GPIO_ACTIVE_HIGH>;rotate = <90>;spi-cpol;  //SPI引脚模式spi-cpha; //SPI引脚模式bgr;//颜色格式为RGBfps = <30>;buswidth = <8>;// backlight = <&backlight>;status = "okay";};

如下所示:

我们还用到了dc和rst引脚,这两个引脚可以随便找个io,但是不能和其他引脚冲突。
需要在pio节点下配置

 lcd_dc: lcd_dc{allwinner,pins = "PD16"; };lcd_rst: lcd_rst{allwinner,pins = "PD17"; };

如下所示:

此时已经将设备树修改完毕。

(二)使能内核

1、在内核目录下如 linux-origin_master ,输入make menuconfig 进入内核菜单设置页面

2、然后左斜杠 / 进入搜索,输入 ili9341,回车即可找到相关的驱动



然后使能该项(别问我怎么使能)

或者一步步找到该驱动

 Location:                                                                                                                             ││     -> Device Drivers                                                                                                                   ││       -> Staging drivers (STAGING [=y])                                                                                                 ││         -> Support for small TFT LCD display modules (FB_TFT [=y])

(三)兼容性修改

  • 对于比较高版本的内核比如我现在的5.4,如果直接编译的话,是使用不了屏幕的,因为内核在不断更新,但是对于屏幕的驱动,并没有及时更新,甚至这个驱动代码可能是八年前的代码。
  • 主要修改的文件为 fbtft-core.c
  • 参考路径:build/linux-origin_master/drivers/staging/fbtft/fbtft-core.c

1- 在 fbtft-core.c 添加头文件

#include "linux/gpio.h"
#include "linux/of_gpio.h"

2- 找到里面的 fbtft_request_one_gpio()函数,替换该函数的内容,修改后如下:

static int fbtft_request_one_gpio(struct fbtft_par *par,const char *name, int index,struct gpio_desc **gpiop)
{struct device *dev = par->info->device;struct device_node *node = dev->of_node;int gpio, flags, ret = 0;enum of_gpio_flags of_flags;if (of_find_property(node, name, NULL)) {gpio = of_get_named_gpio_flags(node, name, index, &of_flags);if (gpio == -ENOENT)return 0;if (gpio == -EPROBE_DEFER)return gpio;if (gpio < 0) {dev_err(dev,"failed to get '%s' from DT\n", name);return gpio;}//active low translates to initially lowflags = (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW :GPIOF_OUT_INIT_HIGH;ret = devm_gpio_request_one(dev, gpio, flags,dev->driver->name);if (ret) {dev_err(dev,"gpio_request_one('%s'=%d) failed with %d\n",name, gpio, ret);return ret;}*gpiop = gpio_to_desc(gpio);fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' = GPIO%d\n",__func__, name, gpio);}return ret;
}

3- 找到里面的 fbtft_request_gpios_dt()函数,替换该函数的内容,修改后如下:

static int fbtft_request_gpios_dt(struct fbtft_par *par)
{int i;int ret;ret = fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset);if (ret)return ret;ret = fbtft_request_one_gpio(par, "dc-gpios", 0, &par->gpio.dc);if (ret)return ret;ret = fbtft_request_one_gpio(par, "rd-gpios", 0, &par->gpio.rd);if (ret)return ret;ret = fbtft_request_one_gpio(par, "wr-gpios", 0, &par->gpio.wr);if (ret)return ret;ret = fbtft_request_one_gpio(par, "cs-gpios", 0, &par->gpio.cs);if (ret)return ret;ret = fbtft_request_one_gpio(par, "latch-gpios", 0, &par->gpio.latch);if (ret)return ret;for (i = 0; i < 16; i++) {ret = fbtft_request_one_gpio(par, "db-gpios", i,&par->gpio.db[i]);if (ret)return ret;ret = fbtft_request_one_gpio(par, "led-gpios", i,&par->gpio.led[i]);if (ret)return ret;ret = fbtft_request_one_gpio(par, "aux-gpios", i,&par->gpio.aux[i]);if (ret)return ret;}return 0;
}

4- 找到里面的 fbtft_reset()函数,替换该函数的内容,修改后如下:

static void fbtft_reset(struct fbtft_par *par)
{if (!par->gpio.reset)return;fbtft_par_dbg(DEBUG_RESET, par, "%s()\n", __func__);gpiod_set_value_cansleep(par->gpio.reset, 1);msleep(10);gpiod_set_value_cansleep(par->gpio.reset, 0);msleep(200);gpiod_set_value_cansleep(par->gpio.reset, 1);msleep(10);
}

修改完以上三个函数,就可以编译内核和buildroot。后续步骤省略。

(四)测试

1、接线
按照屏幕的接线方案进行接线,一一对应就好没啥好说的。
2、上电
上电之后屏幕由白到黑,应该是驱动加载成功了。
3、查看启动时的内核信息

# dmesg | grep "fb"
[    4.470009] fbtft_of_value: buswidth = 8
[    4.474498] fbtft_of_value: rotate = 90
[    4.478946] fbtft_of_value: fps = 30
[    4.950907] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=33, spi1.0 at 32 MHz

4、花点测试(随机填充)

 cat /dev/urandom > /dev/fb0

5、自带工具测试

# fb-test
fb-test 1.1.1 (rosetta)
fb res 320x240 virtual 320x240, line_len 640, bpp 16

现象如下:

# fb-test-rect
rect 1.1.1 (rosetta)

现象如下:

至此,屏幕驱动完毕。可以进一步研究c语言驱动屏幕,或者lvgl驱动。

END.

【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341相关推荐

  1. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核

    ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...

  2. Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核)

    Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核) 文章目录 Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4 ...

  3. Linux内核的Nand驱动流程分析

    最近在做Linux内核移植,总体的感觉是这样的,想要彻底的阅读Linux内核代码几乎是不可能的,至少这还不是嵌入式学期初期的重要任务.内核代码解压后有250M左右,据统计,有400多万行,而且涉及到了 ...

  4. 【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341

    [全志T113-S3_100ask]15-2 linux系统gpio模拟spi驱动屏幕--ILI9341 背景 (一)查阅参考文档 (二)使能内核模块 (三)修改设备树 (四)测试 (五)后语 背景 ...

  5. linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset

    Linux内核之设备驱动-底层数据结构kobject/kset kobject kobject是组成device.driver.bus.class的基本结构.如果把前者看成基类,则后者均为它的派生产物 ...

  6. 移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植

    移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植的过程记录下来: (1)首先打一个补丁:s3c2410_touchscreen.patch, 在内核解压的根目录下 patch -N ...

  7. STM32CUBEIDE(15)----移植兆易创新SPI Nor Flash之GD25Q64Flash

    spi概述 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的 ...

  8. [linux kernel] 内核下ksz8081驱动调试

    系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 - ...

  9. 解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面

    解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面 关闭unattended-upgrade 在/etc/apt/apt.conf.d目录下,查找包含Unattended- ...

最新文章

  1. Python 14.1 TCP/IP协议简介
  2. Zencart获取PayPal PDT Token参数教程方法
  3. trl meaning genearlly we find 6
  4. Python数据结构与算法--数据类型
  5. yii框架cookie写入与读取方法
  6. 开关电源之PCB安规设计规范
  7. InnoDB在MySQL默认隔离级别下解决幻读
  8. Throwable类
  9. 计算机大写改成拼音形式,拼音转换
  10. Java项目(一):家庭收支记账软件
  11. odin学习3之numbers
  12. 蚂蚁金服首席架构师:区块链技术如何促进数字普惠金融
  13. 史上最长的介绍BI(商业智能)的干货
  14. BZOJ 1507 Editor
  15. 同时采集抖音里多个视频,并批量添加相同的背景图片
  16. 第五章: 项目范围管理
  17. 零基础入门数据挖掘之金融风控-贷款违约预测
  18. input光标位置设置至行末端
  19. 推荐十本C#编程的最佳书籍
  20. 【LeetCode】127. Word Ladder 解题报告(Python)

热门文章

  1. 关于射线检测与碰撞检测
  2. 抖音怎么实现落地页跳转微信加好友?
  3. ImportError: cannot import name ‘XXXA‘ from ‘XXXB‘
  4. 坚果云同步的HTML编辑器,我的浏览器标签同步方案:坚果云+Floccus
  5. CRM管理系统带给企业五大实际效益
  6. C语言实验:打印日历
  7. 英特尔AVX指令集解析
  8. 使用nose进行python自动化测试
  9. Linux 扩大内存采用扩大SWAP文件方法
  10. 关于BIRT的一些认识