0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C控制器驱动介绍

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-22 15:38 次阅读

控制器驱动

I2C 总线驱动重点是 I2C 适配器驱动,这里要用到两个重要的数据结构:i2c_adapter 和 i2c_algorithm。其中,Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter。

对于一个 I2C 适配器,肯定要对外提供读写 API 函数,设备驱动程序可以使用这些 API 函数来完成读写操作。i2c_algorithm 就是 I2C 适配器与 I2C 设备进行通信的方法。

I2C 总线驱动,或者说 I2C 适配器驱动的主要工作就是初始化 i2c_adapter 结构体变量,然后设置 i2c_algorithm 中的 master_xfer 函数。完成以后通过 i2c_add_numbered_adapter 或 i2c_add_adapter 这两个函数向系统注册设置好的 i2c_adapter。

I2C 控制器驱动加载

设备树 mt6885.dts

图片

驱动

图片

驱动和设备树匹配以后,probe 函数开始执行,重要的地方博主都进行了注释,不重要的部分进行了删除。

static int mt_i2c_probe(struct platform_device *pdev)
{
 int ret = 0;
 struct mt_i2c *i2c; //控制器结构体
 unsigned int clk_src_in_hz;
 struct resource *res;
 const struct of_device_id *of_id;
  
  //申请内存
 i2c = devm_kzalloc(&pdev- >dev, sizeof(struct mt_i2c), GFP_KERNEL);

  //获取设备树节点
 ret = mt_i2c_parse_dt(pdev- >dev.of_node, i2c);

  //从设备树获取 I2C 控制器寄存器物理基地址
 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

  //进行内存映射,得到 Linux 内核使用的虚拟地址
 i2c- >base = devm_ioremap_resource(&pdev- >dev, res);

  .....
  
  //获取中断号
 i2c- >irqnr = platform_get_irq(pdev, 0);

 init_waitqueue_head(&i2c- >wait);

  //请求中断,中断服务函数为 mt_i2c_irq
 ret = devm_request_irq(&pdev- >dev, i2c- >irqnr, mt_i2c_irq,
  IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE, I2C_DRV_NAME, i2c);

 of_id = of_match_node(mtk_i2c_of_match, pdev- >dev.of_node);

  //填充 adapter 结构体各个参数
 i2c- >dev_comp = of_id- >data;
 i2c- >i2c_pll_info = &i2c_pll_info;
 i2c- >adap.dev.of_node = pdev- >dev.of_node;
 i2c- >dev = &i2c- >adap.dev;
 i2c- >adap.dev.parent = &pdev- >dev;
 i2c- >adap.owner = THIS_MODULE;
 i2c- >adap.algo = &mt_i2c_algorithm;
 i2c- >adap.algo_data = NULL;
 i2c- >adap.timeout = 2 * HZ;
 i2c- >adap.retries = 1;
 i2c- >adap.nr = i2c- >id;
 spin_lock_init(&i2c- >cg_lock);

  ......

 mutex_init(&i2c- >i2c_mutex);
 ret = i2c_set_speed(i2c, clk_src_in_hz);

 ret = mt_i2c_clock_enable(i2c);

 mt_i2c_init_hw(i2c);

 mt_i2c_clock_disable(i2c);
  
  // DMA 相关
 if (i2c- >ch_offset_default)
  i2c- >dma_buf.vaddr = dma_alloc_coherent(&pdev- >dev,
   (PAGE_SIZE * 2), &i2c- >dma_buf.paddr, GFP_KERNEL);
 else
  i2c- >dma_buf.vaddr = dma_alloc_coherent(&pdev- >dev,
   PAGE_SIZE, &i2c- >dma_buf.paddr, GFP_KERNEL);

 if (i2c- >dma_buf.vaddr == NULL) {
  dev_info(&pdev- >dev, "dma_alloc_coherent failn");
  return -ENOMEM;
 }
 i2c_set_adapdata(&i2c- >adap, i2c);
  
  //向 Linux 内核注册 i2c_adapter
 ret = i2c_add_numbered_adapter(&i2c- >adap);

 platform_set_drvdata(pdev, i2c);

 return 0;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16185

    浏览量

    177331
  • 驱动
    +关注

    关注

    12

    文章

    1824

    浏览量

    85168
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1481

    浏览量

    123238
收藏 人收藏

    评论

    相关推荐

    GPIO模拟I2C总线的驱动设计与实现

    I2C总线简单方便,是我们经常使用的一种总线。但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚来模拟低速的I2C总线通信。这一节我们就来实
    发表于 12-14 14:19 5323次阅读
    GPIO模拟<b class='flag-5'>I2C</b>总线的<b class='flag-5'>驱动</b>设计与实现

    实现I2C总线控制器的VHDL源代码

    I2C总线控制器 altera提供 The I2C Controller was designed for the MC68307 uC, provides a simplified
    发表于 05-20 10:25 251次下载

    I2C总线在Linux系统中的驱动设计

    介绍I2C总线的基本概念和工作原理,叙述I2C总线扩展器件ZLG7290的功能特点。在以S3C2410为微控制器,ZLG7290为
    发表于 12-29 16:52 40次下载

    MAXQ2000微控制器软件I2C驱动

    摘要:;C (内置于集成电路)是一种2线接口,实现集成电路之间的双向通信。本应用笔记介绍MAXQ2000微控制器的软件
    发表于 04-23 10:17 711次阅读
    MAXQ2000微<b class='flag-5'>控制器</b>软件<b class='flag-5'>I2C</b><b class='flag-5'>驱动</b>

    基于Verilog的I2C控制器的设计与综合

    为满足嵌入式系统中专用芯片功能不能达到系统要求的现状,设计出一种功能可扩展的I2C slave控制器,这种控制器与传统的专用I2C芯片不同。专用的I
    发表于 10-25 16:58 60次下载
    基于Verilog的<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>的设计与综合

    I2C控制器使用指南

    确保I2C控制器已经和计算机连接,如果没有连接或驱动没有正常安装则在选择设备栏将出现如下提示。
    发表于 03-08 14:48 50次下载
    <b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>使用指南

    I2C总线控制器的工作原理及EEPROM的Linux驱动程序的设计

    I2C (Inter-Integrated Circuit1总线是一种由Philips公司开发的2线式串行总线,用于连接微控制器及其外围设备。它是同步通信的一种特殊形式,具有接口线少、控制
    发表于 10-26 15:37 7次下载
    <b class='flag-5'>I2C</b>总线<b class='flag-5'>控制器</b>的工作原理及EEPROM的Linux<b class='flag-5'>驱动</b>程序的设计

    fireflyFace-RK3399主板I2C控制器介绍

    Face-RK3399 开发板上有 9 个片上 I2C 控制器
    的头像 发表于 12-04 09:17 2926次阅读
    fireflyFace-RK3399主板<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b><b class='flag-5'>介绍</b>

    i2c总线用来做什么_i2c总线数据传输过程

    I2C总线控制器为微控制器或微处理提供控制I2C总线的接口,它
    发表于 11-24 14:16 7216次阅读

    Linux驱动I2C设备驱动(基于Freescale i.MX6ULL平台了解I2C驱动框架,顺便写个简陋的MPU6050驱动

    I2C总线驱动加载到内核的过程3.2 I2C总线驱动如何操作硬件3.3 I2C设备 <----->
    发表于 12-06 13:51 8次下载
    Linux<b class='flag-5'>驱动</b>:<b class='flag-5'>I2C</b>设备<b class='flag-5'>驱动</b>(基于Freescale <b class='flag-5'>i</b>.MX6ULL平台了解<b class='flag-5'>I2C</b>的<b class='flag-5'>驱动</b>框架,顺便写个简陋的MPU6050<b class='flag-5'>驱动</b>)

    嵌入式内核及驱动开发-09IIC子系统框架使用(I2C协议和时序,I2C驱动框架,I2C从设备驱动开发,MPU6050硬件连接

    从设备adapter i2c 控制器对象数据包对象读写数据设备树中添加MPU6050信息内核选配添加设备树节点编写驱动程序 mpu6050_i2c_drv.cI2c协议和时序
    发表于 12-06 14:06 17次下载
    嵌入式内核及<b class='flag-5'>驱动</b>开发-09IIC子系统框架使用(<b class='flag-5'>I2C</b>协议和时序,<b class='flag-5'>I2C</b><b class='flag-5'>驱动</b>框架,<b class='flag-5'>I2C</b>从设备<b class='flag-5'>驱动</b>开发,MPU6050硬件连接

    linux移植MPU6050的I2C驱动

    有MPU6050的例程,测试后很好用,如下图(梦幻联动一下:树莓派PICO+freeRTOS)因为pico上有现成的能用的例程,所以改一改之后直接移植到linux上首先介绍一下linux下的I2C框架①、I2C 总线
    发表于 12-06 14:21 10次下载
    linux移植MPU6050的<b class='flag-5'>I2C</b><b class='flag-5'>驱动</b>

    硬件I2C与模拟I2C

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的
    发表于 12-28 19:14 81次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    Linux I2C驱动入门知识科普

    I2C 总线驱动I2C总线驱动就是SOC的 I2C控制器
    的头像 发表于 12-29 13:59 1643次阅读

    I2C子系统SW Architecture

    适配器(控制器驱动,这里用到两个重要的数据结构:i2c_adapter 和 i2c_algorithm。其中,Linux 内核将 SOC 的 I
    的头像 发表于 07-22 16:01 908次阅读
    <b class='flag-5'>I2C</b>子系统SW Architecture