• 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设备指针的私有数据。

    1. hid_set_drvdata(hdev, dev);
    2. dev->hdev = hdev;

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

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

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

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

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

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

    1. ret = ft260_xfer_status(dev, FT260_I2C_STATUS_BUS_BUSY);
    2. if (ret)
    3. ft260_i2c_reset(hdev);

    3. 添加I2C适配器

    1. i2c_set_adapdata(&dev->adap, dev);
    2. ret = i2c_add_adapter(&dev->adap);
    3. if (ret) {
    4. hid_err(hdev, "failed to add i2c adapter\n");
    5. return ret;
    6. }

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

    4. 初始化GPIO

    和uart probe里面probe是一样的。

    5. ft260_i2c_algo

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

    1. static const struct i2c_algorithm ft260_i2c_algo = {
    2. .master_xfer = ft260_i2c_xfer,
    3. .smbus_xfer = ft260_smbus_xfer,
    4. .functionality = ft260_functionality,
    5. };

    5.1 ft260_functionality

    用于查询FT260芯片的功能。

    1. static u32 ft260_functionality(struct i2c_adapter *adap)
    2. {
    3. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE |
    4. I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
    5. I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_I2C_BLOCK;
    6. }

    该函数用于设置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成员指定了在组合消息中第一个消息的最大长度。

  • 相关阅读:
    891. 子序列宽度之和 : 逐步分析如何求解对展开式的最终贡献
    2023云栖大会,Salesforce终敲开中国CRM市场
    阿里首次公开企业级 SpringBoot 实战进阶笔记
    Junit4 一直处于运行中的排查过程
    Ceph — 使用cephadm搭建Ceph集群
    论文写作 - CCF会议论文常用表述
    AUTOSAR LIN: LDF(LIN Description File)文件解析
    python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装
    SQL12 高级操作符练习(2)
    自定义md-loader来简单高效的维护组件文档
  • 原文地址:https://blog.csdn.net/pq113_6/article/details/140212683