展讯8810平台:cy8c204_s3_cypress_3.95-2key调试(静态分配、中断请求、队列)

如题:芯片cy8c204,厂家:cypress,3.95英寸屏,两个触摸键。

文章不提及整个流程,只涉及要点。

一、总结和管脚配置。

1)因为管脚位在SIMDA2和SIMCLK2上即对应着2的总线,bus=2.

2)该TP只用6个脚,主要是SDA/SCL/IRQ/RST,customize/customer_cfg/sp8810ga/kernel/pinmap/pinmap_cfg.c文件中配置SDA、SCL、IRQ为上拉,如下:

MFP_CFG_X(SIMDA2,   AF1,    DS1,    F_PULL_UP,  S_PULL_UP,  IO_Z),

MFP_CFG_X(SIMCLK2,  AF1,    DS1,    F_PULL_UP,  S_PULL_UP,  IO_Z),

MFP_CFG_X(SIMRST3,  AF3,    DS1,    F_PULL_UP,  S_PULL_NONE,    IO_IE),

对应管脚图参考sc8810的datasheet。

3)源码上对应如下:

     gpio_direction_output(sprd_3rdparty_gpio_tp_rst, 1);
     gpio_direction_input(sprd_3rdparty_gpio_tp_irq);

注意:一般来先遵循先申请再访问比较好,如下

        ret = gpio_request(gt818_gpio_tp_irq, "TS_INT");    //Request IO
        if (ret < 0)
        {
            dev_err(&client->dev, "Failed to request GPIO:%d, ERRNO:%d\n",(int)gt818_gpio_tp_irq,ret);
            goto err_gpio_request_failed;
        } 

       gpio_direction_input(sprd_3rdparty_gpio_tp_irq);

 

二、配置板信息

注意:此处为静态分配,需要配置boardinfo信息,如果为动态获取则不需要配置此boardinfo

同前面总线,管脚位在SIMDA2和SIMCLK2上即对应着boardinfo2,不要配置到boardinfo上,如下:

static struct i2c_board_info __initdata i2c_boardinfo2[] = { 
    {I2C_BOARD_INFO("mstar_i2c_ts",0x26),},
};

其中0x26为中断号,而mstar_i2c_ts一定要跟i2c_driver这个结构体设置的.name一致,如下:
static struct i2c_driver mstar_i2c_ts_driver = {
    .driver = {
        .owner  = THIS_MODULE,
        .name   = "mstar_i2c_ts"
    },   
    .probe      = mstar_i2c_ts_probe,
    .remove     = __devexit_p(mstar_i2c_ts_remove),
    .id_table   = mstar_i2c_ts_id,
};

 

三、中断与队列。

linux中断分顶部(快)和底部(处理时间长),这里中断为底部中断。

其中request_irq()(同request_threaded_irq,后者被前者调用)请求中断,即打开使能中断,如果该句,进不了中断,该句一般在probe里,如下:

一般有两种方式:

1)goodix-gt818芯片,先创建队伍,把work放到队伍中,中断来时调用队伍,流程为:

 goodix_wq = create_workqueue("goodix_wq");//init函数中

 INIT_WORK(&ts->work, goodix_ts_work_func);      //在probe函数中,init work_struct,后面启用队列时调用此函数

request_irq(client->irq, goodix_ts_irq_handler ,  ...);//在probe函数中,中断来时调用goodix_ts_irq_handler函数,此函数里包涵了一条重要的函数:

static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)
{
    struct goodix_ts_data *ts = dev_id;

    disable_irq_nosync(ts->client->irq);//关闭irq
    queue_work(goodix_wq, &ts->work);//开启队伍,调用队列内函数即上面INIT_WORK定义的

}

 

2)cypress芯片,是上面的简写版,直接中断来时调用work函数,如下

request_threaded_irq(client->irq, NULL, mstar_ts_isr,  IRQF_TRIGGER_FALLING,
                    client->name, tsdata);//使能中断,以后每次中断来时调用mstar_ts_isr函数

 

四、I2C数据传递。

1)一般会在传输数据时调用i2c-core.c中的i2c_transfer(this_client->adapter, msgs, 2)函数,后面为2,返回值为2,则I2C通信正常

2)在 2.4 内核和 2.6内核中都使用 request_irq() 函数来注册中断服务函数cy8c21x34_ts_irq_handler,request_irq()正常返回0,否则返回负值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值