您的位置:首页 > 其它

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 找到一个结构体

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)等等.

 

 

打完收工,希望对大家有点帮助吧.呵呵

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c struct module class 平台 byte