linux I2C读写实例 .

这段时间搞一个电容触摸屏,经过实验摸索终于试出来了,因为以前是没有专门搞过这块的,这下积攒了十足的经验。有两个关键地方做下说明:

(1)I2C器件读写函数。时序如下:

linux I2C读写实例 ._第1张图片

根据特性,我没有使用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);

你可能感兴趣的:(linux I2C读写实例 .)