新手学i2c遇到问题请大家多多指教

xiaomi163 2014-11-14 01:33:04
#include <linux/i2c.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <asm/mach-ralink/rt_mmap.h>

static struct platform_device *mtk_i2c_device = NULL;
//这样注册之后,i2c_adapter注册的时候就会扫描所有的已注册的i2c_board_info,并为连接自己的i2c设备实例化一个i2c_client
static struct i2c_board_info i2c_board_info[] = {
{
I2C_BOARD_INFO("wm8960", 0x18),//静态声明一个I2C设备,
},
};

static struct resource i2cdev_resource[] =//定义一个platform_device占用的资源resource
{
[0] =//总线地址范围
{
.start = (RALINK_I2C_BASE),
.end = (RALINK_I2C_BASE) + (0x40),
.flags = IORESOURCE_MEM,
},
};

static int __init mtk_i2c_device_init(void)
{
struct i2c_adapter *adapter = NULL;
struct i2c_client *client = NULL;
int ret = 0;

printk("mtk i2c device init Linker.\n");

mtk_i2c_device = platform_device_alloc("Ralink-I2C",0);//对于platform设备的初始化
if (mtk_i2c_device == NULL) {
ret = -ENOMEM;
goto err_device_alloc;
}
mtk_i2c_device->resource = i2cdev_resource;
mtk_i2c_device->id = 0;
mtk_i2c_device->num_resources = ARRAY_SIZE(i2cdev_resource);

ret = platform_device_add(mtk_i2c_device);//对于platform设备的初注册
if (ret) {
printk("mtk_i2c_device : platform_device_add failed (%d)\n",ret);
goto err_device_add;
}
//获取i2c_adapter指针
adapter = i2c_get_adapter(0);
if (!adapter)
return -ENODEV;
//将会使用info提供的信息建立一个i2c_client并与第一个参数指向的i2c_adapter绑定。返回的参数是一个i2c_client指针。
client = i2c_new_device(adapter, i2c_board_info);
if (!client)
return -ENODEV;

//使用完要释放i2c_adapter指针
i2c_put_adapter(adapter);
i2c_get_clientdata(client);

return 0;

err_device_add:
err_device_alloc:
return ret;
}


static void __exit mtk_i2c_device_exit(void)
{
printk("mtk i2c device exit.\n");
}

module_init(mtk_i2c_device_init);
module_exit(mtk_i2c_device_exit);
MODULE_LICENSE("GPL");






上面这个代码是注册一个I2C设备吗?谁能给我详细的介绍一下?
...全文
309 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_20359119 2014-11-15
  • 打赏
  • 举报
回复
只是注册了设备还需要注册驱动 static int __init xxxx_init(void) { return i2c_add_driver(&xxxx_driver); } i2c_driver 中的driver.name 要和i2c_client一致,因为这是他们配备的一个依据,id_table 是i2c_device_id结构体的一个对象,里面定义了i2c驱动对应设备的i2c地址 i2c_add_driver 函数只是调用了i2c_register_driver函数,在i2c_register_driver里调用了driver_register(&i2c_driver->driver), 注意 driver_register 是linux系统设备模型里面的函数了,每一类linux设备驱动的注册最终都会调用它,传递的参数也由原来的i2c_driver 变成了 device_driver。 driver_register做了一些判断, 最后调用了 bus_add_driver, 然后调用 driver_attach, 然后调用bus_for_each_dev, 这个函数就是搜索总线上所有的device,我们这里是i2c总线,也即搜索i2c总线上的i2c_client, 调用__driver_attach判断i2c_driver i2c_client是否配备, 再调用driver_match_device,driver_match_device 最终调用了bus的match函数,我们这也就是i2c bus的match函数, 再调用i2c_match_id,这里到最后的id 配备了, 如果配备成功则正常返回到__driver_attach函数, 调用driver_probe_device,再调用really_probe, 最后调用bus的probe函数, 在bus的probe函数里利用to_i2c_driver 将device_driver转换成了i2c_driver,最后调用了i2c_driver的probe函数
蓝玉 2014-11-14
  • 打赏
  • 举报
回复
应该只算是一部分。其中static struct platform_device *mtk_i2c_device = NULL;是初始化I2C驱动设备。module_init(mtk_i2c_device_init); module_exit(mtk_i2c_device_exit); 分别是驱动进入和退出的地方。

1,319

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧