新手学i2c遇到问题请大家多多指教
#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设备吗?谁能给我详细的介绍一下?