下面具体分析如何写第一部分:
主控芯片的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(); //产生停止位
}
好啦,完成了装载和卸载,又完成了通信方法这两个重要的东东,那么总线驱动结构已经完成啦,累死了!
第三部分准备具体写个驱动程序看看,呵呵

linux内核I2C子系统学习(二)相关推荐

  1. linux内核I2C子系统学习(三)

    写设备驱动: 四部曲: 构建i2c_driver 注册i2c_driver 构建i2c_client ( 第一种方法:注册字符设备驱动.第二种方法:通过板文件的i2c_board_info填充,然后注 ...

  2. linux内核I2C子系统学习(一)

    这部分准备分几个部分进行分析总结 因为I2C的通信肯定至少要有2个芯片完成,所以它的驱动是由2大部分组成: 主芯片的i2c的驱动 从芯片的i2c的驱动     注:万一选的都不支持咋办???(惨了,只 ...

  3. linux内核I2C子系统详解

    1.I2C通信协议 参考博客:<I2C通信协议详解和通信流程分析>:https://csdnimg.cn/release/blogv2/dist/pc/themesSkin/skin3-t ...

  4. 实例解析linux内核I2C体系结构

    实例解析linux内核I2C体系结构 一.概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完 ...

  5. linux内核I2C体系结构(注意结构体原型)

    一.概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成.下面比较下这两种驱动. 第一种方法 ...

  6. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  7. Linux内核--五大子系统

    linux内核的子系统有5个:1. 进程调度控制系统(SCHED):2.内存管理系统(MM),主要作用是控制多个进程安全地共享主内存区域:3.虚拟文件系统(VFS):4.网络接口(NET):5.进程间 ...

  8. linux内核网络子系统初探---概述

    linux内核网络子系统初探-概述 一.网络模型 简单介绍 学习网络时,必定能在各种教材资料里见到以下三种网络模型: 三种模型间的差异: OSI七层模型是理论上的网络模型,从功能方面分成了相对独立的7 ...

  9. Linux内核crypto子系统的调用逻辑

    testmgr.c - crypto/testmgr.c - Linux source code (v5.15.11) - Bootlin 上述代码是内核内部即crypto子系统对外提供密码服务的测试 ...

最新文章

  1. 软考自查:多媒体基础知识
  2. 配置nginx,支持php的pathinfo路径模式
  3. spring 源码分析01
  4. PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
  5. 如何安装并启动django
  6. 6.22打包建立ISS虚拟目录,安装完运行你想运行的程序
  7. 2022最新Spring相关大厂常问技术面试题大全 —— 金三银四好时机
  8. 支持markdown的服务器,基于tornado实现的一个markdown解析服务器
  9. centos 中设置网卡等相关参数
  10. Python使用UDP广播实现服务器自动发现
  11. 写笔记插件_Java程序员笔记(知识)管理的一点经验
  12. 零基础如何用 15 行 Python 代码搞定网易云热门歌单?
  13. 洛谷 P3404 斐波那契(线段树)
  14. Python3—元组
  15. C# - ZIP 压缩流
  16. 删除VS工程下的临时文件
  17. uniapp vite 路由跳转、登录模块封装(非无感登录)
  18. CGI编程学习----查询2000W开房数据
  19. 盘点2022年大数据技术下常用的20个可视化工具,值得收藏
  20. Windows无法启动MapGIS DataStorage Service服务

热门文章

  1. clion 查看内容窗口_苹果电脑(macOS)查看 WiFi 密码的两种方法
  2. MapReduce改造fp-growth算法
  3. java 静态代码块和spring @value注解注入执行顺序
  4. Android之Notification初识
  5. vue-router 路由跳转
  6. 封装(构造方法,构造器)
  7. 计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力
  8. 2018-2019-2-20175225 实验四《Android开发基础》实验报告
  9. [USACO 2017 Feb Gold] Tutorial
  10. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)