![장치 트리 및 특정 장치 재정의에서 직렬 드라이버로 매개변수 전달](https://linux55.com/image/160429/%EC%9E%A5%EC%B9%98%20%ED%8A%B8%EB%A6%AC%20%EB%B0%8F%20%ED%8A%B9%EC%A0%95%20%EC%9E%A5%EC%B9%98%20%EC%9E%AC%EC%A0%95%EC%9D%98%EC%97%90%EC%84%9C%20%EC%A7%81%EB%A0%AC%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EB%A1%9C%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%EC%A0%84%EB%8B%AC.png)
이 장치 트리 오버레이(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 드라이버를 사용하면 다음과 같은 기능을 사용할 수 있습니다.
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++에서 이 기능을 활성화하려고 시도했는데 제대로 작동했으므로 내 하드웨어는 괜찮습니다.