您的位置:首页 > 运维架构 > Linux

第15章 Linux的I2C核心、总线与设备驱动

2009-03-30 15:53 429 查看
本文摘自(偶有较小改动)《Linux 设备驱动开发详解》(宋宝华 编著;人民邮电出版社;),留作纪念。
——Living Park
第15章 Linux的I2C核心、总线与设备驱动
15.1 Linux的I2C体系结构
       Linux的I2C体系结构分为3个组成部分。
(1)  
 I2C核心
提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。
(2)  I2C总线驱动
是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。
(3)  I2C设备驱动
是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
15.2 Linux I2C核心
       提供了一组不依赖于硬件平台的接口函数,这个文件一般不需要被工程师修改。
操作:增加/删除i2c_adapter i2c_add_adapter(),i2c_del_adapter();增加/删除i2c_driver
i2c_register_driver(),i2c_del_driver(),i2c_add_driver();i2c_client依附/脱离 i2c_attach_client(),i2c_detach_client();I2C传输、发送和接收
i2c_transfer(),i2c_master_send(),i2cmaster_recv();I2C控制命令分配 i2c_control(),i2c_client_command()。
15.3 Linux I2C总线驱动
15.3.1 I2C适配器驱动加载与卸载
       加载函数完成两个工作。
l       
初始化I2C适配器所使用的硬件资源。
l       
通过i2c_add_adapter()添加i2c_adapter的数据结构。
卸载函数相反。
15.3.2 I2C总线通信方法
       实现通信方法主要实现i2c_algorithm的master_xfer()函数和functionality()函数。
15.4 Linux I2C设备驱动
       要使用i2c_driver和i2c_client数据结构并填充其中的成员函数。
15.4.1 Linux I2C设备驱动的模块加载与卸载
       通用方法是在加载函数中完成两件事。
l       
通过register_chrdev()函数将I2C设备注册为一个字符设备。
l       
通过I2C核心的i2c_add_driver()函数添加i2c_driver。
15.4.2 Linux I2C设备驱动的i2c_driver成员函数
       加载连锁:yyy_init()->i2c_add_driver()->yyy_attach_adapter()->i2c_probe()->yyy_detect()->i2c_client()->i2c_attach_client()->yyy_init_client();
       卸载连锁:yyy_exit()->i2c_del_driver()->yyy_detach_client()->i2cdetach_client()。
15.4.3 Linux I2C设备驱动的文件操作接口
       通常,如果I2C设备不是一个输入/输出设备或存储设备,就并不需要给I2C设备提供读写函数。许多I2C设备只是需要被设置以某种方式工作,而不是被读写。另外,I2C设备驱动的文件操作接口也不是必需的,甚至极少被需要。大多数情况下,我们只需要通过i2c-dev.c文件提供的I2C适配器设备文件接口就可完成对I2C设备的读写。
15.4.4 Linux 的i2c-dev.c文件分析
       i2c-dev.c文件完全可以被看作一个I2C设备驱动,它的主体是”i2c_driver成员函数+字符设备驱动。”
i2c-dev.c中提供i2cdev_read()、i2cdev_write()函数来对应用户空间要使用的read()和write()文件操作接口,但是这两个函数不具备太强的通用性,没有太大的使用价值,只能适用于非RepStart模式的情况。
15.5 S3C2410
I2C总线驱动实例
15.5.1 S3C2410
I2C控制器硬件描述
       处理器内部集成的I2C控制器可支持主、从两种模式。
15.5.2 S3C2410
I2C控制器硬件描述
       主要完成一下工作。
l       
设计对应于i2c_adapter_xxx_init()模板的S3C2410的模块加载函数和对应于i2c_adapter_xxx_exit()函数模板的模块卸载函数。
l       
设计对应于i2c_adapter_xxx_xfer()模板的S3C2410适配器的通信方法函数。
15.5.3 S3C2410
I2C适配器驱动的模块加载与卸载
       I2C适配器被作为一个单独的模块加载进内核,在模块的加载和卸载函数中,只需注册和注销一个platform_driver结构体。
       platform_driver结构体包含了具体适配器的probe()函数、remove()函数、resume()函数指针等信息,它需要被定义和赋值。
15.5.4 S3C2410
I2C总线通信方法
15.6 SAA7113H视频AD芯片的I2C设备驱动实例
15.6.1 SAA7113H视频AD芯片硬件描述
       SAA7113H是飞利浦半导体推出的9位视频AD芯片,它可以选择4路视频输入中的1路,并采样为9位数字信号。
15.6.2 SAA7113H视频AD芯片驱动的模块加载与卸载
       由于不需要实现文件操作接口,在设备驱动模块的加载和卸载函数中均不再需要注册和注销字符设备的操作。
15.6.3 SAA7113H设备驱动的i2c_driver成员函数
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息