上一篇博客中介绍了lk中i2c的配置,因为在lk中直接对硬件进行控制,所以很多寄存器和时钟之类的要自己配置,一些函数也要自己实现。在kernel中就方便的多了,因为在kernel中i2c的逻辑控制、时序控制等都已经写好了,只要直接调用就可以了,接下来一起看一下。
以i2c0为例
路径:kernel/arch/arm/boot/dts/qcom/msm8916.dtsi
aliases {
i2c0 = &i2c_0;
}
i2c_0: i2c@78b6000 { /* BLSP1 QUP2 */
compatible = "qcom,i2c-msm-v2";
#address-cells = <1>;
#size-cells = <0>;
reg-names = "qup_phys_addr";
reg = <0x78b6000 0x600>;
interrupt-names = "qup_irq";
interrupts = <0 96 0>;
clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
<&clock_gcc clk_gcc_blsp1_qup2_i2c_apps_clk>;
clock-names = "iface_clk", "core_clk";
qcom,clk-freq-out = <100000>;
qcom,clk-freq-in = <19200000>;
pinctrl-names = "i2c_active", "i2c_sleep";
pinctrl-0 = <&i2c_0_active>;
pinctrl-1 = <&i2c_0_sleep>;
qcom,noise-rjct-scl = <0>;
qcom,noise-rjct-sda = <0>;
dmas = <&dma_blsp1 6 64 0x20000020 0x20>,
<&dma_blsp1 7 32 0x20000020 0x20>;
dma-names = "tx", "rx";
qcom,master-id = <86>;
};
这是i2c0的一些基础配置,接下来是引脚配置
路径:kernel/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi
&soc{
pmx_i2c_0 {
/* CLK, DATA */
qcom,pins = <&gp 7>, <&gp 6>;
qcom,num-grp-pins = <2>;
qcom,pin-func = <3>;
label = "pmx_i2c_0";
i2c_0_active: i2c_0_active {
drive-strength = <16>; /* 2 MA */
bias-disable; /* No PULL */
};
i2c_0_sleep: i2c_0_sleep {
drive-strength = <16>; /* 2 MA */
bias-disable; /* No PULL */
};
};
}:
到这里i2c就配置好了,那如何调用呢?
路径:kernel/arch/arm/boot/dts/qcom/msm8916-cdp.dtsi
比如设备是:adb@20{ };可进行如下调用
i2c@78b6000 {
adb@20{ };
};
到这kernel中的i2c的配置和调用就完了。一定要注意是否有引脚复用,如果发现配置没有错误,但就是没反应,那就去查一下是否引脚复用了,有的话先屏蔽掉,然后看看是否生效。