手把手教你写Linux I2C设备驱动(2)

下一步就应该编写第1步中的两个回调函数,一个用于注册设备,一个用于注销设备。探测函数示例如下:

static int tvp5158_attach_adapter(struct i2c_adapter *adapter)  {      return i2c_probe(adapter, &addr_data, &tvp5158_detect_client);  

这个回调函数系统会自动调用,我们只需要按照上述代码形式写好就行,这里调用了系统的I2C设备探测函数,i2c_probe(),第三个参数为具体的设备探测回调函数,系统会在探测设备的时候调用这个函数,需要自己实现。示例如下:

static int tvp5158_detect_client(struct i2c_adapter *adapter,int address,int kind)  {      struct tvp5158_obj *pObj;      int err = 0;       printk(KERN_INFO "I2C: tvp5158_detect_client at address %x ...\n", address);       if( g_tvp5158_obj != NULL  ) {          //already allocated,inc user count, and return the allocated handle          g_tvp5158_obj->users++;          return 0;      }       /* alloc obj */     pObj = kmalloc(sizeof(struct tvp5158_obj), GFP_KERNEL);      if (pObj==0){          return -ENOMEM;      }      memset(pObj, 0, sizeof(struct tvp5158_obj));      pObj->client.addr    = address;      pObj->client.adapter = adapter;      pObj->client.driver  = &tvp5158_i2c_driver;      pObj->client.flags   = I2C_CLIENT_ALLOW_USE;      pObj->users++;       /* attach i2c client to sys i2c clients list */     if((err = i2c_attach_client(&pObj->client))){          printk( KERN_ERR "I2C: ERROR: i2c_attach_client fail! address=%x\n",address);          return err;      }       // store the pObj      g_tvp5158_obj = pObj;       printk( KERN_ERR "I2C: i2c_attach_client ok! address=%x\n",address);       return 0;  

到此为止,探测并且注册设备的代码已经完成,以后对该  I2C 设备的访问均可以通过 g_tvp5158_obj 这个全局的指针进行了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyjgjy.html