I2C 设备驱动程序 标准实现
2011-04-15 13:06
211 查看
前段时间在写驱动,是个I2C总线的设备.所以在这里就简单的谈下关于I2C的设备驱动的一点简单的经验之谈.相信网上也有很多这样的文章啦. 我就算是添点砖吧.
废话不多说,开始入正题.
I2C的协议在这里我就不多做介绍了,就是个有两根线的半双工的串线,SDA-数据线,SCL-时钟线.
SCL高的时候,SDA数据有效(说白了就是能被接受,人家知道你是什么,如果SCL低,你跳高跳低,接受方都认为你是个屁)
SCL SDA都高,表示总线处于等待状态.
SCL高 SDA由高向低,表示传输开始,反之则表示传输结束.
SDA每传输1个字节的数据,必须在第9位有个ACK,ACK低表示应答okay,高表示失败.
I2C现在分7位地址 和10位地址, 无非就是挂的设备多点.
今天主要就7位地址的设备开发,罗嗦1下.
开始吧
1 一开始需要查看硬件的设计电路图,看下你的I2C从设备的读写地址是多少.一般这个读写地址是8位的,比如0x72 0x73分别是读写地址,那么你的I2C的设备的地址去掉最后位的读写标记位0/1,就是0x39.
2 找到你的内核中的平台初始化文件在/kernel/arch/arm/XX/xxx.c 找到一个结构体
type_name 一定要和你等会驱动中的名字相对应,后面再说.
下面就是platform_data了,比如:
okay 平台初试化文件搞定了.
接下来开始具体设备了.一般如果是I2C设备的,比较喜欢在/driver/i2c/chips下开发,看个人爱好了.
开始搭建基本的驱动框架构,这个不用说了吧 什么module_init module_exit
不用多说了吧.
驱动一般开始于__init函数
在这个函数之前,我们先要申明一个结构体
进入__init函数
i2c_add_driver(&XXX_i2c_driver);//这个类似于platform_diver_register,无非就是在总线上匹配下驱动和设备,然后probe
好了,匹配完了,该干活了,进入probe
完成了.什么?还有呢?好吧,如果还有无非就是一些字符设备注册,如何在/dev下自动注册设备接点呢,比如/dev/XXX
1 XX_class = class_create(THIS_MODULE, "XXX); //这个是在sysfs的class中注册你的设备
2 dev = MKDEV();
2 device_create(XX_class, NULL, dev, NULL, "XXX", minor);好了这就搞定了。
至于i2C读写 不用我教了吧.i2c_smbus_read_byte_data(client, register)
i2c_smbus_write_byte_data(client, register, value)等等.
打完收工,希望对大家有点帮助吧.呵呵
废话不多说,开始入正题.
I2C的协议在这里我就不多做介绍了,就是个有两根线的半双工的串线,SDA-数据线,SCL-时钟线.
SCL高的时候,SDA数据有效(说白了就是能被接受,人家知道你是什么,如果SCL低,你跳高跳低,接受方都认为你是个屁)
SCL SDA都高,表示总线处于等待状态.
SCL高 SDA由高向低,表示传输开始,反之则表示传输结束.
SDA每传输1个字节的数据,必须在第9位有个ACK,ACK低表示应答okay,高表示失败.
I2C现在分7位地址 和10位地址, 无非就是挂的设备多点.
今天主要就7位地址的设备开发,罗嗦1下.
开始吧
1 一开始需要查看硬件的设计电路图,看下你的I2C从设备的读写地址是多少.一般这个读写地址是8位的,比如0x72 0x73分别是读写地址,那么你的I2C的设备的地址去掉最后位的读写标记位0/1,就是0x39.
2 找到你的内核中的平台初始化文件在/kernel/arch/arm/XX/xxx.c 找到一个结构体
struct i2c_board_info XX_i2c_info[] = { ... { .type = "xxx_name", .addr = 0x39 , //这个就是你从设备地址 .irq = XX_IRQ, .platform_data = XXX_data, //这个里面可以放一些硬件资源什么,到具体的驱动程序会被用到,没有就算了 }, ... }
type_name 一定要和你等会驱动中的名字相对应,后面再说.
下面就是platform_data了,比如:
static struct XXX_platform_data tsl2771_u802_data = { .irq = XXX, //硬件资源可以放在这个里面 }
okay 平台初试化文件搞定了.
接下来开始具体设备了.一般如果是I2C设备的,比较喜欢在/driver/i2c/chips下开发,看个人爱好了.
开始搭建基本的驱动框架构,这个不用说了吧 什么module_init module_exit
不用多说了吧.
驱动一般开始于__init函数
在这个函数之前,我们先要申明一个结构体
static struct i2c_driver XXX_i2c_driver = { .probe = XXX_probe, .remove = XXX_remove, .id_table = XXX_id, .driver = { .name = "XXX_name", //这个就是和上面提到那个type的字符串相对应的 }, };
进入__init函数
i2c_add_driver(&XXX_i2c_driver);//这个类似于platform_diver_register,无非就是在总线上匹配下驱动和设备,然后probe
好了,匹配完了,该干活了,进入probe
static int __devinit XXX_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct XXX_platform_data *pdata;//这个结构体是自己定义的,平台和初始化文件中的那个platform_data的结构一致. pdata = client->dev.platform_data;//这个用来获取你的硬件资源 }
完成了.什么?还有呢?好吧,如果还有无非就是一些字符设备注册,如何在/dev下自动注册设备接点呢,比如/dev/XXX
1 XX_class = class_create(THIS_MODULE, "XXX); //这个是在sysfs的class中注册你的设备
2 dev = MKDEV();
2 device_create(XX_class, NULL, dev, NULL, "XXX", minor);好了这就搞定了。
至于i2C读写 不用我教了吧.i2c_smbus_read_byte_data(client, register)
i2c_smbus_write_byte_data(client, register, value)等等.
打完收工,希望对大家有点帮助吧.呵呵
相关文章推荐
- 嵌入式Linux中I2C设备驱动程序的研究与实现
- 嵌入式Linux中I2C设备驱动程序的研究与实现
- 嵌入式系统通用驱动程序接口及其实现-I2C主机设备驱动(视频教学时的同步输入文件)
- 嵌入式Linux系统下I2C设备驱动程序的开发
- 虚拟设备驱动程序的设计与实现
- Linux下I2C设备驱动开发和实现(转)
- [DEV] 虚拟设备驱动程序的设计与实现
- Linux下I2C设备驱动开发和实现
- windows8系统修改“设备安装设置”选项实现停止自动安装驱动程序
- JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
- 虚拟设备驱动程序的设计与实现
- Linux设备驱动程序架构分析之I2C Spec摘要
- USB鼠标设备驱动程序简单实现(二)
- 嵌入式Linux系统下I2C设备驱动程序的开发
- Linux下I2C设备驱动开发和实现
- Linux下I2C设备驱动开发和实现
- 基于ARM的I2C设备控制方法的实现
- 实验题目:实现嵌入式Linux系统下的字符设备驱动程序(报告)
- i2c 驱动三:自己实现设备和驱动分离
- 嵌入式Linux系统下I2C设备驱动程序的开发