[英]Enable RS485 mode for max310x SPI-UART converter
在我的應用程序中,我需要 RS485 接口。 我正在使用 am3352 的一些 UART,但我需要更多,所以我正在嘗試使用 SPI 和 max3109 芯片進行擴展。
我已經使用模塊 max310x 成功地將 max3109 添加到我的設備樹 - 它顯示了兩個設備:/dev/ttyMAX0 和 /dev/ttyMAX1。 這是設備樹片段:
&spi1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi1_pins>;
num_cs = <1>;
cs-gpios = <&gpio2 17 0>;
ti,pindir-d0-out-d1-in;
max310x_0: max0@0 {
compatible = "maxim,max3109";
reg = <0>;
spi-max-frequency = <24000000>;
clocks = <&clk1m8>;
clock-names = "xtal";
interrupt-parent = <&gpio2>;
interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
gpio-controller;
#gpio-cells = <2>;
clk1m8: clk1m8 {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1843200>;
};
};
};
和引腳:
spi1_pins: pinmux_spi1_pins {
pinctrl-single,pins = <
0x108 (PIN_INPUT_PULLUP | MUX_MODE2) /* (H16) gmii1_col.spi1_sclk */
0x10c (PIN_INPUT_PULLUP | MUX_MODE2) /* (H17) gmii1_crs.spi1_d0 */
0x110 (PIN_INPUT_PULLUP | MUX_MODE2) /* (J15) gmii1_rxer.spi1_d1 */
>;
};
max3109 的 UART 連接到 rs232/rs485 轉換器,max3109 的 RTSn 引腳連接到 DE 和 RE 引腳。
問題:max3109 上的 UARTS 似乎工作正常 - 兩個 rs485 都在傳輸數據,但沒有接收。 問題是 RTS 始終處於 0V 電平...
在 am3352 的 UART 中,我在設備樹中使用以下屬性:“linux,rs485-enabled-at-boot-time”。 但是將它添加到主要的 max310x_0 節點沒有任何效果——這個節點是擴展器節點(包含 2 個 UART 和 gpio 控制器),而不是 UART 本身。
我的想法是我需要為每個 UART 添加一個子節點,並在其中放置屬性“linux,rs485-enabled-at-boot-time”。 但我不知道該怎么做。 我試過這樣的事情:
&spi1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi1_pins>;
num_cs = <1>;
cs-gpios = <&gpio2 17 0>;
ti,pindir-d0-out-d1-in;
max310x_0: max0@0 {
compatible = "maxim,max3109";
reg = <0>;
spi-max-frequency = <24000000>;
clocks = <&clk1m8>;
clock-names = "xtal";
interrupt-parent = <&gpio2>;
interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
gpio-controller;
#gpio-cells = <2>;
clk1m8: clk1m8 {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1843200>;
};
ttyMAX0 {
linux,rs485-enabled-at-boot-time;
};
ttyMAX1 {
linux,rs485-enabled-at-boot-time;
};
};
};
但它沒有用。
我的問題:我應該如何添加這些子節點(如果這是正確的方法)以及我應該在它們中放置什么以使 RTS 工作?
編輯:在鋸末建議之后,似乎不可能在設備樹中添加 rs485 模式。 所以我嘗試將此功能添加到設備樹中,我想我開始了解這里的工作原理。 首先,我正在將port.flags
值打印到dmesg
,看起來我的小插入工作(有點) - 它根據設備樹中linux,rs485-enabled-at-boot-time
參數的存在來更改值。 這是我插入的代碼:
if (of_property_read_bool(dev->of_node, "linux,rs485-enabled-at-boot-time"))
s->p[i].port.flags |= SER_RS485_ENABLED;
printk("s->p[i].port.flags is: %d\n",s->p[i].port.flags);
值port.flags
切換從134225920
到134225921
取決於存在linux,rs485-enabled-at-boot-time
。 但是 RTS 引腳在我的示波器上仍然具有恆定的 0V SER_RS485_RTS_ON_SEND
...我想弄清楚SER_RS485_RTS_ON_SEND
和SER_RS485_RTS_AFTER_SEND
是否與此有關,但我確信它僅用於恢復 RTS 信號。
經過幾次嘗試, IOCTL是最好和最簡單的解決方案。 這是一些對我有很大幫助的示例代碼。 https://gist.github.com/amarburg/07564916d8d32e20e6ae375c1c83a995
這是如何使用IOCTL打開和關閉 RS485 模式並讀取其當前模式的基本示例。 適用於兩個 CPU 內部 UARTS 和 MAX3109。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.