移植-外设接口
1. I2C
- 在 APLUX 板子上有四组 I2C 在使用,通过以下命令查看对应节点:
bash
sh-5.1# ls -l /sys/bus/i2c/devices/i2c*
total 0
lrwxrwxrwx 1 root root 0 Jun 5 22:37 i2c-0 -> ../../../../devices/platform/soc/9c0000.qcom,qupv3_i2c_geni_se/988000.i2c/i2c-0
lrwxrwxrwx 1 root root 0 Jun 5 22:37 i2c-1 -> ../../../../devices/platform/soc/9c0000.qcom,qupv3_i2c_geni_se/98c000.i2c/i2c-1
lrwxrwxrwx 1 root root 0 Jun 5 22:37 i2c-2 -> ../../../../devices/platform/soc/9c0000.qcom,qupv3_i2c_geni_se/990000.i2c/i2c-2
lrwxrwxrwx 1 root root 0 Jun 5 22:37 i2c-3 -> ../../../../devices/platform/soc/ac0000.qcom,qupv3_1_geni_se/a90000.i2c/i2c-3
lrwxrwxrwx 1 root root 0 Jun 5 22:37 i2c-4 -> ../../../../devices/platform/soc/ae90000.qcom,dp_display/i2c-4所对应的硬件信息
| 设备名称 | 基地址 | GPIO | 设备树节点 |
|---|---|---|---|
| i2c-0 | 988000 | 20/21 | qupv3_hub_i2c2 |
| i2c-1 | 98c000 | 22/23 | qupv3_hub_i2c3 |
| i2c-2 | 990000 | 4/5 | qupv3_hub_i2c4 |
| i2c-3 | a90000 | 44/45 | qupv3_se4_i2c |
修改示例:RTC 芯片 INS5830B
使用的 I2C 引脚为 GPIO20 和 GPIO21。
kalama-pinctrl.dtsi 中配置了这两个引脚的 I2C 复用:
qupv3_hub_i2c2_pins: qupv3_hub_i2c2_pins {
qupv3_hub_i2c2_sda_active: qupv3_hub_i2c2_sda_active {
mux {
pins = "gpio20";
function = "i2chub0_se2_l0";
};
config {
pins = "gpio20";
drive-strength = <2>;
bias-pull-up;
qcom,i2c_pull;
};
};
qupv3_hub_i2c2_scl_active: qupv3_hub_i2c2_scl_active {
mux {
pins = "gpio21";
function = "i2chub0_se2_l1";
};
config {
pins = "gpio21";
drive-strength = <2>;
bias-pull-up;
qcom,i2c_pull;
};
};
};kalama-qupv3.dtsi 中配置了 qupv3_hub_i2c2 的设备树节点,引用了上述 pinctrl:
qupv3_hub_i2c2: i2c@988000 {
compatible = "qcom,i2c-geni";
reg = <0x988000 0x4000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI 466 IRQ_TYPE_LEVEL_HIGH>;
clock-names = "se-clk", "core-clk";
clocks = <&gcc GCC_QUPV3_I2C_S2_CLK>,
<&gcc GCC_QUPV3_I2C_CORE_CLK>;
interconnect-names = "qup-core", "qup-config";
interconnects =
<&clk_virt MASTER_QUP_CORE_0 &clk_virt SLAVE_QUP_CORE_0>,
<&gem_noc MASTER_APPSS_PROC &config_noc SLAVE_I2C>;
pinctrl-names = "default", "sleep";
pinctrl-0 = <&qupv3_hub_i2c2_sda_active>, <&qupv3_hub_i2c2_scl_active>;
pinctrl-1 = <&qupv3_hub_i2c2_sleep>;
qcom,i2c-hub;
status = "disabled";
};kalamap-rb5-gen2.dtsi 中在 qupv3_hub_i2c2 下配置了 RTC 的设备树节点:
&qupv3_hub_i2c2 {
status = "ok";
#address-cells = <1>;
#size-cells = <0>;
ins5830b: ins5830b@32 {
compatible = "dptel,rtc-ins5830b";
reg = <0x32>;
pinctrl-names = "default";
pinctrl-0 = <&ins5830b_int_default>;
interrupt-parent = <&tlmm>;
interrupts = <14 IRQ_TYPE_EDGE_FALLING>;
};
};2. SPI
- 在 APLUX 板子上有四组 SPI 在使用,通过以下命令查看对应节点:
bash
sh-5.1# ls -l /sys/bus/spi/devices/
total 0
lrwxrwxrwx 1 root root 0 Jun 11 06:45 spi0.0 -> ../../../../devices/platform/soc/ac0000.qcom,qupv3_1_geni_se/a84000.spi/spi_master/spi0/spi0.0
lrwxrwxrwx 1 root root 0 Jun 11 06:45 spi1.0 -> ../../../../devices/platform/soc/ac0000.qcom,qupv3_1_geni_se/a88000.spi/spi_master/spi1/spi1.0
lrwxrwxrwx 1 root root 0 Jun 11 07:16 spi2.0 -> ../../../../devices/platform/soc/8c0000.qcom,qupv3_2_geni_se/888000.spi/spi_master/spi2/spi2.0
lrwxrwxrwx 1 root root 0 Jun 11 07:16 spi3.0 -> ../../../../devices/platform/soc/8c0000.qcom,qupv3_2_geni_se/894000.spi/spi_master/spi3/spi3.0所对应的硬件信息
| 设备名称 | 基地址 | GPIO | 设备树节点 |
|---|---|---|---|
| spi0.0 | a84000 | 32/33/34/35 | qupv3_se1_spi |
| spi1.0 | a88000 | 36/37/38/39 | qupv3_se2_spi |
| spi2.0 | 888000 | 64/65/66/67 | qupv3_se10_spi |
| spi3.0 | 894000 | 80/81/82/83 | qupv3_se13_spi |
修改示例:CAN 芯片 MCP2518
使用的 SPI 引脚为 GPIO32 ~ GPIO35(TZ 中配置了 SE1 的 QUP 类型为 SPI)。
kalama-pinctrl.dtsi 中配置了这几个引脚的 QUP 复用:
qupv3_se1_spi_pins: qupv3_se1_spi_pins {
qupv3_se1_spi_miso_active: qupv3_se1_spi_miso_active {
mux {
pins = "gpio32";
function = "qup1_se1_l0";
};
config {
pins = "gpio32";
drive-strength = <6>;
bias-disable;
};
};
qupv3_se1_spi_mosi_active: qupv3_se1_spi_mosi_active {
mux {
pins = "gpio33";
function = "qup1_se1_l1";
};
config {
pins = "gpio33";
drive-strength = <6>;
bias-disable;
};
};
qupv3_se1_spi_clk_active: qupv3_se1_spi_clk_active {
mux {
pins = "gpio34";
function = "qup1_se1_l2";
};
config {
pins = "gpio34";
drive-strength = <6>;
bias-disable;
};
};
qupv3_se1_spi_cs_active: qupv3_se1_spi_cs_active {
mux {
pins = "gpio35";
function = "qup1_se1_l3";
};
config {
pins = "gpio35";
drive-strength = <6>;
bias-disable;
};
};
};kalama-qupv3.dtsi 中配置了 qupv3_se1_spi 的设备树节点:
qupv3_se1_spi: spi@a84000 {
compatible = "qcom,spi-geni";
reg = <0xa84000 0x4000>;
#address-cells = <1>;
#size-cells = <0>;
reg-names = "se_phys";
interrupts = <GIC_SPI 354 IRQ_TYPE_LEVEL_HIGH>;
clock-names = "se-clk";
clocks = <&gcc GCC_QUPV3_WRAP1_S1_CLK>;
interconnect-names = "qup-core", "qup-config", "qup-memory";
interconnects =
<&clk_virt MASTER_QUP_CORE_1 &clk_virt SLAVE_QUP_CORE_1>,
<&gem_noc MASTER_APPSS_PROC &config_noc SLAVE_QUP_1>,
<&aggre1_noc MASTER_QUP_1 &mc_virt SLAVE_EBI1>;
pinctrl-names = "default", "sleep";
pinctrl-0 = <&qupv3_se1_spi_mosi_active>, <&qupv3_se1_spi_miso_active>,
<&qupv3_se1_spi_clk_active>, <&qupv3_se1_spi_cs_active>;
pinctrl-1 = <&qupv3_se1_spi_sleep>;
dmas = <&gpi_dma1 0 1 1 64 0>,
<&gpi_dma1 1 1 1 64 0>;
dma-names = "tx", "rx";
spi-max-frequency = <50000000>;
status = "disabled";
};kalamap-rb5-gen2.dtsi 中在 qupv3_se1_spi 下配置了 MCP2518 的设备树节点:
&qupv3_se1_spi {
status = "okay";
can@0 {
compatible = "microchip,mcp2518fd";
reg = <0>;
clocks = <&clk40M>;
interrupts-extended = <&tlmm 56 IRQ_TYPE_LEVEL_LOW>;
interrupt-names = "can_irq";
spi-max-frequency = <10000000>;
gpio-controller;
vdd-supply = <&L14B>;
xceiver-supply = <&L14B>;
status = "ok";
};
};