手把手教你为100ASK T113-S3核心板点亮SPI屏:设备树配置、内核编译到fb-test测试

发布时间:2026/5/19 18:15:32

手把手教你为100ASK T113-S3核心板点亮SPI屏:设备树配置、内核编译到fb-test测试 手把手教你为100ASK T113-S3核心板点亮SPI屏设备树配置、内核编译到fb-test测试在嵌入式Linux开发中驱动一块SPI接口的LCD屏幕是常见的硬件交互项目。本文将基于全志T113-S3平台和100ASK核心板详细讲解如何从零开始驱动ILI9341 SPI屏幕。不同于简单的操作步骤罗列我们会深入每个环节的技术细节包括引脚配置原理、设备树语法解析、内核驱动框架适配以及最终的测试验证方法。1. 硬件准备与原理分析在开始软件配置前必须明确硬件连接方案。T113-S3的SPI1控制器通过PD10-PD17引脚提供完整的SPI总线功能包括PD11: SPI1_CLK时钟信号PD12: SPI1_MOSI主机输出从机输入PD13: SPI1_MISO主机输入从机输出PD10: SPI1_CS片选信号PD16/PD17: 自定义GPIO用于LCD的DC和RESET控制ILI9341作为常见的SPI LCD控制器其通信协议特点包括// 典型SPI模式配置 spi-cpol; // 时钟极性1 spi-cpha; // 时钟相位1 buswidth 8; // 8位数据总线硬件连接时需特别注意确保核心板与LCD模块的电压等级匹配通常为3.3VSPI信号线建议串联22-100Ω电阻以减少信号反射若屏幕背光需要独立控制需额外配置PWM或GPIO电路2. 设备树深度配置指南设备树是Linux内核识别硬件的关键配置。对于T113-S3的SPI1接口需要分层配置2.1 引脚功能定义spi1_pins_a: spi10 { pins PD11, PD12, PD13, PD14, PD15; function spi1; drive-strength 10; // 驱动强度10mA }; spi1_pins_b: spi11 { pins PD10; function spi1; bias-pull-up; // CS引脚需要上拉 };2.2 ILI9341设备节点在SPI1节点下添加子设备ili93410 { compatible ilitek,ili9341; reg 0; // SPI设备编号 spi-max-frequency 32000000; // 最大32MHz dc-gpios pio PD 16 GPIO_ACTIVE_HIGH; reset-gpios pio PD 17 GPIO_ACTIVE_HIGH; rotate 90; // 屏幕旋转90度 bgr; // 颜色顺序BGR fps 30; // 帧率30fps status okay; };关键参数说明参数作用典型值spi-max-frequencySPI通信速率需小于屏幕规格书最大值rotate显示方向0/90/180/270bgr像素排列顺序启用表示BGR顺序fps刷新帧率影响流畅度和CPU负载3. 内核驱动编译与适配Linux 5.4内核已包含ILI9341的基础驱动但需要针对性配置3.1 Menuconfig配置路径Device Drivers → Staging drivers → Support for small TFT LCD display modules → FB driver for the ILI9341 LCD controller提示在menuconfig界面按/可快速搜索驱动选项3.2 驱动兼容性修改由于内核API变化需修改fbtft-core.c添加头文件#include linux/gpio.h #include linux/of_gpio.h更新GPIO请求函数static int fbtft_request_one_gpio(...) { // 使用devm_gpio_request_one替代旧接口 ret devm_gpio_request_one(dev, gpio, flags, dev-driver-name); *gpiop gpio_to_desc(gpio); // 转换为gpio_desc结构体 }修改复位时序控制static void fbtft_reset(struct fbtft_par *par) { gpiod_set_value_cansleep(par-gpio.reset, 1); msleep(10); gpiod_set_value_cansleep(par-gpio.reset, 0); msleep(200); // 复位脉冲宽度需大于10ms gpiod_set_value_cansleep(par-gpio.reset, 1); }4. 系统烧录与功能验证完成内核编译后通过以下步骤验证驱动4.1 启动日志分析dmesg | grep -i fb\|spi正常应看到类似输出[ 4.950907] graphics fb0: fb_ili9341 frame buffer, 320x240 [ 5.012345] spi1.0: ILI9341 ready, 32MHz SPI4.2 基础功能测试随机图案测试cat /dev/urandom /dev/fb0使用fb-test工具fb-test # 显示颜色渐变 fb-test-rect # 绘制几何图形4.3 性能优化技巧若出现显示残影或闪烁可调整fps 45; // 提高刷新率 spi-max-frequency 48000000; // 提升SPI时钟对于长时间运行的工业场景建议// 在驱动中添加电源管理 static const struct of_device_id ili9341_of_match[] { { .compatible ilitek,ili9341, .data ili9341_var }, {} }; MODULE_DEVICE_TABLE(of, ili9341_of_match);5. 进阶开发方向成功驱动基础显示后可进一步实现LVGL集成构建轻量级GUI框架// 示例初始化代码 lv_disp_drv_t disp_drv; lv_disp_draw_buf_init(draw_buf, buf1, buf2, screen_width*screen_height/4); lv_disp_drv_register(disp_drv);触摸功能扩展若屏幕支持触摸需额外配置touchscreen1 { compatible ti,ads7846; reg 1; spi-max-frequency 2000000; interrupt-parent pio; interrupts PD 18 IRQ_TYPE_EDGE_FALLING; };DMA传输优化减少CPU占用spi1: spi05010000 { dmas dma 22, dma 23; dma-names tx, rx; };在项目开发中遇到显示异常时建议按以下流程排查确认电源稳定测量VCC和背光电压检查SPI信号质量用逻辑分析仪抓取波形验证帧缓冲区数据通过hexdump /dev/fb0调整SPI模式参数cpol/cpha组合

相关新闻