保姆级教程:在NanoPi NEO上点亮128x128的ST7735S SPI屏幕(基于Linux主线内核)
嵌入式Linux实战NanoPi NEO驱动ST7735S SPI屏幕全流程解析第一次拿到NanoPi NEO和那块小巧的ST7735S屏幕时我盯着密密麻麻的40针GPIO排针发了十分钟呆。作为嵌入式Linux新手SPI设备树配置、内核驱动移植这些概念听起来就像天书。但经过72小时的反复试错当128x128的像素点终于亮起时所有困惑都化为了解决问题的成就感。本文将用最直白的语言带你完整走通从硬件连接到自动加载的全过程。1. 硬件准备与环境搭建1.1 硬件清单检查在开始前请确保备齐以下硬件NanoPi NEO开发板全志H3芯片版本ST7735S SPI屏幕128x128分辨率5V/2A电源适配器屏幕背光需要足够电流杜邦线若干建议使用不同颜色区分功能注意市场上ST7735S屏幕有多种引脚定义务必确认你的屏幕引脚排列与下表一致屏幕引脚功能说明NanoPi NEO对应引脚VCC电源正极5V引脚2/4GND电源地GND引脚6/9等SCLSPI时钟线SPI0_CLKPC0SDASPI数据线SPI0_MOSIPC1RES复位信号PA3DC数据/命令PA17CS片选信号PG9BLK背光控制PA1可选1.2 开发环境配置推荐使用Ubuntu 20.04 LTS作为开发主机需安装以下工具链sudo apt update sudo apt install gcc-arm-linux-gnueabihf build-essential flex bison libssl-dev获取主线内核源码以5.10.y稳定版为例git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git -b linux-5.10.y cd linux2. 设备树深度配置2.1 SPI接口与GPIO定义在arch/arm/boot/dts/sun8i-h3-nanopi.dtsi中添加以下关键配置spi0 { status okay; pinctrl-names default; pinctrl-0 spi0_pins spi0_cs_pins; cs-gpios pio 6 9 GPIO_ACTIVE_HIGH; /* PG9作为片选 */ st7735s: st7735s0 { compatible sitronix,st7735s; reg 0; spi-max-frequency 32000000; rotate 90; buswidth 8; dc-gpios pio 0 17 GPIO_ACTIVE_HIGH; /* PA17 */ reset-gpios pio 0 3 GPIO_ACTIVE_HIGH; /* PA3 */ backlight backlight; }; }; pio { spi0_cs_pins: spi0_cs_pins { pins PG9; function gpio_out; }; };2.2 关键避坑指南HDMI冲突处理全志H3芯片的HDMI和SPI0存在资源冲突必须禁用HDMIhdmi { status disabled; }; sound_hdmi { status disabled; };背光控制优化添加背光节点实现亮度调节backlight: backlight { compatible gpio-backlight; gpios pio 0 1 GPIO_ACTIVE_HIGH; /* PA1 */ default-on; };3. 内核驱动移植实战3.1 驱动编译配置进入内核配置界面make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- sunxi_defconfig make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig按以下路径启用驱动Device Drivers → Staging drivers → Support for small TFT LCD display modules [M] FB driver for the ST7735S LCD controller [M] Support for SPI-connected displays3.2 分辨率参数调整修改drivers/staging/fbtft/fb_st7735s.c中的显示参数static const struct fbtft_display display { .width 128, .height 128, .regwidth 8, .init_sequence st7735s_init_sequence, };4. 系统集成与自动化4.1 手动加载测试编译并安装驱动模块后执行sudo insmod fbtft_device.ko namematrix-st7735s busnum0 gpiosreset:3,dc:17 rotate90 sudo insmod fb_st7735s.ko验证帧缓冲设备ls /dev/fb0 # 应返回设备节点 con2fbmap 1 /dev/fb0 # 将控制台输出到屏幕4.2 开机自动加载方案创建/etc/modules-load.d/fbtft.conffb_st7735s fbtft_device添加模块参数配置/etc/modprobe.d/fbtft.confoptions fbtft_device namematrix-st7735s busnum0 gpiosreset:3,dc:17 rotate90最后更新initramfssudo update-initramfs -u5. 高级调试技巧当屏幕出现花屏、偏移等问题时按以下步骤排查检查电源质量dmesg | grep -i under-voltage # 查看是否电源不足SPI信号质量用示波器检查SCLK频率是否≤32MHz缩短杜邦线长度建议10cm色彩异常处理 在设备树中添加RGB顺序参数st7735s: st7735s0 { rgb; bgr; };我在实际项目中遇到过屏幕上半部显示错位的问题最终发现是rotate参数与屏幕物理安装方向不匹配。通过调整设备树中的rotate值为0/90/180/270分别测试可以快速定位问题。