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/AM3358:TSC PEn_UP 中断问题

Guru**** 2578945 points
Other Parts Discussed in Thread: AM3358, TSC2005

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580249/linux-am3358-tsc-pen_up-interrupt-issue

器件型号:AM3358
主题中讨论的其他器件:TSC2005

工具/软件:Linux

您好:    

CPU:am3358

SDK:ti-processor-sdk-linux-am335x-evm-03.02.00.05

文件系统:arago-base-tisdk-image-am335x-evm 或 tisdk-rootfs-image-am335x-evm

lib:tlib

APP:qt

    触摸按钮上的触摸屏时发现错误,按钮 被按下,但如果提起笔,按钮仍然按下,不会改变状态。

    我调试触摸屏驱动程序、查找提起触控笔时、触摸屏无法接收到 pin_up 中断。以下是调试。IRQ_STATUS 是 IRQSTATUS_RAW(offset=0x24)的值

无 PEn_UP 中断(执行此操作后,我读取 IRQSTATUS_RAW (devmem2 0x44e0d024),该值为0x600,因此设置了 PEn_UP[9]标志,为什么 IRQ 函数无法接收此中断?)

[huzz]titlesc_IRQ:IRQ_STATUS=0x605
[huzz]titlesc_IRQ:IRQENB_HW_PEN
[huzz]titlesc_IRQ:IRQENB_PENUP
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x402
[huzz]titlesc_IRQ:IRQ_STATUS=0x404
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x403
[huzz]titlesc_IRQ:IRQENB_HW_PEN
[huzz]titlesc_IRQ:IRQ_STATUS=0x404
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x403
[huzz]titlesc_IRQ:IRQENB_HW_PEN

正常触摸消息(执行此操作后、IRQSTATUS_RAW=0x400)

[huzz]titlesc_IRQ:IRQ_STATUS=0x605
[huzz]titlesc_IRQ:IRQENB_HW_PEN
[huzz]titlesc_IRQ:IRQENB_PENUP
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x402
[huzz]titlesc_IRQ:IRQ_STATUS=0x404
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x403
[huzz]titlesc_IRQ:IRQENB_HW_PEN
[huzz]titlesc_IRQ:IRQ_STATUS=0x404
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x403
[huzz]titlesc_IRQ:IRQENB_HW_PEN
[huzz]titlesc_IRQ:IRQ_STATUS=0x404
[huzz]titlesc_IRQ:IRQENB_FIFO0THRES
[huzz]titlesc_IRQ:IRQ_STATUS=0x603
[huzz]titlesc_IRQ:IRQENB_HW_PEN
[huzz]titlesc_IRQ:IRQENB_PENUP

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

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

    参考 EVM 设计。
    我找到原因。
    TI_AM335x_TSC.c 文件
    titlesc_probe 函数、当它初始化 IRQ 时、未启用 pin_up 和 pin_down 中断、为什么要启用此功能?

    PS:

    在我的测试中、IRQ 函数获取中断、但有时它无法报告 PENUP 事件。我在获取 PENUP 事件时发现 FSM 值为0x50而不是0x10、为什么会发生这种情况?

    if (status & IRQENB_PENUP){
    FSM = *** (ts_dev、REG_ADCFSM);
    printk ("[huzz]%s:fsm=0x%x\n"、__func__、fSM);
    if (FSM = ADCFSM_STEPID){
    TS_DEV->PEEN_DOWN = false;
    Input_report_key (input_dev、BTN_touch、0);
    INPUT_REPORT_ABS (INPUT_DEV、ABS_PRESSURE、0);
    INPUT_SYNC (INPUT_DEV);
    PM_Relax (ts_dev->MFD_tscadc->dev);
    }否则{
    TS_DEV->PEEN_DOWN = true;

    irqclr |= IRQENB_PENUP;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将要求软件团队进行评论。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    [引用] titlesc_probe 函数、当它初始化 IRQ 时、未启用 pin_up 和 pin_down 中断、为什么要启用此功能?[/quot]
    驱动程序实际上使用 IRQSTATUS_RAW 寄存器来确定是否存在 pen-up 或 pin_down 事件,请参阅 titlesc_IRQ ():
    status = titlesc_readl (ts_dev、REG_RAWIRQSTATUS);
    …………
    if (status & IRQENB_PENUP){
    FSM = *** (ts_dev、REG_ADCFSM);
    if (FSM = ADCFSM_STEPID){
    TS_DEV->PEEN_DOWN = false;
    Input_report_key (input_dev、BTN_touch、0);
    INPUT_REPORT_ABS (INPUT_DEV、ABS_PRESSURE、0);
    INPUT_SYNC (INPUT_DEV);
    PM_Relax (ts_dev->MFD_tscadc->dev);
    }否则{
    TS_DEV->PEEN_DOWN = true;

    irqclr |= IRQENB_PENUP;


    因此无需在 titlesc_probe ()的 IRQENABLE_SET 寄存器中设置 IRQ。

    至于您遇到的问题:
    1.我知道这是一个定制板,所以尝试降低 x 板电阻以降低钟摆中断和挂起中断所需的压力。
    2.据我所知、最新的 SDK 不使用 slib。 它使用 Weston 库... 尝试使用 wayland-EGL 支持重建您的 qt 应用。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、yordan:
    当我提起画笔时、titlec_IRQ 无法获得中断、但当我读取 IRQSTATUS_RAW REG 时、会设置画笔事件。
    当我将 x 板电阻值从200更改为50时、它仍然无法使笔向上 IRQ。
    我们的客户使用的是 slib、因此我们使用的是 tslib。
    PS:使用 IT SDK 触摸屏、使用触摸时出错。
    我使用 QT 示例指画来测试触控。此应用程序可以绘制一个绿色点、我可以在其中触摸屏。但有时、当我触摸屏幕上的一个位置时、另一个位置也绘制一个点。我调试触摸屏驱动程序、我发现另一个位置也会获得 ADC 值 设置为更低或更大的 x 板电阻不会更改为良好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:AM3358

    工具/软件:Linux

    您好:

    我们的 SDK 是 ti-processor-sdk-linux-am335x-evm-03.02.00.05。

    我们使用了4线触摸屏。触摸屏驱动程序是  

    linux-4.4.4.32.32+gitAUTOINC+adde2ca9f8-gadde2ca9f8/drivers/input/touchone/ti_am335x_tsc.c

    有时、当我们触摸 QT 应用程序的按钮时、按钮 被按下、 当我们提起触控笔,按钮仍被按下、它不会升高。

    我们调试触摸屏驱动程序、当它出现时、中断函数无法接收到笔向上中断、因此该函数无法报告笔向上事件。

    当我看到驱动程序,在探测函数中,驱动程序不启用画笔中断,为什么驱动程序不需要画笔中断,如果不启用,驱动程序如何知道出现了画笔事件?

    当发生笔启动时、驱动程序不会获得中断、但当我执行"devmem2 0x44e0d024"时、pin_up_event[9]值为1

    有人能告诉我触摸屏驱动程序如何处理中断吗?

    DTS 文件:


    tscadc{(&T)
    状态="正常";
    TSC{
    TI、电线=<4>;
    ti、x 板电阻=<200>;
    ti、坐标读数=<5>;
    TI、wire-config =<0x01 0x10 0x22 0x33>;
    TI、充电延迟=<0x400>;
    };

    ADC{
    TI、ADC 通道=<4 5 6 7>;
    };
    };

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

    是否有人支持我这个问题?

    在代码中、z 可能是压力、但它是如何工作的?  首先,Z2大于 Z1,Z1、Z2、z 定义为无符号 int.secord 公式不同。

    /*
    *使用公式计算压力
    *电阻(触摸)= x 板电阻*
    * x postion/4096 *((Z2 / Z1)- 1)
    *
    Z = Z1 - Z2;
    z *= x;
    z *= ts_dev->x_plate_elistance;
    z /= Z2;
    z =(z + 2047)>> 12;

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

    您好!

    下面的信息完全是我在 TI TSC 控制器方面的经验提供的一般信息。  

    Z1和 Z2是两个附加的横面板测量值(最终结果 Z =(Z+2047)>>12;是实际压力):

    "要确定触控笔或手指触控、必须确定触控压力。 通常、此测试不需要具有非常高的性能;因此、建议使用10位分辨率模式(但是、数据表计算是使用12位分辨率模式显示的)。 执行此测量有多种不同的方法。 TSC2005支持两种方法。 第一种方法需要了解 X 板电阻、X 位置测量以及触摸屏的两个额外的横面板测量值(Z2和 Z1)"

    上述参考方框图通常如下所示:

      

    有两个公式可用于计算压力。 一个是最常用的(在 ti_AM335x_TSC.c 中实现):
       

    第二个问题如下:  
      

    根据我对一些电阻式显示器的经验、当触摸屏表现异常(触摸屏幕时出现随机行为、触摸点出现一些尖峰和偏移时)时、第二个等式可获得更好的性能。 这也是一次严格的试错调查,我认为这取决于用例。  

    现在、就您的画笔中断未被处理而言。 请参阅 AM335x TRM 的第12.3.5节中断:  
     "仅在启用充电步骤的情况下使用硬件步骤时、才能生成 Pen Up 事件中断、也称为 Pen Up 中断。 如果笔划中断事件导致硬件步骤被调度、并且序列发生器完成充电步骤的服务后不存在笔划中断、则会生成笔划中断。 要检测 Pen Up 中断、充电步骤必须与空闲步骤共享相同的配置。"  

    检查 ti_AM335x_TSC.c 驱动程序的 if (status & IRQENB_PENUP)内的代码。 打印 STATUS 和 IRQENB_PENUP 的值、以查看这些值是否已更新。 确保正确执行第12.3.5节中描述的序列。  

    此致、  
    Yordan

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

    您好、您好:

    感谢您的答复、我将测试 z

    但是、下面的代码不是 您告诉我的公式之一、为什么代码使用此代码?

    Z = Z1 - Z2;
    z *= x;
    z *= ts_dev->x_plate_elistance;
    z /= Z2;
    z =(z + 2047)>> 12;

    在我的测试中、我使用 x-plat =300、我使用第一个等式、但仍然有一个错误点。跟在我的一次触控中、第四次是错误点、但仍然是正确的值(如果(z <= MAX_12BIT))

    [575.006265][huzz]titlesc_read_Coordinates:Z1=1393、Z2=3634[huzz]titlesc_IRQ:calc:x=1873、y=2285、z=137
    [575.017267][huzz]titlesc_read_coordinates:Z1=1385、Z2=3648[huzz]titlesc_IRQ:calc:x=1867、y=2292、z=136
    [575.028162][huzz]titlesc_read_Coordinates:Z1=1303、Z2=3680[huzz]titlesc_IRQ:calc:x=1864、y=2279、z=136
    [575.039134][huzz]titlesc_read_coordinates:Z1=115、Z2=4054[huzz]titlesc_IRQ:calc:x=1251、y=2275、z=3094
    [575.048193][huzz]titlesc_IRQ:报告 pin_up

    关于 pin_up question.se在一楼,我的问题是 intitsc_IRQ 无法接收 pin_up 事件。因此,驱动程序不知道静态是 pen up。

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

    您好!

    我看到 PEN 出现了同样的问题、该问题是否有任何解决方法?

    Todd

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