FT5206的电源管理
其实就是通过控制某个寄存器的值,来使TP模块进入不同的模式,以达到省电的目的
FT5206 有 3种功耗模式,具体定义如下表
表 5功耗模式 PMODE
模式名称 数值 描述 实测功耗
ACTIVE 0x00 全速扫描模式,有手指按下产生触摸进入此模 4mA
式,产生触摸中断/INT,让 Host 来读取触摸数据.
MONITOR 0x01 触摸监测模式,低速扫描, 不能产生触摸中断 3mA
/INT. 有触摸发生后自动跳转到ACTIVE 模式,
也可以有Host 配置进入其它功耗模
HIBERNATE 0x03 休眠模式.系统主要电路停止工作, 保留供电电 100uA
压, 功耗在100uA 以下。该模式下无法进行I2C
通信,模组需要由WAKE 信号唤醒,唤醒后会自
动进入MONITOR 模式。
当有手指触摸时,FT5206会自动进入 ACTIVE模式。当手抬起后,不会立即进入
MONITOR 模式,而是有延时,延时时间就是由TIMEENTERMONITOR 来控制。这里
的延时参数并不是s 或 ms,而是用于循环的次数。
ID_G_ PMODE
This register describes the powerconsumption mode of the TPM when in running status.
Address BitAddress RegisterName Description Default
0xA5 7:0 D_G_ PMODE 功耗模式寄存器 1
0: active
1: monitor
3: hibernate(deep sleep)
通过此寄存器可以在不同功耗模式切换。进入hibernate 模式后,无法返回其他功耗模式,
只有通过wake 脚进行硬件唤醒:拉低wake脚5ms以上。而且需保证WAKE 脚一直为高,除了唤醒的时候。
对应的代码如下:
probe时,register_early_suspend(&mutitouch_early_suspend);
static struct early_suspend mutitouch_early_suspend = {
.level = 5,
.suspend = mutitouch_early_suspend_handler,
.resume = mutitouch_late_resume_handler,
};
相应的休眠函数(背光灭时自动调用)和唤醒函数(背光亮时自动调用)如下:
static void mutitouch_early_suspend_handler(struct early_suspend *h)
{
uint8_t buf[4];
int ret;
FT5XXX_DBG("enter %s\n", __func__);
//ret = cancel_delayed_work(&mutitouch_chip->work);
//FT5XXX_DBG("Cancel Delay Work %d\n", ret);
cancel_work_sync(&mutitouch_chip->work);
/*
* 0:active mode
* 1:monitor mode
* 3:hibernate mode(deep sleep)
*/
buf[0]=0xA5;//ID_G_PMODE
buf[1]=0x03;
//write 0x03 to ADDR [0xA5],enable hibernate
mutitouch_write(mutitouch_chip, &(buf[0]), 2);
disable_irq(mutitouch_chip->irq);
mutitouch_chip->state = FT5XXX_SUSPEND;
}
static void mutitouch_late_resume_handler(struct early_suspend *h)
{
uint8_t buf[3];
FT5XXX_DBG("%s enter\n", __func__);
//reference P17,keyword " ID_G_PMODE "
//when entry hibernate mode,must hardware wake up:
//pull DOWN wake pin >5ms
gpio_set_value(mutitouch_chip->pdata->gpio_rst , IO_LOW);
msleep( 8);
gpio_set_value(mutitouch_chip->pdata->gpio_rst, IO_HIGHT);
int_count = 1;
enable_irq(mutitouch_chip->irq);
mutitouch_chip->state = FT5XXX_IDLE;
FT5XXX_DBG("%s leave\n", __func__);
return;
}