<MTK> mtk kernel 设置EINT中断响应

本文介绍MT6797平台在Android6.0系统下使用Kernel3.18版本的中断配置方法。主要内容包括DTS文件中对中断控制器的设置、GPIO引脚配置、pinctrl状态管理以及中断处理函数的注册过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文环境

  • mt6797
  • kernel 3.18
  • android 6.0

DTS设置

&eintc {
    irq_my_irq@3 {
        compatible = "eint, my-irq";
        interrupt-parent = <&eintc>;
        interrupts = <65 IRQ_TYPE_EDGE_RISING>;
        debounce = <65 0>;
    };
    irq_my_gpio@3 {
        compatible = "eint, my-gpio";
        interrupt-parent = <&eintc>;
        interrupts = <179 IRQ_TYPE_EDGE_RISING>;
        debounce = <179 0>;
    };
};

{
    //...
    pinctrl-names = "default", "my_irq_as_int", "nor_irq_as_gpio";
    pinctrl-0 = <&pins_default>;
    pinctrl-1 = <&pins_my_irq_as_int>;
    pinctrl-2 = <&pins_normal_irq_as_gpio>;
};

&pio {
    pins_default: eint0default {
    };
    pins_my_irq_as_int: eint@0 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO65__FUNC_EINT4>;
            slew-rate = <0>;
            bias-disable;
        };
    };
    pins_normal_irq_as_gpio: normal_irq_as_gpio@0 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO179__FUNC_GPIO179>;
            slew-rate = <0>;
            bias-disable;
        };
    };
};

driver配置


struct pinctrl *my_pinctrl;
struct pinctrl_state *pins_default;
struct pinctrl_state *my_irq_as_int, *nor_irq_as_gpio;

int parse_dt(struct platform_device *pdev)
{
    //...
    my_pinctrl = devm_pinctrl_get(&pdev->dev);
    if (IS_ERR(my_pinctrl)) {
        ret = PTR_ERR(my_pinctrl);
        dev_err(&pdev->dev, "failed to find pinctrl!\n");
        return ret;
    }
    pins_default = pinctrl_lookup_state(my_pinctrl, "default");
    if (IS_ERR(pins_default)) {
        ret = PTR_ERR(pins_default);
        dev_err(&pdev->dev, "cannot find default: %d!\n", ret);
    }
    my_irq_as_int= pinctrl_lookup_state(my_pinctrl, "my_irq_as_int");
    if (IS_ERR(my_irq_as_int)) {
        ret = PTR_ERR(my_irq_as_int);
        dev_err(&pdev->dev, "cannot find my_irq_as_int\n");
        return ret;
    }
    nor_irq_as_gpio = pinctrl_lookup_state(my_pinctrl, "nor_irq_as_gpio");
}
// 设置INT
int my_probe(*dev)
{
    // ...
    pinctrl_select_state(my_pinctrl, eint_as_int);
    pinctrl_select_state(my_pinctrl, nor_irq_as_gpio);
    // ...
}

static struct of_device_id my_irq_match[] = {
    {.compatible = "eint,my-irq", },
};
static struct of_device_id my_gpio_match[] = {
    {.compatible = "eint,my-gpio", },
};
// 中断响应函数
static irqreturn_t my_irq_handler(int irq, void *dev_id)
{
    //...
    return IRQ_HANDLED;
}
// 关联注册中断响应函数
int my_register_irq(void)
{
    struct device_node *node = NULL;
    int ret = 0;
    int irq;

    node = of_find_matching_node(node, my_irq_match);
    if (NULL == node) {
        pr_err("Can not find eint node!");
        return -ENODATA;
    }

    irq = irq_of_parse_and_map(node, 0); 
    pr_debug("%s irq: %d", my_irq_match->compatible, irq);

    ret = request_irq(irq, my_irq_handler,
                      IRQF_TRIGGER_FALLING, "my-irq", NULL);
    return ret;
}
#define GPIO_MY_IRQ_GPIO (GPIO179)
int my_register_irq_gpio(void)
{
    struct device_node *node = NULL;
    int ret = 0;
    int irq;
    int gpio = GPIO_MY_IRQ_GPIO;

    /* request irq gpio */
    if (gpio_is_valid(gpio)) {
        ret = gpio_request(gpio, "irq_gpio");
        if (ret) {
            pr_err("irq gpio request failed");
        }

        ret = gpio_direction_input(gpio);
        if (ret) {
            pr_err("set_direction for irq gpio failed");
        }
    } else {
        pr_err("gpio: %d invalid", gpio);
    }

    node = of_find_matching_node(node, my_gpio_match);
    if (NULL == node) {
        pr_err("Can not find eint node!");
        return -ENODATA;
    }

    irq = irq_of_parse_and_map(node, 0); 
    pr_debug("%s irq: %d", my_gpio_match->compatible, irq);

    ret = request_irq(irq, my_irq_handler,
                      IRQF_TRIGGER_FALLING, "my-gpio-irq", NULL);
    return ret;
}
<think>嗯,用户想了解MT-EINTMTK-TPD在MediaTek平台上的定义、功能以及数字含义。首先,我需要回忆一下之前看到的引用内容。引用[3]提到MTK的TP驱动程序涉及EN、RST和EINT三个引脚,对应的宏是GPIO_CTP_EN_PIN、GPIO_CTP_RST_PIN和GPIO_CTP_EINT_PIN。这里EINT应该就是外部中断引脚,也就是MT-EINT。而TPD应该是指触摸面板驱动,MTK-TPD可能指的是MediaTek的触摸面板驱动框架。 然后,引用[2]和[5]提到TP驱动框架对触摸IC复位和中断的封装,以及修改ProjectConfig.mk中的CUSTOM_KERNEL_TOUCHPANEL来指定触摸IC型号。这说明MTK-TPD是处理触摸屏相关功能的模块,而MT-EINT则处理中断信号,用于检测触摸事件。 数字方面,比如GPIO编号,可能是在配置文件中定义的引脚号,例如GPIO_CTP_EINT_PIN可能对应具体的GPIO数字,如6或者某个数值,这需要根据硬件设计来确定。另外,input_report_abs函数中的ABS_MT_POSITION_X和Y应该用于报告触摸坐标,数字可能代表不同的事件类型或坐标轴。 可能需要进一步解释MT-EINT中断处理机制,比如中断触发方式(上升沿、下降沿等),以及如何在驱动中注册中断处理函数。而MTK-TPD部分需要说明驱动框架如何初始化和注册输入设备,处理触摸数据,以及如何与硬件交互,比如通过I2C读取触摸点信息。 另外,用户提到的“数字含义”可能还包括触摸坐标的解析,比如输入子系统中的ABS_MT事件编号,或者GPIO引脚的具体编号配置。需要结合代码示例和配置文件来解释这些数字的作用,比如在ProjectConfig.mk中设置触摸IC子目录,或驱动代码中的GPIO宏定义。 总结一下,回答需要分两部分,MT-EINTMTK-TPD,分别说明它们的定义、功能,以及在代码中的数字含义,比如GPIO编号、事件类型等。同时引用相关的参考资料来支持解释,确保准确性。</think>### MT-EINTMTK-TPD的定义与功能解析 #### 1. **MT-EINT** - **定义**:MT-EINT(MediaTek External Interrupt)指MediaTek平台的外部中断机制,用于处理硬件引脚触发的中断信号,例如触摸屏的触控事件[^3]。 - **功能**: - 检测外部硬件事件(如触摸屏按下、传感器触发)。 - 通过中断服务程序(ISR)快速响应事件,减少CPU轮询开销。 - 在触摸屏驱动中,通常与GPIO引脚绑定(如`GPIO_CTP_EINT_PIN`)。 - **数字含义**: - **中断编号**:例如`MT_EINT_NUMBER=6`表示该中断在系统中断控制器中的逻辑编号。 - **GPIO编号**:如`GPIO_CTP_EINT_PIN=120`,对应芯片数据手册中的物理引脚编号。 #### 2. **MTK-TPD** - **定义**:MTK-TPD(MediaTek Touch Panel Driver)是MediaTek平台触摸屏驱动的核心模块,负责处理触摸数据的采集、解析和上报[^2][^5]。 - **功能**: - 初始化触摸IC(如复位、配置寄存器)。 - 通过中断或轮询获取触摸点坐标。 - 将坐标数据通过输入子系统(Input Subsystem)上报给系统,例如: ```c input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); // 上报X坐标[^4] ``` - **数字含义**: - **触摸点坐标**:如`x=320`、`y=480`表示屏幕像素位置。 - **配置参数**:在`ProjectConfig.mk`中,`CUSTOM_KERNEL_TOUCHPANEL=ft5x16`指定了触摸IC型号,驱动据此加载对应子目录的代码。 #### 3. **关键代码与配置示例** - **中断配置**(MT-EINT): ```c #define GPIO_CTP_EINT_PIN 6 // 使用GPIO 6作为中断引脚[^3] request_threaded_irq(eint_irq, NULL, tpd_eint_handler, IRQF_TRIGGER_RISING, "TPD-EINT", NULL); ``` - **驱动框架**(MTK-TPD): - 复位IC:拉低/拉高`GPIO_CTP_RST_PIN`。 - 数据上报:通过`input_report_abs`上报坐标。 #### 4. **工作流程** 1. **硬件初始化**:配置EN、RST、EINT引脚,复位触摸IC。 2. **中断注册**:绑定EINT引脚与中断处理函数。 3. **数据采集**:中断触发后读取触摸点数据。 4. **数据上报**:通过输入子系统传递坐标给应用层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值