收缩数据线内部结构图收缩里面的线出来了怎么安上去


  I2C核心:I2C核心提供了I2C总线驱动囷设备驱动的注册注销方法,I2C通信方法(”algorithm”)上层的与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等


  I2C设备驱動:I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上通过I2C适配器与CPU交换数据。

  上图唍整的描述了linux i2c驱动架构虽然I2C硬件体系结构比较简单,但是i2c体系结构在linux中的实现却相当复杂

  那么我们如何编写特定i2c接口器件的驱动程序?就是说上述架构中的那些部分需要我们完成而哪些是linux内核已经完善的或者是芯片提供商已经提供的?


  第一层:提供i2c adapter的硬件驱動探测、初始化i2c adapter(如申请i2c的io地址和中断号),驱动soc控制的i2c adapter在硬件上产生信号(start、stop、ack)以及处理i2c中断覆盖图中的硬件实现层

  第四层:实现i2c设备所对应的具体device的驱动,i2c_driver只是实现设备与总线的挂接而挂接在总线上的设备则是千差万别的,所以要实现具体设备device的write()、read()、ioctl()等方法赋值给file_operations,然后注册字符设备(多数是字符设备)覆盖图中的driver驱动层

  第一层和第二层又叫i2c总线驱动(bus),第三第四属于i2c设备驱动(device driver)

  在linux驱动架构中,几乎不需要驱动开发人员再添加bus因为linux内核几乎集成所有总线bus,如usb、pci、i2c等等并且总线bus中的(与特定硬件相关的代码)已由芯片提供商编写完成,例如三星的s3c-2440平台i2c总线bus为/drivers/i2c/buses/i2c-s3c2410.c

  第三第四层与特定device相干的就需要驱动工程师来实现了


  在Linux内核源代码中的driver目录下包含一个i2c目录

  i2c-dev.c实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备通过适配器访设备时的主设备号都为89,次设备号为0-255I2c-dev.c并没有針对特定的设备而设计,只是提供了通用的read(),write(),和ioctl()等接口应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器,并控制I2C設备的工作方式  busses文件夹这个文件中包含了一些I2C总线的驱动,如针对S3C2410S3C2440,S3C6410等处理器的I2C控制器驱动为i2c-s3c2410.c.  algos文件夹实现了一些I2C总线适配器嘚algorithm.





各结构体的作用与它们之间的关系

  i2c_msg也非常关键调用驱动中的发送接收函数需要填充该结构体

  从i2c驱动架构图中可以看出,linux内核對i2c架构抽象了一个叫核心层core的中间件它分离了设备驱动device driver和硬件控制的实现细节(如操作i2c的寄存器),core层不但为上面的设备驱动提供封装後的内核注册函数而且还为小面的硬件事件提供注册接口(也就是i2c总线注册接口),可以说core层起到了承上启下的作用


当一个具体的client被偵测到并被关联的时候,设备和sysfs文件将被注册

  相反的,在client被取消关联的时候sysfs文件和设备也被注销,驱动开发人员在开发i2c设备驱动時需要调用下列函数。程序清单如下

  i2c-davinci.c是实现与硬件相关功能的代码集合这部分是与平台相关的,也叫做i2c总线驱动这部分代码是這样添加到系统中的

  并且,i2c适配器控制硬件发送接收数据的函数在这里赋值给i2c-algorithmi2c_davinci_xfer稍加修改就可以在裸机中控制i2c适配器

  在linux系统中,適配器驱动位于linux目录下的\drivers\i2c\busses下不同的处理器的适配器驱动程序设计有差异,但是总体思路不变

  在适配器的驱动中,实现两个结构体非常关键也是整个适配器驱动的灵魂。

  下面以某个适配器的驱动程序为例进行说明:

   以上说明这个驱动是基于平台总线的这樣实现的目的是与CPU紧紧联系起来。

  这个结构体也是非常的关键这个结构体里面的函数tcc_i2c_xfer是适配器算法的实现,这个函数实现了适配器與I2C CORE的连接

  tcc_i2c_func是指该适配器所支持的功能。

  tcc_i2c_xfer这个函数实质是实现I2C数据的发送与接收的处理过程不同的处理器实现的方法不同,主偠表现在寄存器的设置与中断的处理方法上

  把握上面的两点去分析适配器程序就简单多了。


  在I2C-core.c这个函数中把握下面的几个关鍵函数就可以了。

//I2C传输,发送和接收

代码调用层次图 

  有时候代码比任何文字描述都来得直接但是过多的代码展示反而让人觉得枯燥。這个时候需要一幅图来梳理一下上面的内容

  上面这些代码的展示是告诉我们:linux内核和芯片提供商为我们的的驱动程序提供了 i2c驱动的框架,以及框架底层与硬件相关的代码的实现

  剩下的就是针对挂载在i2c两线上的i2c设备了device,而编写的即具体设备驱动了这里的设备就昰硬件接口外挂载的设备,而非硬件接口本身(soc硬件接口本身的驱动可以理解为总线驱动)


编写驱动需要完成的工作

  编写具体的I2C驱动時工程师需要处理的主要工作如下:

  1).提供I2C适配器的硬件驱动,探测初始化I2C适配器(如申请I2C的I/O地址和中断号),驱动CPU控制的I2C适配器从硬件上产生

  4).实现I2C设备所对应类型的具体驱动,i2c_driver只是实现设备与总线的挂接

  上面的工作中前两个属于I2C总线驱动,后面两个属于I2C设備驱动

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

我要回帖

更多关于 收缩数据线内部结构图 的文章

 

随机推荐