(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);