This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM3352:将 TFT 屏幕与需要 SPI 配置的并行 RGB 接口集成

Guru**** 2540720 points
Other Parts Discussed in Thread: AM3352, TPS65217

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/609199/linux-am3352-integration-of-tft-screen-with-parallel-rgb-interface-needing-spi-configuration

器件型号:AM3352
主题中讨论的其他器件: TPS65217DA8XX

工具/软件:Linux


你(们)好

我一直在探索这里(以及其他地方)的论坛、尝试了解如何以最佳方式驱动我们的 LCD 显示屏。

该板是定制的、但严格基于 BeagleBone Black。
该显示屏使用 Ilitek9340驱动程序、接口分为两部分;我很难在器件树中定义。

它是在 Ilitek 数据表所称的"3线9位串行接口"模式中配置的;即半双工 SPI 模式。
该串行接口应用于配置芯片、然后应通过并行 RBG 接口驱动图像数据本身。 如有必要、可以将该 RGB 接口设置为具有 DataEnable (DE)行。

从我对这一点的深入了解来看、这种情况似乎并不罕见(不幸的是、这种情况也不会有困难!)

我的希望是,我可以界定这两个方面:
-SPI 总线上的 LCD 设备,在 ili9340驱动程序中运行初始化过程
-提供必要显示的面板

我定义的 SPI 器件为:

&SPI1{
status ="确定";
pinctrl-names ="默认值";
pinctrl-0 =<&SPI1_PINs>;

LCD@0{
compatible ="ilitek、ili9340";
reg =<0>;
SPI-max-frequency =<24000000>;
rotate =<90>;
fps =<30>;

总线宽度=<9>;
宽度=<240>;
高度=<320>;

RESET-GPIO =<&GPIO3 19 GPIO_ACTIVE_LOW>;

};
}; 

面板:

Panel{
compatible ="ti、tilcdc、panel ";
pinctrl-names ="default"、"sleep";
pinctrl-0 =<&lcd_pins_default>;
pinctrl-1 =<&lcd_pins_sleep>;
状态="正常";
使能 GPIO =<&GPIO2 25 0>;
电池板信息{
AC-BIAS =<255>;
AC-BIAS-INIpt =<0>;
DMA-BURST-SZ =<16>;
bpp =<32>;
FDD =<0x80>;
sync-edge =<0>;
sync-Ctrl =<1>;
光栅顺序=<0>;
fifo-th =<0>;
};
显示时序{
240x320}
{时钟频率=<6350000>;/* 6.35MHz */
hactive =<240>;
vactive =<320>;
前沿=<10>;
后沿=<20>;
HSYNC-len =<10>;
vback-clen =<2>;
vfront-clen =<2>;
vsync-len =<2>;
HSYNC-active =<0>;
vsync-active =<0>;
去激活=<1>;
像素时钟激活=<1>;
};
};
}; 

我将用于这两种模式的 pinmux 为:

LCD_PINS_DEFAULT:LCD_PINS_DEFAULT{
pinctrl-single、PINS =<
0xa0 (PIN_OUTPUT | MUX_MODE0)/* DB0 LCD_Data0.LCD_Data0 *
/ 0xa4 (PIN_OUTPUT | MUX_MODE0)/*DB1* DB1LCD_2 LCD_4

* 0xa0_MR_4 *输出|DM4 (MR_4)/DBAULCD_4 * DMAULCD_4 (MR_4


(PIN_OUTPUT | MUX_MODE0)/* DB6 LCD_data6.LCD_data6 *
/ bb (PIN_OUTPUT | MUX_MODE0)/* DB7 LCD_data7.LCD_data7 *
/ 0xc0 (PIN_MODE0)/* DB8 LCD_DAD0_MR_0*

0x8
(
* D0_DMUX_DMUX8)* 0xDRAC12_MODE8 */DMUX_DMAD0_MR_0_MR_0*/0xD12_DMUX8 (0xD8引脚/DMUX8)/DMUX8
(PIN_OUTPUT | MUX_MODE0)/* DB13 LCD_data13.LCD_data13 */
0xd8 (PIN_OUTPUT | MUX_MODE0)/* DB14 LCD_data14.LCD_data14 */
0xDC (PIN_OUTPUT | MDB15 LCD_MODE0)/* SYDB14_SYNC_MR_MR_MR1*
/0x430_MR1*

输出

(PIN_OUTPUT 下拉| MUX_MODE0)/* DOTCLK LCD_pclk.LCD_pclk */
0xec (PIN_OUTPUT 下拉| MUX_MODE7)/* DE LCD_AC_BIAS_EN.GPIO*
;
};

SPI1_PIN: PLUX_SPI1*
(0x108_MODE1




)*单引脚/0x104_MODEUX_INPULLUM*(0x105_MOUX_INPULL)*(0x105_MOUX_INPULTRA_MOUX_1*)*(0x104_MOUX_1M1*)*(0xSPION_MOUX_PULTRA_MOUX_PULTRA_MOUX_1*)*)*(0x104_PULTRA_PULTRA_MOUX_INPUT)*(0x108/1)*(0xM1*(0x104_MOUX_PON_MOUX_PON

我可以看到通过 SPI 发送到的字节:此时复位和 CS 看起来合适(分别为 HI 和 LO)

这是使用正常的4线制模式;只是不需要任何回路、这应该足以进行配置。

我从未在视频线上看到任何情况

我可以从 fb_ili9340中看到/dev/fb0
和节点

/proc/device-tree/panel
/proc/device-tree/ocp/spi@481a0000/LCD@0 

我想我还期待着面板的另一个帧缓冲区:我是否需要在 DTS 中定义其他内容才能显示?

完整的 dmesg 位于:  e2e.ti.com/.../1106.kernel_5F00_log.txt

我希望可能有人具有这种屏幕的经验、可以提供一些建议。

从深入了解 fbtft_device 驱动程序开始、我们希望能够支持具有 GPIO 并行 TFT 以及 SPI 初始化序列的 DTS 条目:这是更好的实现方法吗?

谢谢阅读-欢迎您提出任何建议。
此致、
Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、

    从内核日志中、我可以看到这是内核4.4.19。 这是 TINDK 还是社区版?

    在共享设备树设置中、我无法看到 LCDC 已启用。 请尝试添加状态为"确定"的 LCDC。 类似如下:
    LCDC{
    状态="正常";

    /*如果您希望获得24位 RGB 和16 BGR 模式,而不是
    *当前16位 RGB 和24 BGR 模式、设置相应的参数
    *将下面的更改为"交叉"并取消注释 VIDEA-PORTS -PRO属性
    *在 tda19988节点中。
    *
    蓝色和红色配线="直向";

    端口{
    LCDC_0:端点@0{
    远程端点=<&HDMI_0>;
    };
    };
    };

    当然、您需要更改端点或完全删除 DTS 节点的端口部分。

    我将检查您所附的日志、并使用我的反馈进行更新。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    感谢您的回复;这是 TISDK (已经有几个月了、我可能应该看看更新)

    我今天早些时候注意到、我需要启用 LCDC、实际上、在执行此操作后、我可以看到两个帧缓冲器:

     -未显示图像、但我可以在 PIN 上看到一些活动(尽管我尚未全面检查它们是否合理)

    DMA 端口方面使我感到困惑: 如果我通过 am3352上的引脚直接驱动显示器(因为没有远程端点)、我认为我不需要端口输入? 但同时导线另一端有一个 i9340。

    目前、我正在研究用于 ili9340芯片的不同启动序列、以精确确定我需要的配置。

    例如、似乎有交流偏置的参考-但显示屏上没有用于交流偏置的引脚

    我还有很多阅读要做的事情、还有很多事情要我四处走动、但感觉我正在开始取得进展。

    欢迎收到任何建议。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将查看此内容、并使用我的任何其他反馈进行更新。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Yordan

    我在过去的几天内查看了相关器件的数据表、并将其与预期的操作进行了比较。

    我们打算在18位模式下使用该面板并使用数据使能线:这是显示器的默认设置。

    要使用的信号为:
    HSYNC -低电平有效、
    Vsync -低电平有效、
    ENABLE -需要为 HI 才能获得有效像素、
    DOTCLK -在上升沿运行、
    数据[17:0]

    TPS65217的灌电流上连接了一个背光、我们将其用作 PMIC。

    当前的设备树条目如下所示:

    面板{
    兼容="ti、tilcdc、panel ";
    标签="lcd";
    
    pinctrl-names ="default"、"sleep";
    pinctrl-0 =<&LCD_PINS_DEFAULT>;
    pinctrl-1 =<&LCD_PINS_SLEEP>;
    //backlight =<&LCD_backlight>;
    状态="正常";
    ENABLE-GPIO =<&GPIO2 25 GPIO_ACTIVE_HIGH_>;
    
    面板信息{
    交流偏置=<255>;
    AC-BIAS-INtrpt =<0>;
    dma-burse-SZ =<16>;
    bpp =<32>;
    FDD =<0x80>;
    同步边沿=<0>;
    SYNC-Ctrl =<1>;
    栅格顺序=<0>;
    FIFO-TH =<0>;
    };
    
    显示时序{
    本机模式=<&timing0>;
    ting0:240x320{
    时钟频率=<6350000>;/* 6.35MHz *
    
    /*显示时序可支持范围*/
    /*数据表中的最小值-典型值-最大值*/
    HSYNC-LEN =<2 10 16>;
    后沿=<2 20 24>;
    hactive =<240>;
    前沿=<2 10 16>;
    vsync-len =<1 2 4>;
    后沿=<2>;
    vactive =<320>;
    垂直前沿=<4>;
    
    HSYNC-ACTIVE =<0>;
    vsync-active =<0>;
    停用=<1>;
    
    像素时钟激活=<1>;
    };
    
    };
    
    };
    // snip
    
    &lcdc{
    status ="确定";
    }
    
    ;&i2c0{
    status ="确定";
    时钟频率=<400000>;
    
    TPS:TPS@24{
    reg =<0x24>;
    status="确定";
    
    LCD_背 光:背光{
    status="确定";
    ISEL =<1>;/* 1 - ISET1、2 ISET2 */
    fdim =<100>;// TPS65217_BL_FDIM_100Hz *
    默认亮度=<50>;
    };
    };
    }
    
    ;&SPI1{
    状态="确定";
    pinctrl-names ="默认值";
    pinctrl-0 =<&SPI1_PINs>;
    
    LCD@0{
    兼容="ilitek、ili9340";
    reg =<0>;
    SPI-max-frequency =<24000000>;
    旋转=<90>;
    FPS =<30>;
    
    总线宽度=<9>;
    宽度=<240>;
    高度=<320>;
    
    RESET-GPIOs=<&GPIO3 19 GPIO_ACTIVE_LOW>;
    
    };
    };
    

    我认为这应该几乎就在那里(但我又这么做了一段时间!) ——我仍在面对一些问题:

    我已在 menuconfig 中启用 tps65217背光
    -插入 printks 我可以看到我通过了 tps65217_BL 探针末尾的"return 0"

    [2.840018] tps65217-BL tps65217-BL:背光已禁用
    [2.879403]背光:backlight_device_register:name=tps65217-BL
    [2.920042] tps65217-BL tps65217-BL:背光已启用
    [14.463514]背光:将亮度设置为50

    所以我认为它应该可用

    尽管我没有看到任何照明  

    如果我尝试在面板描述符中引用、则面板启动永远不会完成(它找不到背光)。

    -绑定它的正确方法是什么?

    用示波器偷东西
    我可以看到:
    - 6.410MHz (156ns)时的 DATACLOCK
    - HSYNC 线路脉冲在1.6uS evey 44uS 时为低电平
    VSYNC 每14.4ms 变为低电平80us
    - DE 线路保持高电平-因此所有数据都应传输

    我希望必须在电池板信息中将 bpp 设定为18
    但是、如果我得到的误差 fb & CRTC 宽度不匹配、那么我已经将其设置为32位

    错误是的  

    在次要0
    [30.792805] tilcdc 4830e000.lcdc:无效间距:FB 和 CRTC 宽度必须相同时、[1.419845][DRM]初始化 tilcdc 1.0.0 20121205 

    -将 bpp 设置为32是正确的还是有一些较低级别的不匹配发生了?

    我问、因为我可以看到代码不同部分描述了各种不同的面板:例如:panel_dpi
    较旧的 ftft 驱动程序还支持从 DTS 中显式定义各种 GPIO
    不过,我更喜欢使用任何最适合未来发展的方法

    再次感谢您提出的任何想法/建议或意见。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Yordan

    我的最后一个帖子似乎正在等待审核:

     希望很快就能与您在一起

    再次感谢您提出的任何想法/建议或意见。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是我上次启动的 dmesg:

    e2e.ti.com/.../4274.dmesg.txt

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    [引用]-将 bpp 设置为32是否正确、或者是否存在一些较低级别的不匹配?[/引用]
    我认为这是 tilcdc_panel 驱动程序中发生的较低级别的不匹配:
    DRM_fb_get_bpp_depth (state->fb->Pixel_format、&depth、&bpp);
    if (state->fb->pines[0]!= CRTC_state->mode.hdisplay * bpp / 8){
    DEV_ERR (平面->DEV->DEV、
    "无效间距:FB 和 CRTC 宽度必须相同");
    return -EINVAL;

    值得在 CRTC 驱动程序中进一步挖掘:
    DRM_CRTC、OMAP_CRTC、tilcdc_CRTC

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Yordan

    它看起来不像 LCD 驱动程序的光栅模式支持18位模式

    我想我需要将此面板配置为16位模式(丢失红色和蓝色通道的 LSBit)

    -这应该是好的。

    在我对显示屏执行进一步操作之前、似乎需要解决几个硬件问题:希望一旦这些问题得到解决、显示屏就应该准备就绪

    祝你一切顺利、

    Richard

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您更新该主题。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好
    硬件已修复、因此我返回尝试在此显示屏上取得一些进展。

    目前的情况是:
    在/dev/中、我有两个帧缓冲区:
    -/dev/fb0来自 tilcdc

    [1.35595] tilcdc 4830e000.lcdc:fb0:帧缓冲器设备
    [1.389772][DRM]在次要0上初始化 tilcdc 1.0.0 20121205 

    - fb_ili9340中的/dev/fb1 (该驱动程序仅用于向显示屏发送 init 命令)

    [3.690003]图形 fb1:FB_ili9340帧缓冲器、240x320、150 KiB 视频存储器、4 KiB DMA 缓冲器存储器、fps=33、spi2.0、24MHz 

    在/sys/class/graphics 中、我还看到了 fbcon

    root@am335x-evm:/sys/class/graphics ls -l /sys/class/graphics
    lrwxrwxrwxrwx 1 root root 用户0 oct 3 21:05 fb0 ->../../devices/platform/ocp/4830e000.lcdc/graphics/fb0
    lrwxrwxrwxrwx 1 root 用户0 oct 3 21:05 fb1 ->../../devices/platform/ocp/481a0000.spi/spi_master/spi2/spi2.0/graphics/fb1
    lrwxrwxrwxrwx 1 root 用户0 root 用户0 oct 3 21:05 fb1 -> root 用户1 /../devices/virtual/graphics/fbcon root 用户0 fb10月21:0c。b10月21:0c root 用户3:0 

    通过我的显示屏线路上的示波器进行探测、我可以看到:HSYNC、VSYNC、PIXELCLOCK、DATAENABLE 全部具有活动状态、但所有数据线路都是低电平

    -即使我在/dev/fb0中有随机信息(例如通过 cat /dev/random >/dev/fb0)
    -我可以将 fb0的内容转储到控制台,并看到它们是随机的

    因此、当前的问题似乎是 从/dev/fb0到 LCD 线路上的连接问题

    设备树条目如下所示:

    Panel{
    compatible ="ti、tilcdc、panel ";
    label ="lcd";
    
    pinctrl-names ="default";
    pinctrl-0 =<&lcd_pins_default>;
    //backlight =<&lcd_backlight>;
    状态="正常";
    使能 GPIO =<&GPIO2 25 GPIO_ACTIVE_HIGH_>;
    
    电池板信息{
    AC-BIAS =<255>;
    AC-BIAS-INIPT =<0>;
    DMA-BURST-SZ =<16>;
    bpp =<24>;
    FDD =<0x80>;
    sync-edge =<0>;
    sync-Ctrl =<1>;
    光栅顺序=<0>;
    fifo-th =<0>;
    };
    
    显示时序{
    native-mode =<&ting0>;
    ting0:240x320{
    clock-frequency =<6350000>;/* 6.35MHz */
    
    HSYNC-len =<10>;
    后沿=<20>;
    hactive =<240>;
    前沿=<10>;
    vsync-len =<2>;
    
    vBack-Porch =<2>;
    vactive =<320>;
    vFront-Porch =<4>;
    
    HSYNC-ACTIVE =<0>;
    vsync-active =<0>;
    去激活=<1>;
    
    像素时钟激活=<1>;
    };
    
    };
    
    };
    };
    
    &LCDC{
    status ="确定";
    ti、allow-non-Reduce-Blank-modes;
    };
    
    

    modetest 显示没有帧缓冲器

    root@AM335x-evm:/sys/class/graphics/fb0尝试
    打开设备'i915'失败...
    尝试
    打开设备'Radeone'失败...尝试打开设备'nouve'失败...
    尝试打开设备'vmwgfx'失败...
    尝试打开设备'omapdrm'失败...
    尝试打开设备'exynos'失败...
    尝试打开设备'vmmc'失败...
    尝试打开设备'moder'失败...完成:
    ID CRTC 类型可能的 crtcs 可能克隆
    25 24 LVDS 0x00000001 0x00000000
    
    连接器
    :ID 编码器状态名称大小(mm)模式编码
    器26 25已连接 LVDS-1 0x0 1 25
    模式:
    名称刷新(Hz) hdisp HSS HSE htot vdisp VSS VSE vtot)
    240x320 69 240 250 260 280 320 324 326 328个标志:nhsync、nvsync;类型:首选、驱动
    程序提示:
    1 EDID:
    标志:不可更改的 BLOB
    标志:
    
    值:
    2 DPMS:
    标志:枚枚枚枚枚举
    枚举枚举枚举枚举枚举枚举枚举:ON=0 =待机
    
    
    3枚举:挂起
    ID fb pos 大小
    24 29 (0、0)(240x320)
    240x320 69 240 250 260 320 324 326 328标志:nhsync、nvsync;类型:首选、驱动
    程序道具:
    
    平面:
    ID CRTC fb CRTC x、y x、y gamma 大小可能的 crtcs
    23 24 29、0、0、0、0、0x01
    格式:XR24 ARprops
    
    :类型:5:
    枚举枚
    举枚举枚举枚举:overlay=0 Primary =1 Cursor =2
    值:1
    
    帧缓冲器:
    ID 大小间距
    
    

    Fbset 显示

    root@AM335x-EVM:~# fbset
    
    模式"240x320"
    几何形状240 320 240 320 24
    时序0 0 0 0 0 0 0
    0 accel TRUE
    RGBA 8/16、8/8、8/0、0/0
    端模式
    
    /
    
    

    从内核 menuconfig I cab 中确认:

    符号:FB_DA8XX [=n]
    符号:DRM [=y]
    符号:DRM_I2C_NXP_TDA998X [=y]
    符号:DRM_TILCDC [=y]
    符号:DRM_TILCDC_SLAVE_COMPAT [=y] 

    在我看到帧缓冲器的情况下、我看到控制线活动、我认为我需要将面板绑定到 LCDC?

    LCD 控制器用户指南提到了我找不到的 Documentation/devicetree/bindings/sideo/da8xx_fb.txt?

    我一直在浏览 wiki 中的各种资源以获取线索:
    processors.wiki.ti.com/.../Linux_Core_LCD_Controller_User_Guide
    processors.wiki.ti.com/.../Graphics_Display_Getting_Started_Guide
    processors.wiki.ti.com/index.php
    processors.wiki.ti.com/index.php

    提到了各种不同的可能实现方案、也许我需要使用较旧的 fbdev 样式的驱动程序?  

    我们很高兴收到有关如何调查 LCDC 与帧缓冲区之间的连接(以及数据为何未出现在线路上)的任何建议。

    祝你一切顺利、
    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    快速更新现在我已经完成了

    前面发布的面板设置足以实例化器件和帧缓冲节点:这些将在 LCD 信号上获取数据

    SPI 堆栈中用于处理9位模式的两种方法(硬件设置或软件仿真)都不适用于传出通信:
    -来自 HW 方法的数据看起来已损坏(但位数正确)
    - SW 方法将每个传出字节提升为16位、正确设置 MSB 的最低位、但随后将所有前导0计时

    我通过将 GPIO 从用户空间中进行位分配来解决这个问题:这允许双向通信

    ilitek93xx 芯片的文档声称允许随时更改模式;但是这是不正确的、该命令似乎只能在空闲的面板上才能访问。

    配置后、我能够在屏幕上获得 fb0内容(在确保没有其他服务(例如 Weston 正在使用此服务)

    我希望这能帮助其他人进行这种类型的显示

    祝你一切顺利、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Richard、

    阅读您之前的帖子我认为我处于相同的情况、我可以看到控制线、但所有数据线都很低。 在您的最新评论中、您提到了 devicetree 中的面板配置是可以的、因此我的问题是、您如何获取 LCD 信号上的数据?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好 Xavi

    这种情况是:
    -检查引脚复用
    -定义面板
    -将信息输入帧缓冲区(在确保没有其他使用信息之后)

    如果您提到的控制线是面板的同步和启用线、那么我可能会尝试确保信息进入帧缓冲区

    希望这会有所帮助
    Richard