장치 트리 및 특정 장치 재정의에서 직렬 드라이버로 매개변수 전달

장치 트리 및 특정 장치 재정의에서 직렬 드라이버로 매개변수 전달

이 장치 트리 오버레이(Raspbian의 수정되지 않은 파일)에 의해 정의된 장치에 대한 직렬 포트 드라이버 구성 linux,rs485-enabled-at-boot-time;에 플래그/매개변수를 전달 하고 싶습니다 .sc16is752

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";

    fragment@0 {
        target = <&gpio>;
        __overlay__ {
            spi1_pins: spi1_pins {
                brcm,pins = <19 20 21>;
                brcm,function = <3>; /* alt4 */
            };

            spi1_cs_pins: spi1_cs_pins {
                brcm,pins = <18>;
                brcm,function = <1>; /* output */
            };
        };
    };

    fragment@1 {
        target = <&spi1>;
        frag1: __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            pinctrl-names = "default";
            pinctrl-0 = <&spi1_pins &spi1_cs_pins>;
            cs-gpios = <&gpio 18 1>;
            status = "okay";


            sc16is752: sc16is752@0 {
                compatible = "nxp,sc16is752";
                reg = <0>; /* CE0 */
                clocks = <&sc16is752_clk>;
                interrupt-parent = <&gpio>;
                interrupts = <24 2>; /* IRQ_TYPE_EDGE_FALLING */
                gpio-controller;
                gpio-cells = <2>;
                spi-max-frequency = <4000000>;

                sc16is752_clk: sc16is752_clk {
                    compatible = "fixed-clock";
                    #clock-cells = <0>;
                    clock-frequency = <14745600>;
                };
            };
        };
    };

    fragment@2 {
        target = <&aux>;
        __overlay__ {
            status = "okay";
        };
    };

    __overrides__ {
      int_pin = <&sc16is752>,"interrupts:0";
    };
};

SC16IS752GPIO 핀이 거의 없고 UART 인터페이스가 2개 있는 칩이며 하드웨어 RS485를 지원하며 SC16IS752의 Linux 드라이버를 사용하면 다음과 같은 기능을 사용할 수 있습니다.

https://github.com/raspberrypi/linux/blob/04c8e47067d4873c584395e5cb260b4f170a99ea/drivers/tty/serial/sc16is7xx.c#L729(729행 참조)

SC16IS752의 장치 트리 바인딩에는 이러한 매개 변수가 없으므로 linux,rs485-enabled-at-boot-time;내부 sc16is752: sc16is752@0노드만 추가할 수는 없을 것 같습니다.

어떻게 통과할 수 있나요?

편집하다:

@Philippos 덕분에 약간의 진전이 있었습니다.

원본 sc16is752-spi1 오버레이 소스를 복사했습니다.RPi 커널 소스 코드(linux/arch/arm/boot/dts/overlays/ 어딘가에 있습니다).

linux,rs485-enabled-at-boot-time;나는 다음과 같이 frag1에 추가했습니다.

(...)

        frag1: __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            pinctrl-names = "default";
            pinctrl-0 = <&spi1_pins &spi1_cs_pins>;
            cs-gpios = <&gpio 18 1>;
            status = "okay";

            linux,rs485-enabled-at-boot-time; /* HERE */

(...)

이것이 내가 컴파일한 방법입니다:

dtc -O dtb -o sc16is752-ses.dtbo -b 0 -@ sc16is752-spi1-overlay-edited.dts

출력 파일을 /boot/overlays에 복사하고 이 줄( Raspbian의 원래 오버레이 dtoverlay=sc16is752-ses,int_pin=24대신 )을 /boot/config.txt에 배치했습니다.dtoverlay=sc16is752-spi1,int_pin=24

다시 시작한 후 sudo vcdbg log msg오버레이가 로드되었는지 확인합니다.

017319.445: brfs: File read: 1810 bytes
017327.250: brfs: File read: /mfs/sd/overlays/sc16is752-ses.dtbo
017346.010: Loaded overlay 'sc16is752-ses'
017346.065: dtparam: int_pin=24
019273.102: Device tree loaded to 0x2eff9400 (size 0x6b27)

나는 다음을 발견했다:

  • 내 크리스탈 시계 변경이 작동했지만(내 전송 속도가 엉망이었고 지금은 괜찮습니다) 로직 분석기에서 RTS 신호를 볼 수 없습니다.
  • RTS 라인이 낮지만(원래 재정의 시 높음) 데이터를 보낼 때 변경되지 않습니다.

어제 포트 플래그를 변경하여 C++에서 이 기능을 활성화하려고 시도했는데 제대로 작동했으므로 내 하드웨어는 괜찮습니다.

관련 정보