首页 > 系统相关 >orangepi zero2在linux5.4以上内核使用ili9341

orangepi zero2在linux5.4以上内核使用ili9341

时间:2024-05-24 10:40:44浏览次数:31  
标签:spi0 spi1 linux5.4 cells pinctrl fbtft spi zero2 orangepi

背景

根据orangepi zero2用户手册说明,linux5.13内核不能使用 modprobe fbtft_device 驱动spi lcd

查看linux内核源码提交记录,发现在v5.4-rc3中删除了fbtft_device.c文件

commit如下

staging/fbtft: Remove fbtft_device
Commit c440eee ("Staging: fbtft: Switch to the gpio descriptor
interface") removed the gpio code from fbtft_device rendering it useless.

fbtft_device is a module that was used on the Raspberry Pi to dynamically
add fbtft devices when the Pi didn't have Device Tree support.
Just remove the module since it's the responsibility of Device Tree, ACPI
or platform code to add devices.

Fixes: c440eee ("Staging: fbtft: Switch to the gpio descriptor interface")
Signed-off-by: Noralf Trønnes <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>

“fbtft_device用来在树莓派没有设备树时,自动添加fbtft设备,删除这个模块因为添加设备是设备树、ACPI或者平台代码的责任”

所以是因为原来的代码不符合设备和驱动分离的原则,所以给删除了,但其实驱动程序依然在,理论上只需要将设备硬件信息注册到内核,就可以正常运行了,可以通过设备树或者模块

dts

下面看下orangepi官方修改后的内核源码中的设备树,分支orange-pi-6.1-sun50iw9

https://github.com/orangepi-xunlong/linux-orangepi

sun50i-h616.dtsi

从芯片级(h616)的dts可以看到spi有spi0和spi1,spi0有一个cs0,spi1有cs0和cs1

			/omit-if-no-ref/
			spi0_pins: spi0-pins {
				pins = "PC0", "PC2", "PC4";
				function = "spi0";
			};

			/omit-if-no-ref/
			spi0_cs0_pin: spi0-cs0-pin {
				pins = "PC3";
				function = "spi0";
			};

			/omit-if-no-ref/
			spi1_pins: spi1-pins {
				pins = "PH6", "PH7", "PH8";
				function = "spi1";
			};

			/omit-if-no-ref/
			spi1_cs0_pin: spi1-cs0-pin {
				pins = "PH5";
				function = "spi1";
			};

			/omit-if-no-ref/
			spi1_cs1_pin: spi1-cs1-pin {
				pins = "PH9";
				function = "spi1";
			};

spi1设备只添加了cs1,cs0引脚没有用在spi1上,而是复用在了i2c3

		spi0: spi@5010000 {
			compatible = "allwinner,sun50i-h616-spi",
				     "allwinner,sun8i-h3-spi";
			reg = <0x05010000 0x1000>;
			interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
			clock-names = "ahb", "mod";
			resets = <&ccu RST_BUS_SPI0>;
			pinctrl-names = "default";
			pinctrl-0 = <&spi0_pins>;
			dmas = <&dma 22>, <&dma 22>;
			dma-names = "rx", "tx";
			status = "disabled";
			#address-cells = <1>;
			#size-cells = <0>;
		};

		spi1: spi@5011000 {
			compatible = "allwinner,sun50i-h616-spi",
				     "allwinner,sun8i-h3-spi";
			reg = <0x05011000 0x1000>;
			interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&ccu CLK_BUS_SPI1>, <&ccu CLK_SPI1>;
			clock-names = "ahb", "mod";
			resets = <&ccu RST_BUS_SPI1>;
			pinctrl-names = "default";
			pinctrl-0 = <&spi1_pins>, <&spi1_cs1_pin>;
			dmas = <&dma 23>, <&dma 23>;
			dma-names = "rx", "tx";
			status = "disabled";
			#address-cells = <1>;
			#size-cells = <0>;
		};

sun50i-h616-orangepi-zero2.dts

从板级(orangepi zero2)dts可以看到添加了一个spidev@1设备,但是默认未启用

&spi1 {
	status = "disabled";
	#address-cells = <1>;
	#size-cells = <0>;
	pinctrl-names = "default";
	pinctrl-0 = <&spi1_pins>, <&spi1_cs1_pin>;

	spidev@1 {
		compatible = "rohm,dh2228fv";
		status = "disabled";
		reg = <1>;
		spi-max-frequency = <1000000>;
	};
};

硬件

可以看到spi0用来连接NOR FLASH,所以肯定不可以再用来连接lcd了

spi1在26PIN引出,并且cs0和cs1都有,不过cs0复用在了i2c3的TWI3-SDA引脚上,所以我们使用spi1驱动lcd,并且使用cs1

硬件接线如下,实际上就是用户手册推荐的连接

dts替换

新建ili9341.dts文件

vim ili9341.dts

/dts-v1/;
/plugin/;

/ {
        fragment@0 {
                target = <&spi1>;
                __overlay__ {
                        status = "okay";
                        ili9341: ili9341@0 {
                                compatible = "ilitek,ili9341";
                                reg = <1>;
                                spi-max-frequency = <40000000>;
                                rotate = <0>;
                                bgr;
                                fps = <30>;
                                buswidth = <8>;
                                reset-gpios = <&pio 2 9 1>;
                                dc-gpios = <&pio 2 6 0>;
                                led-gpios = <&pio 2 5 0>;
                                debug = <0>;
                        };
                };
        };
};

替换设备树,执行后reboot

orangepi-add-overlay ili9341.dts

不出意外的话,console默认会显示在lcd上,可以使用fbi指令测试

su root
apt update
apt install fbi
fbi -vt 1 -noverbose -d /dev/fb0 /boot/boot.bmp

关于pinctrl-0和cs-gpios

使用cs-gpios定义片选信号使用的引脚,来自ChatGPT3.5

spi@40013000 {
    compatible = "some-vendor,spi-bus";
    reg = <0x40013000>;
    #address-cells = <1>;
    #size-cells = <0>;
    status = "okay";

    cs-gpios = <&gpio1 10 0>, <&gpio1 11 0>;  // 定义两个片选 GPIO

    spidev0: spidev@0 {
        compatible = "some-vendor,spidev";
        reg = <0>;  // 对应 cs-gpios 的第一个 GPIO (gpio1 10)
        spi-max-frequency = <10000000>;
        status = "okay";
    };

    spidev1: spidev@1 {
        compatible = "some-vendor,spidev";
        reg = <1>;  // 对应 cs-gpios 的第二个 GPIO (gpio1 11)
        spi-max-frequency = <10000000>;
        status = "okay";
    };
};

pinctrl-0已经包含了spi1_cs1_pin,所以spidev的reg直接使用1也可以找到,就不需要cs-gpios了

&spi1 {
	status = "disabled";
	#address-cells = <1>;
	#size-cells = <0>;
	pinctrl-names = "default";
	pinctrl-0 = <&spi1_pins>, <&spi1_cs1_pin>;

	spidev@1 {
		compatible = "rohm,dh2228fv";
		status = "disabled";
		reg = <1>;
		spi-max-frequency = <1000000>;
	};
};

标签:spi0,spi1,linux5.4,cells,pinctrl,fbtft,spi,zero2,orangepi
From: https://www.cnblogs.com/liteng0305/p/18209657

相关文章

  • 配置orangepi5pro运行rknn版本的yolov5
    摘要配置orangepi5pro运行rknn版本的yolov5,使用npu进行目标检测.关键信息板卡:orangepi5pro芯片:RK3588S环境:rknn2转换工具:rknn-tool-kit2:1.5.0系统:ubuntu20.04原理简介npu简介NPU(NeuralProcessingUnit,神经处理单元)是一种专门设计用于加速人工智能计算的硬件加......
  • 【CANN训练营笔记】OrangePI AIPro 体验手写体识别模型训练与推理
    CANN简介当我们谈到香橙派AIPro的时候,总会把她和昇腾生态关联起来,因为在昇腾芯片的加持下,这款开发板有着出色的算力,被众多开发者追捧。而谈到昇腾芯片,我们不得不提上层的AI异构计算架构CANN。异构计算架构CANN(ComputeArchitectureforNeuralNetworks)是华为针对AI场......
  • orangepi zero3 使用dd命令进行SD卡系统备份与还原
    1.使用dd命令备份整个sd卡首先使用df-h命令查看sd卡挂载名,如下所示,sd卡挂载为/dev/sdcmeng@meng:~/桌面/code$df-h文件系统大小已用可用已用%挂载点tmpfs1.6G2.9M1.6G1%/run/dev/sda339G18G20G48%/tmpfs......
  • 安卓逆向环境指北 rk3588 orangepi5b macM1 cuttlefish redroid
    省流安卓现在有若干种方案买个pixel6真机随便刷rom多,文档直接看google官方的即可缺点贵刷砖了难救windows的安卓模拟器傻瓜式部署但是安卓版本低特征多跑不了arm的soAVDwindowsormacorlinux有多个安卓版本但是基本没办法自定义内核想自定义内核再替换......
  • OrangePi 驱动开发基础教程
    OrangePi驱动开发基础教程准备工作实验材料:OrangePi开发板、sd卡。sd卡烧录Orangepi4-lts_3.0.6_ubuntu_jammy_desktop_xfce_linux5.18.5或Orangepi4-lts_3.0.6_ubuntu_focal_desktop_xfce_linux5.10.43版镜像(注意是带桌面的desktop版,否则无法方便地复制粘贴指令(除非通过串......
  • 树莓派zero2w
    树莓派Zero2W是一款微型计算机,它是在前一代Zero系列的基础上进行升级的。这款计算机非常小巧,但性能强大。它集成了BCM2710A1芯片和512MB的RAM,所有组件都单面放置,使得小小封装也能有如此高的性能。另外,它的散热设计也独具匠心,使用厚厚的内部铜层将热量从处理器传导出去,不用担心高......
  • 树莓派zero2w
    树莓派Zero2W是一款微型计算机,它是在前一代Zero系列的基础上进行升级的。这款计算机非常小巧,但性能强大。它集成了BCM2710A1芯片和512MB的RAM,所有组件都单面放置,使得小小封装也能有如此高的性能。另外,它的散热设计也独具匠心,使用厚厚的内部铜层将热量从处理器传导出去,不用担心高......
  • 树莓派zero2w
    树莓派Zero2W是一款微型计算机,它是在前一代Zero系列的基础上进行升级的。这款计算机非常小巧,但性能强大。它集成了BCM2710A1芯片和512MB的RAM,所有组件都单面放置,使得小小封装也能有如此高的性能。另外,它的散热设计也独具匠心,使用厚厚的内部铜层将热量从处理器传导出去,不用担心高......
  • 树莓派zero2w
    树莓派Zero2W是一款微型计算机,它是在前一代Zero系列的基础上进行升级的。这款计算机非常小巧,但性能强大。它集成了BCM2710A1芯片和512MB的RAM,所有组件都单面放置,使得小小封装也能有如此高的性能。另外,它的散热设计也独具匠心,使用厚厚的内部铜层将热量从处理器传导出去,不用担心高......
  • Orangepi.Zero2.IR 香橙派02的红外操作踩坑指南
    最近拿出了我吃灰已久的香橙派zero2,想着它有着红外功能,刚好最近买了一些红外遥控器,想着做些好玩的红外功能。首先是安装新系统,装的armbian最新的ubuntu22.04。搜索一下/dev文件夹,发现了lirc0这个设备,这个就是我要找的红外设备了。然后去lirc官网找红外教程。首先是安......