這段時間搞一個電容觸控螢幕,經過實驗摸索終於試出來了,因為以前是沒有專門搞過這塊的,這下積攢了十足的經驗。有兩個關鍵地方做下說明:
(1)I2C器件讀寫函數。時序如下:
根據特性,我沒有使用smbus的讀寫函數,還是用的I2C讀寫函數來處理:
static struct i2c_client *g_client; //本I2C器件註冊的client端
static int GW8158_read_register_packet(u8 bufp[13]) //讀13個位元組,用數組傳出
{
int ret = 0,count = 0;
u8 buffer[13];
unsigned long flags;
spinlock_t *lock = get_i2c_lock(); //獲得I2C的自旋鎖
if((g_client == NULL)||(lock == NULL))
return -1;
spin_lock_irqsave(lock,flags); //I2C操作的自旋鎖
ret = i2c_master_recv(g_client,buffer,13); //預設會寫器件地址,由於沒有子地址,直接接收
spin_unlock_irqrestore(lock, flags);
if(ret > 0)
{
for(count = 0;count < 13; count ++)
bufp[count] = buffer[count]; //如果讀成功,回傳寄存器值
printk("GW8158_read_register_packet OK /n");
}
return ret;
}
static int GW8158_write_register_Byte(const u8 subAddress, u8 bufP)
{
int ret;
u8 buffer[2];
unsigned long flags;
spinlock_t *lock = get_i2c_lock();
if((g_client == NULL)||(lock == NULL))
return -1;
buffer[0] = subAddress;
buffer[1] = bufP;
spin_lock_irqsave(lock,flags);
if(i2c_master_send(g_client,buffer,1)<0) //寫一次子地址。這次寫只是驗證是否通訊成功。因為沒有資料,所以就算
return -1; //寫成功了也不會有意義。不會影響後面真正的寫控制。
ret = i2c_master_send(g_client,buffer,2); //才開始寫一次子地址和資料
spin_unlock_irqrestore(lock,flags);
if(ret > 0)
printk("GW8158_write_register_Byte OK /n");
return ret;
}
(2)複位部分。
本身是高複位,所以要有一個從低到高的時序,但是不能一直為高,否則會一直複位,得拉低。如下:
pxa3xx_outgpio_set_level(MFP_TS_GW8158_RST, GPIO_LEVEL_LOW);
mdelay(30);
pxa3xx_outgpio_set_level(MFP_TS_GW8158_RST, GPIO_LEVEL_HIGH);
mdelay(20);
pxa3xx_outgpio_set_level(MFP_TS_GW8158_RST, GPIO_LEVEL_LOW);
mdelay(1000);