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_PMODEbuf[1]=0x03;//write 0x03 to ADDR [0xA5],enable hibernatemutitouch_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 >5msgpio_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;}