Linux에서 "누락된" i2c 인터페이스를 추가하는 방법은 무엇입니까?

Linux에서 "누락된" i2c 인터페이스를 추가하는 방법은 무엇입니까?

dmesg저는 Digi ConnectCore 6UL SBC Pro를 활용하는 임베디드 프로젝트를 작업 중이며 시작 시 아래와 같이 3개의 I2C 인터페이스가 표시되어야 한다는 것을 알고 있습니다 .

i2c i2c-0: IMX I2C adapter registered
i2c i2c-0: can't use DMA, using PIO instead.
i2c i2c-1: IMX I2C adapter registered
i2c i2c-1: can't use DMA, using PIO instead.
i2c i2c-2: IMX I2C adapter registered
i2c i2c-2: can't use DMA, using PIO instead.

내 이미지를 부팅했는데 잘 부팅되었지만 3개가 아닌 2개의 인터페이스만 있습니다.

i2c i2c-0: IMX I2C adapter registered
i2c i2c-0: can't use DMA, using PIO instead.
i2c i2c-1: IMX I2C adapter registered
i2c i2c-1: can't use DMA, using PIO instead.

세 번째 인터페이스가 어디에 있는지 알고 싶습니다. 또한 이는 i2cdetect다음과 같은 결과를 제공합니다. 원본 이미지:

# i2cdetect -l
i2c-1   i2c             21a4000.i2c                             I2C adapter
i2c-2   i2c             21a8000.i2c                             I2C adapter
i2c-0   i2c             21a0000.i2c                             I2C adapter

새 이미지와 비교:

# i2cdetect -l
i2c-1   i2c             21a4000.i2c                             I2C adapter
i2c-0   i2c             21a0000.i2c                             I2C adapter

커널이 주소 21a8000에서 I2C 인터페이스를 볼 수 없는 것 같습니다. 세 번째 I2C 장치도 볼 수 있도록 빌드를 수정하려면 어떻게 해야 합니까? 장치 트리 파일을 조사해 보았지만 이 문제를 어디에서 보고, 수정하고, 해결할 수 있는지 잘 모르겠습니다.

어떤 팁, 조언, 제안이라도 환영합니다!

/usr/local/dey-2.2~/tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/Documentation/devicetree/bounds/i2c/i2c-imx. 송신:

* Freescale Inter IC (I2C) and High Speed Inter IC (HS-I2C) for i.MX

Required properties:
- compatible :
  - "fsl,imx1-i2c" for I2C compatible with the one integrated on i.MX1 SoC
  - "fsl,imx21-i2c" for I2C compatible with the one integrated on i.MX21 SoC
  - "fsl,vf610-i2c" for I2C compatible with the one integrated on Vybrid vf610 SoC
- reg : Should contain I2C/HS-I2C registers location and length
- interrupts : Should contain I2C/HS-I2C interrupt
- clocks : Should contain the I2C/HS-I2C clock specifier

Optional properties:
- clock-frequency : Constains desired I2C/HS-I2C bus clock frequency in Hz.
  The absence of the property indicates the default frequency 100 kHz.
- dmas: A list of two dma specifiers, one for each entry in dma-names.
- dma-names: should contain "tx" and "rx".
- scl-gpios: specify the gpio related to SCL pin
- sda-gpios: specify the gpio related to SDA pin
- pinctrl: add extra pinctrl to configure i2c pins to gpio function for i2c
  bus recovery, call it "gpio" state

Examples:

i2c@83fc4000 { /* I2C2 on i.MX51 */
        compatible = "fsl,imx51-i2c", "fsl,imx21-i2c";
        reg = <0x83fc4000 0x4000>;
        interrupts = <63>;
};

i2c@70038000 { /* HS-I2C on i.MX51 */
        compatible = "fsl,imx51-i2c", "fsl,imx21-i2c";
        reg = <0x70038000 0x4000>;
        interrupts = <64>;
        clock-frequency = <400000>;
};

i2c0: i2c@40066000 { /* i2c0 on vf610 */
        compatible = "fsl,vf610-i2c";
        reg = <0x40066000 0x1000>;
        interrupts =<0 71 0x04>;
        dmas = <&edma0 0 50>,
                <&edma0 0 51>;
        dma-names = "rx","tx";
        pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c1>;
        pinctrl-1 = <&pinctrl_i2c1_gpio>;
        scl-gpios = <&gpio5 26 GPIO_ACTIVE_HIGH>;
        sda-gpios = <&gpio5 27 GPIO_ACTIVE_HIGH>;
};

안녕하세요. 오랜 시간 공백을 겪게 되어 죄송하며 앞으로도 이 티켓을 계속 이용해주시기 바랍니다. @dirkt가 자신의 의견에서 제안한 대로 커널 소스에서 dts 및 dtsi 파일을 검색했지만 너무 많은 파일을 발견했습니다.

$ locate .dts | grep /arch/arm | grep /boot/dts | grep /usr/local/dey-2.2 | wc -l
1541

| grep -i i2c위의 내용 대신 추가해도 | wc -l결과가 나오지 않았습니다. 그렇다면 I2C장치 트리의 올바른 위치에 장치를 추가하는 방법을 알고 싶습니다 .

다음과 같은 관련 문서를 찾을 수 있습니다 *.dts.

$ find . -name "*imx6ul*.dts"
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-tx6ul-0011.dts
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-tx6ul-0010.dts
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-tx6ul-mainboard.dts

greping 후에는 i2c위에서 본 i2c 출력과 일치하는 파일이 하나도 없는 것 같습니다...:

$ find . -name "*imx6ul*.dts" | xargs grep -i i2c
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:&i2c1 {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:      pinctrl-0 = <&pinctrl_i2c1>;
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:&i2c2 {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:      pinctrl-0 = <&pinctrl_i2c2>;
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:&i2c3 {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:      pinctrl-0 = <&pinctrl_i2c3>;
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:      pinctrl_i2c1: i2c1grp {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:                      MX6UL_PAD_GPIO1_IO02__I2C1_SCL          0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:                      MX6UL_PAD_GPIO1_IO03__I2C1_SDA          0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:      pinctrl_i2c2: i2c2grp {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:                      MX6UL_PAD_UART5_TX_DATA__I2C2_SCL       0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:                      MX6UL_PAD_UART5_RX_DATA__I2C2_SDA       0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:      pinctrl_i2c3: i2c3grp {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:                      MX6UL_PAD_UART1_TX_DATA__I2C3_SCL       0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-pico-hobbit.dts:                      MX6UL_PAD_UART1_RX_DATA__I2C3_SDA       0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:&i2c2 {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:        pinctrl-0 = <&pinctrl_i2c2>;
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:        pinctrl_i2c1: i2c1grp {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:                        MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:                        MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:        pinctrl_i2c2: i2c2grp {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:                        MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-14x14-evk.dts:                        MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-tx6ul-mainboard.dts:&i2c_gpio {
./tmp/work/cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul-tx6ul-mainboard.dts:&i2c2 {

나는 다음을 발견했다: i2c@021a0000 { #address-cells = <1>; #size-cells = <0>; Compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c"; >;interrupt=<GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;clock=<&clks IMX6UL_CLK_I2C1>;status="disabled";};

                    i2c2: i2c@021a4000 {
                            #address-cells = <1>;
                            #size-cells = <0>;
                            compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
                            reg = <0x021a4000 0x4000>;
                            interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
                            clocks = <&clks IMX6UL_CLK_I2C2>;
                            status = "disabled";
                    };

                    i2c3: i2c@021a8000 {
                            #address-cells = <1>;
                            #size-cells = <0>;
                            compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
                            reg = <0x021a8000 0x4000>;
                            interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
                            clocks = <&clks IMX6UL_CLK_I2C3>;
                            status = "disabled";
                    };

그중에는 cortexa7hf-neon-dey-linux-gnueabi/linux-libc-headers/4.8-r0/linux-4.8/arch/arm/boot/dts/imx6ul.dtsi아마도 제가 작업 중인 장치 트리 파일이 있을 것입니다. 모든 i2c 인터페이스의 상태가 다음으로 설정되어 있다는 점은 주목할 가치가 있습니다."disabled"

답변1

*.dtbSD 카드에서 부팅한 경우 SD 카드 에서 파일을 찾을 수 있습니다 . 이 컴파일된 장치 트리 파일은 어떤 하드웨어를 사용할 수 있는지 커널에 알려줍니다. 이를 파일에서 컴파일된 사용자 정의 버전으로 바꿀 수 있습니다 *.dts.

업스트림 Linux 소스 코드에서 볼 수 있습니다.imx6ul-ccimx6ulsbcpro.dts이는 이사회의 선택이어야 합니다. 그러나 i2c1포함된 경우 에만 활성화되는 것 같습니다 .imx6ul.dtsi실제로 4개의 I2C 인터페이스가 있음을 알 수 있습니다.

최소한 업스트림 Linux 커널을 사용하는 경우 다음을 추가하여 세 번째 I2C 인터페이스를 활성화할 수 있어야 합니다 mx6ul-ccimx6ulsbcpro.dts.

&i2c3 {
    status = "okay";
};

그런 다음 make dtbs빌드 DTB를 실행합니다.

다음 명령을 사용하여 DTB를 디컴파일/컴파일할 수도 있습니다.직접.

관련 정보