i2c驱动

一、i2c总线及linux对i2c总线的描述

一个i2c总线如下图所示,一般一个主控制器会挂载若干个i2c设备。

i2c总线分为两部分,一部分是soc中的i2c控制器,另一部分是i2c设备。linux中用了四个结构体来描述这两个部分,分别是:

struct  i2c_adapter   代表soc的i2c控制器

struct i2c_algorithm   代表soc的i2c控制器的读写驱动程序
struct i2c_client     代表i2c设备,有多少个设备就有多少个i2c_client
struct i2c_driver    代表控制i2c设备的驱动,不同i2c设备的驱动都是不一样的

二、从设备树到i2c设备

  下面以hi3559为例说明

  /kernel/arch/arm64/boot/dts/hisilicon/hi3559av100.dtsi文件对i2c控制器的描述如下图所示:

  

  /kernel/arch/arm64/boot/dts/hisilicon/hi3559av100-demb.dts文件对i2c设备设置了status状态,如下所示:

  

  其中i2c_bus0~ic2_bus11的status=“okay”,i2c_bus12~i2c_bus16的status=“disabled”。内核会将设备树中i2c控制器status=“okay”的节点会生成paltform_device,生成在目录/sys/devices/platform/soc/soc:amba下,如下所示:

  

  从上图可以看出,生成的i2c设备就是status=“okay”的12个i2c节点。

  如果在i2c_bus0下挂载了一个i2c设备,也可以在设备树中添加,如下图所示,在i2c_bus0下加了一个yy_i2c_dev设备。

  

  这个yy_i2c_dev设备会被内核解析到/sys/devices/platform/soc/soc:amba/12110000.i2c/i2c-0中,如下图所示,0-002e就是添加在i2c_bus0下面的设备

  

  可以看一下0-002e的name验证一下:

  

  添加的yy_i2c_dev设备会被内核解析成i2c_client,有了i2c_client,只要自己写一个i2c_driver跟它匹配即可,代码见E:\test_program\test_linux_driver\test_i2c_driver\test_i2c_driver_devicetree

  

三、hi3559  i2c_adapter的注册过程

  从上面的设备树可以看出,i2c控制器的compatible值都是 "hisilicon,hibvt-i2c",在/kernel/drivers/i2c/buses/i2c_hibvt.c中的定义的platform_driver的of_match_table中也有"hisilicon,hibvt-i2c",这就说明i2c_hibvt.c文件就是用来注册i2c_adapter。

  

我们知道,只要设备和驱动的compatible匹配,platform_driver的probe函数就会执行,下面就看一下hibvt_i2c_probe函数

  hibvt_i2c_probe

    ->platform_get_resource  

    ->hibvt_i2c_hw_init

    ->i2c_add_adapter

 

posted @ 2021-03-17 14:38  YYFaGe  阅读(425)  评论(0编辑  收藏  举报