经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
orangepi zero2在linux5.4以上内核使用ili9341
来源:cnblogs  作者:新世纪摆烂战士  时间:2024/5/24 10:43:15  对本文有异议

背景

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

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

commit如下

  1. staging/fbtft: Remove fbtft_device
  2. Commit c440eee ("Staging: fbtft: Switch to the gpio descriptor
  3. interface") removed the gpio code from fbtft_device rendering it useless.
  4. fbtft_device is a module that was used on the Raspberry Pi to dynamically
  5. add fbtft devices when the Pi didn't have Device Tree support.
  6. Just remove the module since it's the responsibility of Device Tree, ACPI
  7. or platform code to add devices.
  8. Fixes: c440eee ("Staging: fbtft: Switch to the gpio descriptor interface")
  9. Signed-off-by: Noralf Tr?nnes <noralf@tronnes.org>
  10. Link: https://lore.kernel.org/r/20190917171843.10334-2-noralf@tronnes.org
  11. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

“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

  1. /omit-if-no-ref/
  2. spi0_pins: spi0-pins {
  3. pins = "PC0", "PC2", "PC4";
  4. function = "spi0";
  5. };
  6. /omit-if-no-ref/
  7. spi0_cs0_pin: spi0-cs0-pin {
  8. pins = "PC3";
  9. function = "spi0";
  10. };
  11. /omit-if-no-ref/
  12. spi1_pins: spi1-pins {
  13. pins = "PH6", "PH7", "PH8";
  14. function = "spi1";
  15. };
  16. /omit-if-no-ref/
  17. spi1_cs0_pin: spi1-cs0-pin {
  18. pins = "PH5";
  19. function = "spi1";
  20. };
  21. /omit-if-no-ref/
  22. spi1_cs1_pin: spi1-cs1-pin {
  23. pins = "PH9";
  24. function = "spi1";
  25. };

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

  1. spi0: spi@5010000 {
  2. compatible = "allwinner,sun50i-h616-spi",
  3. "allwinner,sun8i-h3-spi";
  4. reg = <0x05010000 0x1000>;
  5. interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
  6. clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
  7. clock-names = "ahb", "mod";
  8. resets = <&ccu RST_BUS_SPI0>;
  9. pinctrl-names = "default";
  10. pinctrl-0 = <&spi0_pins>;
  11. dmas = <&dma 22>, <&dma 22>;
  12. dma-names = "rx", "tx";
  13. status = "disabled";
  14. #address-cells = <1>;
  15. #size-cells = <0>;
  16. };
  17. spi1: spi@5011000 {
  18. compatible = "allwinner,sun50i-h616-spi",
  19. "allwinner,sun8i-h3-spi";
  20. reg = <0x05011000 0x1000>;
  21. interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
  22. clocks = <&ccu CLK_BUS_SPI1>, <&ccu CLK_SPI1>;
  23. clock-names = "ahb", "mod";
  24. resets = <&ccu RST_BUS_SPI1>;
  25. pinctrl-names = "default";
  26. pinctrl-0 = <&spi1_pins>, <&spi1_cs1_pin>;
  27. dmas = <&dma 23>, <&dma 23>;
  28. dma-names = "rx", "tx";
  29. status = "disabled";
  30. #address-cells = <1>;
  31. #size-cells = <0>;
  32. };

sun50i-h616-orangepi-zero2.dts

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

  1. &spi1 {
  2. status = "disabled";
  3. #address-cells = <1>;
  4. #size-cells = <0>;
  5. pinctrl-names = "default";
  6. pinctrl-0 = <&spi1_pins>, <&spi1_cs1_pin>;
  7. spidev@1 {
  8. compatible = "rohm,dh2228fv";
  9. status = "disabled";
  10. reg = <1>;
  11. spi-max-frequency = <1000000>;
  12. };
  13. };

硬件

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

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

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

dts替换

新建ili9341.dts文件

vim ili9341.dts

  1. /dts-v1/;
  2. /plugin/;
  3. / {
  4. fragment@0 {
  5. target = <&spi1>;
  6. __overlay__ {
  7. status = "okay";
  8. ili9341: ili9341@0 {
  9. compatible = "ilitek,ili9341";
  10. reg = <1>;
  11. spi-max-frequency = <40000000>;
  12. rotate = <0>;
  13. bgr;
  14. fps = <30>;
  15. buswidth = <8>;
  16. reset-gpios = <&pio 2 9 1>;
  17. dc-gpios = <&pio 2 6 0>;
  18. led-gpios = <&pio 2 5 0>;
  19. debug = <0>;
  20. };
  21. };
  22. };
  23. };

替换设备树,执行后reboot

orangepi-add-overlay ili9341.dts

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

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

关于pinctrl-0和cs-gpios

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

  1. spi@40013000 {
  2. compatible = "some-vendor,spi-bus";
  3. reg = <0x40013000>;
  4. #address-cells = <1>;
  5. #size-cells = <0>;
  6. status = "okay";
  7. cs-gpios = <&gpio1 10 0>, <&gpio1 11 0>; // 定义两个片选 GPIO
  8. spidev0: spidev@0 {
  9. compatible = "some-vendor,spidev";
  10. reg = <0>; // 对应 cs-gpios 的第一个 GPIO (gpio1 10)
  11. spi-max-frequency = <10000000>;
  12. status = "okay";
  13. };
  14. spidev1: spidev@1 {
  15. compatible = "some-vendor,spidev";
  16. reg = <1>; // 对应 cs-gpios 的第二个 GPIO (gpio1 11)
  17. spi-max-frequency = <10000000>;
  18. status = "okay";
  19. };
  20. };

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

  1. &spi1 {
  2. status = "disabled";
  3. #address-cells = <1>;
  4. #size-cells = <0>;
  5. pinctrl-names = "default";
  6. pinctrl-0 = <&spi1_pins>, <&spi1_cs1_pin>;
  7. spidev@1 {
  8. compatible = "rohm,dh2228fv";
  9. status = "disabled";
  10. reg = <1>;
  11. spi-max-frequency = <1000000>;
  12. };
  13. };

原文链接:https://www.cnblogs.com/liteng0305/p/18209657

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号