linux i2c 测试16bit_i2c的设备树和驱动是如何匹配以及何时调用probe的?

846661e8e262fc070ce07f206694d920.png

014bf87cad366338726f12acf6a60e99.png

一、问题提出

i2c的设备树和驱动是如何匹配以及何时调用probe的?粉丝手里的I2C外设是ov5640,一个摄像头。177f8ffec93232d045b7729ed334ac13.png

二、问题分析

设备树信息如下:

 ov5640: ov5640@3c {
     
  compatible = "ovti,ov5640"; 
  reg = <0x3c>;
  pinctrl-names = "default";
  pinctrl-0 =                              &csi_pwn_rst>;
  clocks = ;
  clock-names = "csi_mclk";
  pwn-gpios = 4 1>;
  rst-gpios = 2 0>;
  csi_id = <0>;
  mclk = <24000000>;
  mclk_source = <0>;
  status = "okay";
  port {
   ov5640_ep: endpoint {
    remote-endpoint = ;
   };
  };
 };

驱动最重要的结构体如下:

ce49996db2e2ecee4202efdd5da8238e.png
ov5640_i2c_driver

要搞懂这个问题,我们需要有一些基础知识:

1.内核如何维护i2c总线

Linux内核维护很多总线,platform、usb、i2c、spi、pci等等,这个总线的架构在内核中都支持的很完善,内核通过以下结构体来维护总线:

struct bus_type {
     
 const char  *name;
 const char  *dev_name;
 struct device  *dev_root;
 struct device_attribute *dev_attrs; /* use dev_groups instead */
 const struct attribute_group **bus_groups;
 const struct attribute_group **dev_groups;
 const struct attribute_group **drv_groups;

 int (*match)(struct device *dev, struct device_driver *drv);
 int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
 int (*probe)(struct device *dev);
 int (*remove)(struct device *dev);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值