i2c_adapter
的过程I2C单独控制的话,占用CPU的时间非常高,这样不利于系统高效运转,所以一般的芯片里面都会有I2C控制器。
I2C控制器里面一般会有很多的寄存器。比如:
controller_register
可以设置I2C控制器的频率tx_register
、rx_register
控制数据的传输status_register
控制I2C
的状态int_register
控制I2C
的中断tx_register
。后面的I2C控制器会自动帮忙做好,在SDA
上发送数据。tx_register
后,就不用管了。直到数据发送结束,会产生一个发送完成的中断I2C_IFDR
(频率寄存器)I2C_I2CR
(控制寄存器I2C_I2SR
(状态寄存器)I2C_I2DR
(数据I/O寄存器)I2C_IADR
(地址寄存器imx6ull:arch/arm/boot/dts/imx6ull.dtsi
i2c1: i2c@02221a0000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = <"fsl,imx6ul-i2c", "fsl,imx21-i2c";
reg = <0x021a0000 0x40000>;
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_I2C1>;
status = "disabled"; //在100ask_imx6ull-14x14.dts 把它改成了"okay"
};
Linux下的i2c框架,分为了3个子模块
I2C
总线驱动重点是 I2C
适配器(也就是 SOC 的 I2C 接口控制器)驱动,这里要用到
两个重要的数据结构:i2c_adapter
和 i2c_algorithm
,Linux 内核将 SOC 的 I2C 适配器(控制器)
抽象成 i2c_adapter
,i2c_adapter
结构体定义在 include/linux/i2c.h
文件中。
498 struct i2c_adapter {
499 struct module *owner;
500 unsigned int class; /* classes to allow probing for */
501 const struct i2c_algorithm *algo; /* 总线访问算法 */
502 void *algo_data;
503
504 /* data fields that are valid for all devices */
505 struct rt_mutex bus_lock;
506
507 int timeout; /* in jiffies */
508 int retries;
509 struct device dev; /* the adapter device */
510
511 int nr;
512 char name[48];
513 struct completion dev_released;
514
515 struct mutex userspace_clients_lock;
516 struct list_head userspace_clients;
517
518 struct i2c_bus_recovery_info *bus_recovery_info;
519 const struct i2c_adapter_quirks *quirks;
520 };
紧接着上篇文章《Linux I2C子系统【1】-I2C驱动分析-设备树创建platform_device》中的“i2c platform_driver主机驱动匹配platform_device 的过程”
,.probe = i2c_imx_probe
被执行,进入到开始创建i2c_adapter
过程中。
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。