hid-ft260驱动学习笔记 5 - ft260_i2c_probe

目录

1. 保存ft260_device到私有数据

2. 初始化I2C设备分配属性

3. 添加I2C适配器

4. 初始化GPIO

5. ft260_i2c_algo

5.1 ft260_functionality

5.2 ft260_i2c_xfer

5.3 ft260_smbus_xfer

6. ft260_i2c_quirks


这个函数是i2c的接口probe函数。

1. 保存ft260_device到私有数据

将ft260_device类型的指针保存到hdev设备指针的私有数据。

hid_set_drvdata(hdev, dev);
dev->hdev = hdev;

这一步的意义是在hid的接口函数中能够获取到FT260的设备信息。 

然后把hdev设备指针也保存到FT260的设备结构体中。

2. 初始化I2C设备分配属性

dev->adap.owner = THIS_MODULE;
dev->adap.class = I2C_CLASS_HWMON;
dev->adap.algo = &ft260_i2c_algo;
dev->adap.quirks = &ft260_i2c_quirks;
dev->adap.dev.parent = &hdev->dev;
snprintf(dev->adap.name, sizeof(dev->adap.name),
	"FT260 usb-i2c bridge");

将设备的所有者设置为当前模块,设备类别设置为硬件监控类,算法设置为ft260_i2c_algo,特性设置为ft260_i2c_quirks,父设备设置为hdev->dev,设备名称设置为"FT260 usb-i2c bridge"。

在初始化I2C设备前,先确认一下FT260的I2C状态是否为忙,如果处于忙的状态则复位一下i2c

ret = ft260_xfer_status(dev, FT260_I2C_STATUS_BUS_BUSY);
if (ret)
	ft260_i2c_reset(hdev);

3. 添加I2C适配器

i2c_set_adapdata(&dev->adap, dev);
ret = i2c_add_adapter(&dev->adap);
if (ret) {
	hid_err(hdev, "failed to add i2c adapter\n");
	return ret;
}

首先,通过i2c_set_adapdata函数将设备结构体dev的I2C适配器指针设置为&dev->adap。 然后,通过i2c_add_adapter函数将该适配器添加到I2C总线上。 如果添加适配器失败,函数会返回错误码,并通过hid_err函数输出错误信息。

4. 初始化GPIO

和uart probe里面probe是一样的。

5. ft260_i2c_algo

这部分是i2c读写的实现部分。

static const struct i2c_algorithm ft260_i2c_algo = {
	.master_xfer = ft260_i2c_xfer,
	.smbus_xfer = ft260_smbus_xfer,
	.functionality = ft260_functionality,
};

5.1 ft260_functionality

用于查询FT260芯片的功能。

static u32 ft260_functionality(struct i2c_adapter *adap)
{
	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE |
	       I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
	       I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_I2C_BLOCK;
}

该函数用于设置i2c_adapter的功能。返回一个u32类型的值,该值表示支持的I2C功能的位掩码。具体支持的功能有:I2C传输、SMBus字节传输、SMBus字节数据传输、SMBus字数据传输、SMBus块数据传输和SMBus I2C块传输。

5.2 ft260_i2c_xfer

用于实现主模式下的I2C传输。

函数首先获取FT260设备指针,然后通过互斥锁锁定设备。接下来,函数将设备的电源模式设置为FULLON。如果设置失败,则函数释放互斥锁并返回错误码。如果只有一个消息需要传输,函数根据消息的读写标志调用相应的读或写函数进行数据传输。如果有多条消息,则调用写读函数进行组合传输。无论传输成功与否,函数都会将设备的电源模式恢复为NORMAL,并释放互斥锁,最后返回传输的消息数量。

5.3 ft260_smbus_xfer

用于实现SMBus模式下的I2C传输。

该函数接收I2C适配器、地址、标志、读写模式、命令、大小和数据作为参数。在函数内部,它首先获取适配器的数据结构指针,然后锁定设备的互斥锁。接下来,它为设备设置全开电源管理状态。然后根据传输的大小和读写模式,执行相应的I2C读写操作。如果传输大小不受支持,则返回错误。最后,它恢复设备的电源管理状态,解锁互斥锁,并返回执行结果。

6. ft260_i2c_quirks

用于描述I2C适配器的特殊行为。结构体中的flags成员设置了组合写然后读的操作标志,max_comb_1st_msg_len成员指定了在组合消息中第一个消息的最大长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值