我想将linux,rs485-enabled-at-boot-time;
标志/参数传递给sc16is752
此设备树覆盖定义的设备的串行端口驱动程序配置(来自 Raspbian 的未修改文件):
/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";
};
};
SC16IS752是一个具有很少 GPIO 引脚和两个 UART 接口的芯片,具有硬件 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 并将此行(dtoverlay=sc16is752-ses,int_pin=24
而不是dtoverlay=sc16is752-spi1,int_pin=24
Raspbian 的原始覆盖)放在 /boot/config.txt 中。
重新启动后,我检查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++ 中启用此功能,并且它有效,所以我的硬件没问题。