linux内核I2C子系统学习(二)

2023-10-27


下面具体分析如何写第一部分:
主控芯片的i2c驱动分为2个步骤:
写总线驱动:
选了个主控芯片,比如:S3C8900(自己瞎编的芯片)
在driver/i2c/busses/i2c-s3c2410.c中没有找到这个芯片的I2C支持(总线驱动支持)。。。(倒霉了,没有选好芯片,也可能是最新型号的,linux内核没跟上)
在此之前先分析i2c-s3c2410.c中完成的工作(总线驱动):
  • 设计对应于i2c_adapter_xxx_init()模板的s3c8900的模块加载函数和对应于i2c_adapter_xxx_exit()函数模板的模块卸载函数。
  • 设计对应于i2c_adapter_xxx_xfer()模板的 s3c8900适配器的通信方法函数,针对 s3c24xx、64xx、s5pc1XX、s5p64xx处理器functionality()函数s3c24xx_i2c-func()只需简单的返回I2C_FUNC_I2C|I2C_FUNC_SMBUS_EMUL|I2C_FUNC_PROTOCOL_MANGLING表明其支持的功能
 
话说没找到总线驱动支持,(这倒霉孩子)那就得编写个类似的i2c-s3c8900.c的总线驱动支持,嘿嘿,照着上面的功能写吧,反正是总线驱动。
写吧,还等啥啊!!~~~~~
  • I2C适配器驱动加载与卸载 
  1. 初始化i2c适配器所使用的硬件资源,如申请I/O地址、中断号等
  2. 通过i2c_add_adapter添加i2c_adapter数据结构,当然这个数据结构的成员已经被xxx适配器的相应的函数指针所初始化
  3. i2c总线卸载模块与装载相反,是否i2c适配器使用的硬件资源,通过i2c_del_adapter删除i2c_adapter的数据结构
        模板如下:    
            static int __init i2c_adapter_xxx_init(void)
                {
                   xxx_adapter_hw_init();//初始化硬件资源
                    i2c_add_adapter(&xxx_adapter);
                }
                    static void __init i2c_adapter_xxx_exit(void)
                        {
        xxx_adapter_hw_free();//释放硬件资源
                            i2c_del_adapter(&xxx_adapter);
                            }
            具体CPU具体分析,有的用platform做的,可以参考6410的做法
  • I2C总线的通信方法
                我们需要为特定的i2c适配器实现其通信方法,主要实现i2c_algorithm的master_xfer()函数和functionality()函数
                functionality函数很简单,用于返回algorithm所支持的通信协议,如:I2C_FUCN-_I2C ,                            I2C_FUNC_10BIT_ADDR,I2C_FUNC_SMBUS_READ_BYTE,I2C_FUNC_SMBUS_write_byte等
                master_xfer函数在i2c适配器上完成传递给他的i2c_msg数组中的每个i2c消息。
        
            模板如下:
            
            static int i2c_adapter_xxx_xfer(struct i2c_adapter *adap,struct i2c_msg *msgs, int num)
                {
                    ......
                    for(i = 0; i<num ; i++){
                        i2c_adapter_xxx_start(); //产生开始位
                        //如果是读消息
                        if(msg[i]->falgs &I2C_M_RD){
                        i2c_adapter_xxx_setaddr((msg->addr<<1)|1); //发送从设备读地址
                           i2c_adapter_xxx_wait_ack();//获取从设备的ack信息
                           i2c_adapter_xxx_readbytes(msgs[i]->buf,msgs[i]->len);//读取msg[i]->len长的数据到msg[i]->buf里
                            }    else{    //是写消息
                               i2c_adapter_xxx_setaddr((msg->addr<<1)|1); //发送从设备写地址
                               i2c_adapter_xxx_wait_ack();//获取从设备的ack信息
                               i2c_adapter_xxx_readbytes(msgs[i]->buf,msgs[i]->len);//读取msg[i]->len长的数据到msg[i]->buf里
                                }        
                            }
                        i2c_adapter_xxx_stop(); //产生停止位
       }
 
 
好啦,完成了装载和卸载,又完成了通信方法这两个重要的东东,那么总线驱动结构已经完成啦,累死了!
 
第三部分准备具体写个驱动程序看看,呵呵


FROM: http://www.cnblogs.com/liugf05/archive/2012/12/05/2803792.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux内核I2C子系统学习(二) 的相关文章

  • three.js 创建文本的几种方式

    精灵贴图文本 text width 128px height 128px font size 16px text align center color ffffff background ff0000 div class text 精灵贴图
  • 基于javaweb+mysql的二手交易平台二手商城二手物品(前台、后台)

    基于javaweb mysql的二手交易平台二手商城二手物品 前台 后台 运行环境 Java 8 MySQL 5 7 Tomcat 8 开发工具 eclipse idea myeclipse sts等均可配置运行 适用 课程设计 大作业 毕
  • [题解]-整理药名

    题目 医生在书写药品名的时候经常不注意大小写 格式比较混乱 现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式 即药品名的第一个字符如果是字母要大写 其他字母小写 如将 ASPIRIN aspirin 整理成 Aspirin 输入
  • MySQL数据库之DML(数据操纵语言)

    1 DML 数据操纵语言 在进行数据库操作时 首先就是要使用DML 数据操纵语言 数据操纵语言主要由插入数据 insert 更新数据 update 以及删除数据 delete 组成 这些操作主要是针对 数据表中的数据 2 插入数据 INSE
  • 论文解读:Inpaint Anything: Segment Anything Meets Image Inpainting

    论文 https arxiv org pdf 2304 06790 pdf 代码 https github com geekyutao Inpaint Anything 图1 Inpaint Anything示意图 用户可以通过点击图像中的
  • Kanzi入门学习教程

    锋影 e mail 174176320 qq com 1 安装Kanzi 2 使用Kanzi studio创建工程 Kanzi创建的工程会包含以下目录结构 其中 Tool project文件夹中存放的是设计师设计的工程 包含kanzi UI
  • 不同业务场景下数据同步方案设计

    企业开发实践中通常需要提供数据搜索的功能 例如 电商系统中的商品搜索 订单搜索等 通常 搜索任务通常由搜索引擎担当 如Elasticsearch 而我们的原始数据为了安全性等问题通常存储在关系型数据库中 在搜索数据前 我们需要先将数据从关系
  • 前端性能优化指南

    一 常用指标 1 FP First Paint 页面在导航后首次呈现出不同于导航前内容的时间点 计算方式 白屏时间 firstPaint pageStartTime 2 FCP First Contentful Paint 从页面开始加载到

随机推荐