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

这篇具有很好参考价值的文章主要介绍了【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

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

(一)spi设备树

1、修改设备树

在原本的设备树中,配置是错误的,引脚都对不上,应该是参考D1-H的文档,然后拷贝过来的。
然后看了芯片的手册,引脚配置如下:
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
在 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>;
	};

【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
此时spi总线已经配置好了

2、完善设备树

因为我们本次驱动的屏幕为ili9341,改屏幕的驱动已经在内核里,直接使能使用即可,但是我们要修改设备树,参考修改手册:
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——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;//颜色格式为RGB
        fps = <30>;
        buswidth = <8>;
        // backlight = <&backlight>;
		status = "okay";
    };

如下所示:
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
我们还用到了dc和rst引脚,这两个引脚可以随便找个io,但是不能和其他引脚冲突。
需要在pio节点下配置

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

如下所示:
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

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

(二)使能内核

1、在内核目录下如 linux-origin_master ,输入make menuconfig 进入内核菜单设置页面
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
2、然后左斜杠 / 进入搜索,输入 ili9341,回车即可找到相关的驱动

【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——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 low
        flags = (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

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

5、自带工具测试

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

现象如下:

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

# fb-test-rect
rect 1.1.1 (rosetta)

现象如下:
【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

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

END.文章来源地址https://www.toymoban.com/news/detail-437424.html

到了这里,关于【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【全志V3s】SPI NAND Flash 驱动开发

    芯片:W25N01GVZEIG datasheet上的描述: SLC工艺 2KB*65536页 10万次擦写次数 焊好以后用CH341A读了一下 上面这张图描述了soc启动的四个顺序,分别是usb启动、sd卡启动、spi norflash启动、spi nandflash启动四种方式。前面的测试中一直走的是sd卡启动,但是从成本和稳定性上说,spi nandfla

    2024年02月07日
    浏览(32)
  • 全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数

    2024年02月14日
    浏览(31)
  • 全志F1C200S嵌入式驱动开发(spi-nand驱动)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         和v3s一样,f1c200s也支持tf卡、spi-nor、spi-nand启动。前面也说过,tf卡由于机械结构的原因,更适合拿来学习,spi-nor和spi-nand比较适合用来进行工业部署和消费娱乐领域。只是spi-nor容量

    2024年02月16日
    浏览(44)
  • 全志 Tina Linux LCD显示屏调试指南 支持MIPI DSI RGB LVDS I8080 SPI等接口,开发板支持百问网T113 D1-H哪吒 DongshanPI-D1s V853

    编写目的 本文档将介绍sunxi 平台Display Engine 模块中LCD 的调试方法。 LCD 调试方法,调试手段。 LCD 驱动编写。 lcd0 节点下各个属性的解释。 典型LCD 接口配置。 适用范围:sunxi 平台DE1.0/DE2.0 中LCD 屏幕参数设置。 表2-1: LCD 相关术语 术语 解释说明 SUNXI Allwinner 一系列SoC 硬件平台

    2024年02月02日
    浏览(33)
  • ESP32S3系列--SPI主机驱动详解(一)

    SPI是一种串行同步接口,可用于与外围设备进行通信。 ESP32S3自带4个SPI外设,其中SPI0/SPI1内部专用,共用一组信号线,通过一个仲裁器访问外部Flash和PSRAM;SPI2/3各自使用一组独立的信号线;开发者可以使用SPI2/3控制外部SPI从设备(Slave device);其中SPI2作为主设备有6个片选,数据

    2023年04月09日
    浏览(34)
  • 全志V3S嵌入式驱动开发(屏幕花屏问题的解决)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         之前我们测试过lcd屏幕驱动以及触控驱动时,当时确实是成功的。但是由于这个屏幕是直接从旗舰店买的,价格略贵,有点超出成本。后来,陆陆续续从其他店家买了3块lcd,测试的时

    2024年02月09日
    浏览(42)
  • 全志V3S嵌入式驱动开发(spi-nor image制作)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         其实,我们之前就讨论过怎么把image烧入到v3s的spi-nor当中去。当时使用的方法是借助于sunxi-fel工具,烧入的image也比计较小,只是一个uboot bin文件。今天,我们就来讨论一下,一个完整

    2024年02月11日
    浏览(28)
  • 全志F1C200S嵌入式驱动开发(spi-nor image制作)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         一般soc系统里面添加spi-nor flash芯片,特别是对linux soc来说,都是把它当成文件系统来使用的。spi-nor flash和spi-nand flash相比,虽然空间小了点,但是胜在稳定,这是很多工业场景所必须

    2024年02月16日
    浏览(31)
  • 荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示bmp图片

    了解 framebuffer 字符设备 了解 bmp图片格式 通过操作 /dev/fb0 字符设备来实现在 RGB LCD 屏幕上显示 bmp 图片。 显示设备例如 LCD,在 Linux 中用 Framebuffer 来表征, Framebuffer 翻译过来就是帧缓冲,简称 fb,在 /dev 目录下显示设备一般表示成这样: /dev/fbn ,应用程序通过访问这个设备

    2024年02月11日
    浏览(33)
  • FPGA驱动SPI屏幕(附完整工程)

    相信大家都玩过屏幕,在FPGA上使用最多的就是VGA/HDMI接口的显示器了,这两种显示器的优点就不用说了,缺点就是体积比较大,而且价格比较贵,对于追求便携/价格低的我来说,SPI接口的屏幕才是我的首要选择,而且一般是可以带触摸的哦。 后面图像处理相关的代码都会基于

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包