如题:芯片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,否则返回负值