首页 > 其他分享 >IC2总线及驱动

IC2总线及驱动

时间:2023-04-05 23:22:20浏览次数:33  
标签:I2C fsl 总线 驱动 init imx IC2 i2c

I2C总线

I2C总线和 platform 总线非常类似,platform 总线初始化位置如下:

kernel_init();
    kernel_init_freeable();
        do_basic_setup();
            driver_init();
                platform_bus_init();

 

I2C总线是作为一个模块进行初始化

postcore_initcall(i2c_init);
 #define postcore_initcall(fn)       __define_initcall(fn, 2)

 

由此可见,platform 总线不可或缺,I2C总线是可以被裁剪的。

 

I2C总线的全局变量如下:

 

 

I2C适配器

每一个soc上基本都会有一个或者多个I2C控制器,每一个I2C控制器下面接的就是SCL 和 SDA 两条线。I2C设备设备都是挂在这两条线下面的,这就是就硬件层的基本结构。

硬件层的上面就是Linux内核中的适配器驱动层,每一个soc厂家都会在Linux框架上实现自家IIC控制的的驱动程序,这部分是由soc厂家的bsp工程师提供的。其实就是根据I2C控制器的寄存器操作实现了如何将数据送到I2C总线下的设备中去,以及怎么读取数据。厂家将这一层封装好,驱动工程师写驱动的时候就只需要根据具体的I2C设备来读写数据,不需要自己来实现I2C时序。简单点就说设备驱动只负责准备要发的数据,告诉适配器就可以了。至于怎么发就是厂家自己去实现了,毕竟只有他们才最熟悉自家的芯片。

 

I2C适配器就是根据设备树提供的I2C控制器信息配置芯片,如下i2c1

            i2c1: i2c@21a0000 {
                #address-cells = <1>;
                #size-cells = <0>;
                compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
                reg = <0x021a0000 0x4000>;
                interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clks IMX6UL_CLK_I2C1>;
                status = "disabled";
            };

 

&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";

    magnetometer@e {
        compatible = "fsl,mag3110";
        reg = <0x0e>;
        vdd-supply = <&reg_peri_3v3>;
        vddio-supply = <&reg_peri_3v3>;
        position = <2>;
    };

    fxls8471@1e {
        compatible = "fsl,fxls8471";
        reg = <0x1e>;
        position = <0>;
        interrupt-parent = <&gpio5>;
        interrupts = <0 8>;
    };
};

 

static const struct of_device_id i2c_imx_dt_ids[] = {
    { .compatible = "fsl,imx1-i2c", .data = &imx1_i2c_hwdata, },
    { .compatible = "fsl,imx21-i2c", .data = &imx21_i2c_hwdata, },
    { .compatible = "fsl,vf610-i2c", .data = &vf610_i2c_hwdata, },
    { .compatible = "fsl,imx7d-i2c", .data = &imx7d_i2c_hwdata, },
    { /* sentinel */ }
};

static struct platform_driver i2c_imx_driver = {
    .probe = i2c_imx_probe,
    .remove = i2c_imx_remove,
    .driver = {
        .name = DRIVER_NAME,
        .pm = &i2c_imx_pm_ops,
        .of_match_table = i2c_imx_dt_ids,
        .acpi_match_table = i2c_imx_acpi_ids,
    },
    .id_table = imx_i2c_devtype,
};

static int __init i2c_adap_imx_init(void) {     return platform_driver_register(&i2c_imx_driver); } subsys_initcall(i2c_adap_imx_init);
 

 

i2c_adap_imx_init() 是芯片厂家提供的适配器驱动,设备和驱动匹配执行 i2c_imx_probe() ,内容有:

添加 i2c_adapter_type 类型设备到 I2C 总线 (bus_add_device)

添加 i2c_client_type 类型设备到 I2C 总线

 

至此,soc上的adapter就和client进行了一个一一对应的绑定,而且都注册进内核总线上了。有多少个硬件adapter就会在总线上注册多少个client。

 

 

标签:I2C,fsl,总线,驱动,init,imx,IC2,i2c
From: https://www.cnblogs.com/god-of-death/p/17291278.html

相关文章

  • 03-总线
    03-总线为什么需要总线?各个部件之间需要进行信息的传递,如果使用传输线将所有需要连接的设备都连接起来,那么cpu可能要跟数百个部件连接,在电路板上印刷电路成本很高。体积也会比较巨大,难以维护什么是总线?总线是连接各个部件的信息传输线,是各个部件共享的传输介质当前的总线结......
  • L298N驱动板使用
                    引脚功能ENA,ENB使能端,输入PWM信号IN1,IN2电机A输入端,TTL逻辑电平信号OUT1,OUT2电机A输出端,与对应输入端同逻辑IN3,IN4电机B输入端,TTL逻辑电平信号OUT3,OUT4电机B输出端,与对应输入端同逻辑VCC(12V)+12V输......
  • 联想拯救者Y9000P 2023版 双系统ubuntu安装nvidia显卡驱动、cuda及cudnn简明教程
    前言对于从事机器学习、深度学习、图像处理、自然语言处理等科研与工作的小伙伴们,ubuntu系统是一个不错的选择,本人前几天入手拯救者y9000p2023版本,配置为:RTX406016G13代i913900HX,由于我从事智能驾驶工作,电脑到之后就安装了ubuntu双系统,本篇文章将为大家介绍一下ubuntu安装nvi......
  • 科技发展的未来:探索数据驱动的智能科技创新
    科技的快速发展,我们的生活也变得越来越依赖科技。从智能手机到智能家居,从人工智能到大数据,科技正在改变着我们的生活方式和工作方式。在这个快速变化的世界中,数据驱动的智能科技创新成为了科技发展的未来方向。一、数据驱动的智能科技创新数据驱动的智能科技创新是指利用大数据......
  • Qt6编译MySQL驱动最简单方法
    最近qt发布最新lts版本qt6.5,就想下来试试新功能。qt版本6.5.0,安装目录E:\Qt\6.5.0mysql版本8.0,安装目录C:\MySQL_Server_8.0,或者直接下连接器解压也可以:MySQL::DownloadMySQLConnector/C(ArchivedVersions)需要额外安装qt的sources源组件,忘了也没关系,在cmd下进入包含Main......
  • 总线概念辨析
    总线概念辨析总线是什么​ 总线就是一组线,上面挂了许多部件,部件可以通过总线进行数据传输。具体定义如下:总线是一组能为多个部件分时共享的公共信息传送线路。这里要注意:​ 分时:一个时段只能由一个主设备使用总线​ 共享:总线可以让多个部件共同使用总线有哪些​ 分类......
  • 事件驱动
    事件驱动事件驱动系统呼应怎么当下业务博大以小发生每刻.spring能拿捏事件并能开发亻建app围绕他们,意味你app保持同步同你业务.spring有若干事件驱动项可选,从整合和串直到cloud功能和历流.事件驱动微服务当加上微服务,事件串打开兴奋机会-事件驱动架构就是一普通例子.spring......
  • 领域驱动设计(DDD)实践之路(二):事件驱动与CQRS
    vivo互联网技术微信公众号 作者:wenbozhang【领域驱动设计实践之路】系列往期精彩文章:《领域驱动设计(DDD)实践之路(一)》主要讲述了战略层面的DDD原则。这是“领域驱动设计实践之路”系列的第二篇文章,分析了如何应用事件来分离软件核心复杂度。探究CQRS为什么广泛应用于DDD项......
  • 领域驱动设计(DDD)实践之路(一)
    vivo互联网技术微信公众号 作者:张文博领域驱动设计(DomainDrivenDesign,DDD)其实并非新理论,大家可以看看EricEvans编著的《领域驱动设计》原稿首版是2003年,距今已十余年时间。与现在的分布式、微服务相比,绝对是即将步入中年的“老家伙”了。直到近些年微服务理论被提出、被......
  • 技嘉GA7PESH3主板,官网驱动下载,官方使用说明
    主板如图驱动下载服务器主板驱动比较难找,这里给出官网地址http://b2b.gigabyte.com/products/product-page.aspx?pid=4468#dl用户手册也在那个地址,选择一下就好了https://download.gigabyte.com/FileList/Manual/server_manual_7pesh3_sc_1001.pdf......