国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RK3576內核485控制引腳修改解析

jf_44130326 ? 來源:Linux1024 ? 2026-02-01 16:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、先明確核心目標:修改要解決什么問題?

RS-485是半雙工通信,需要1方向控制GPIO”(高電平=發送,低電平=接收)。傳統方案中,應用層必須手動:

1.發送前設置GPIO高電平切發送模式;

2.發送完成后等數據發完再設GPIO低電平切接收模式;

若時序錯(如沒等數據發完就切接收),必然丟包。

修改核心是:讓內核在發送數據的關鍵節點自動控制這個GPIO,應用層只需要調用write()發數據,無需管方向切換。

wKgZO2kancKAJVkmAAAh6iVKS-k162.png

二、逐文件拆解修改:改了什么?為什么這么改?

1.設備樹修改(rk3576-evb1.dtsi):給UART綁定485控制GPIO

+&uart5 {

+ status = "okay";

+ pinctrl-names = "default";

+ 485_ctrl_gpio = <&gpio3 RK_PD6 GPIO_ACTIVE_HIGH>;

+ pinctrl-0 = <&uart5m0_xfer>;

+};

+

+&uart11 {

+ status = "okay";

+ pinctrl-names = "default";

+ 485_ctrl_gpio = <&gpio3 RK_PD7 GPIO_ACTIVE_HIGH>;

+ pinctrl-0 = <&uart11m0_xfer>;

+};

改了什么?

?uart5uart11兩個串口,各加1485_ctrl_gpio屬性:

?uart5綁定gpio3PD6引腳uart11綁定gpio3PD7引腳

?GPIO_ACTIVE_HIGH表示:GPIO高電平時,485進入發送模式

?啟用串口(status = "okay")并指定引腳配置(pinctrl-0 = <&uart5m0_xfer>)。

為什么這么改?

?設備樹是硬件與驅動的橋梁:需要告訴內核哪個UART對應哪個GPIO”,否則驅動不知道該控制哪個引腳;

?后續驅動代碼(8250_dw.c)會通過of_get_named_gpio讀取這個屬性,建立UART485控制GPIO的關聯。

2.驅動初始化修改(8250_dw.c):讀取GPIO配置并初始化

+#include +#include @@ -570,9 +572,11 @@static int dw8250_probe(struct platform_device *pdev)    struct device *dev = &pdev->dev;    struct dw8250_data *data;    struct resource *regs;+    struct device_node *nd = dev->of_node;    int irq;    int err;    u32 val;+    int gpio_ctrl;@@ -610,6 +614,14 @@static int dw8250_probe(struct platform_device *pdev)    data->data.dma.fn = dw8250_fallback_dma_filter;    data->pdata = device_get_match_data(p->dev);    p->private_data = &data->data;+    gpio_ctrl = of_get_named_gpio(nd, "485_ctrl_gpio", 0);+    if (gpio_ctrl > 0)+    {+        data->flags = 0xabcd;+        data->dir_gpio_pin = gpio_ctrl;+        gpio_direction_output(gpio_ctrl, 0);+        gpio_set_value(gpio_ctrl, 0);+    }

改了什么?

1.新增頭文件:gpio.hof_gpio.h是內核操作GPIO的必備接口

2.讀取設備樹GPIO:通過of_get_named_gpio(nd, "485_ctrl_gpio", 0),從設備樹讀取你定義的485_ctrl_gpio引腳號;

3.初始化GPIO狀態:

?若讀取到有效GPIOgpio_ctrl > 0),給dw8250_data結構體設標記(data->flags = 0xabcd,用于后續識別這是485串口);

?存儲GPIO引腳號(data->dir_gpio_pin = gpio_ctrl);

?GPIO為輸出模式(gpio_direction_output),并初始化為低電平(gpio_set_value(gpio_ctrl, 0)初始是接收模式,避免上電就誤發。

為什么這么改?

?這是驅動層與硬件建立連接的關鍵:設備樹只是聲明,驅動需要通過probe函數讀取聲明并初始化硬件

?初始設為低電平(接收模式)是安全設計:防止設備上電時GPIO隨機電平導致485總線被占用,干擾其他設備。

3.數據結構擴展(8250_dwlib.h):存儲485控制狀態

@@ -50,6 +50,8 @@struct dw8250_data {#endif    unsigned int        skip_autocfg:1;    unsigned int        uart_16550_compatible:1;+    int flags;+    int dir_gpio_pin;};

改了什么?

dw8250_data結構體(RK平臺UART驅動的核心數據結構)中,新增兩個字段:

?flags:標記是否為485串口(用0xabcd作為識別值);

?dir_gpio_pin:存儲485方向控制GPIO的引腳號。

為什么這么改?

?內核驅動的數據結構是狀態的載體dw8250_data原本只存UART基礎配置,現在要控制485,必須新增字段存儲是否是485”控制哪個GPIO”

?后續發送數據時(8250_port.c),需要通過這個結構體獲取GPIO信息,才能控制方向。

4.發送邏輯修改(8250_port.c):自動切換收發方向

+// #include "8250.h"+#include "8250_dwlib.h"+#include +#include @@ -1833,6 +1835,7 @@void serial8250_tx_chars(struct uart_8250_port *up)    struct uart_port *port = &up->port;    struct circ_buf *xmit = &port->state->xmit;    int count;+    struct dw8250_data* p_data = (struct dw8250_data*)(port->private_data);@@ -1848,6 +1851,14 @@void serial8250_tx_chars(struct uart_8250_port *up)    }    count = up->tx_loadsz;+    if(0xabcd == p_data->flags)+    {+        if (gpio_get_value(p_data->dir_gpio_pin) != 1)+        {+            gpio_set_value(p_data->dir_gpio_pin, 1);+            printk("this uart is 485, set rts gpio %d value 1n", p_data->dir_gpio_pin);+        }    +    }@@ -1884,7 +1895,30 @@void serial8250_tx_chars(struct uart_8250_port *up)    if (uart_circ_empty(xmit) && !(up->capabilities & UART_CAP_RPM))-        __stop_tx(up);+    {+         __stop_tx(up);+        if(0xabcd == p_data->flags)+        {+            unsigned int lsr;+            int loop_count = 200;+            while(loop_count)+            {+                loop_count--;+                lsr=serial_port_in(port,UART_LSR);+                if(((lsr & UART_LSR_TEMT) == UART_LSR_TEMT))+                    break;+                mdelay(1);+            }+            if(loop_count<0)+            {+                printk("timeout wait 485 send %dn",p_data->dir_gpio_pin);+            }+            +            gpio_set_value(p_data->dir_gpio_pin, 0);+            printk("this uart is 485, set rts gpio %d value 0n", p_data->dir_gpio_pin);+                +        }+    }    

改了什么?

這是最核心的自動控制邏輯,分兩個階段:

1.發送前:切到發送模式

?先通過port->private_data拿到dw8250_data結構體(之前在probe函數中綁定);

?檢查flags == 0xabcd(確認是485串口),且GPIO當前不是高電平GPIO為高電平(gpio_set_value(1));

?打印日志,提示“485串口已切發送模式

1.發送后:切回接收模式

?當發送緩沖區為空(uart_circ_empty(xmit)),先調用__stop_tx停止發送;

?然后循環檢查UARTLSR寄存器serial_port_in(port,UART_LSR)):

等待UART_LSR_TEMT位(發送移位寄存器空)確保硬件已把最后1個字節發完(避免數據殘留);

最多等200msloop_count=200),超時打印錯誤日志;

?最后設GPIO為低電平(gpio_set_value(0)),切回接收模式,打印日志。

為什么這么改?

?解決傳統應用層控制的時序痛點:應用層無法精確判斷硬件是否真的發完數據,而內核能直接讀UART寄存器(LSR),確保數據發完再切接收;

?200ms超時是容錯設計:防止硬件異常時GPIO一直處于發送模式,阻塞總線。

三、修改帶來的3個核心優勢(純代碼層面總結)

1.應用層徹底解放:無需再寫GPIO控制代碼(如ioctlGPIO電平、猜延時等),調用write()發數據即可,內核自動搞定方向切換;

2.時序絕對精準:通過讀取UART硬件寄存器(LSR_TEMT)判斷發送完成,比應用層usleep(靠經驗猜延時)可靠100%,不會丟包;

3.硬件適配靈活:若換485控制引腳,只需改設備樹(dtsi)的485_ctrl_gpio,驅動和應用層無需動符合硬件與軟件解耦的內核設計思想。

四、開發者需注意的2個細節

1.GPIO引腳唯一性uart5GPIO3_PD6uart11GPIO3_PD7,需確保這兩個GPIO沒被其他硬件(如SPII2C)占用,否則會導致引腳沖突;

2.超時參數調整loop_count=200200ms)是通用值,若485波特率極低(如2400),1個字節發送時間長,可適當增大loop_count,避免超時誤判。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    4

    文章

    1467

    瀏覽量

    42869
  • RS-485
    +關注

    關注

    11

    文章

    748

    瀏覽量

    86688
  • rk3576
    +關注

    關注

    1

    文章

    265

    瀏覽量

    1546
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于RK3576開發板的PWN使用說明

    RK3576開發板使用PWN教程及Demo
    的頭像 發表于 05-07 14:07 ?2256次閱讀
    基于<b class='flag-5'>RK3576</b>開發板的PWN使用說明

    基于RK3576開發板的人臉識別算法

    RK3576開發板展示人臉識別算法例程和API說明
    的頭像 發表于 05-07 16:48 ?2732次閱讀
    基于<b class='flag-5'>RK3576</b>開發板的人臉識別算法

    米爾RK3576RK3588怎么選?-看這篇就夠了

    在中國半導體產業的版圖中,瑞芯微作為國內SoC芯片領跑者,憑借其在處理器芯片設計領域的深厚積累和持續創新,推出很多智能應用處理器芯片,在嵌入式系統領域得到大規模的應用。RK3588和RK3576系列
    發表于 12-27 11:44

    【米爾RK3576開發板評測】+項目名稱值得購買的米爾RK3576開發板

    米爾依然是核心板加擴展板的模式,我拿到手的開發板,核心板已經通過LGA貼片,焊好了。 開發板做工很好,布線細致工整。 RK3576開發板 采用Rockchip RK3576第二代8nm高性能
    發表于 01-08 22:59

    RK3576 vs RK3588:為何越來越多的開發者轉向RK3576

    瑞芯微(Rockchip)最新發布的 RK3576 一經推出,就吸引了大量原本關注 RK3588 的開發者。RK3588 作為旗艦級芯片,性能固然強大,但 RK3576 憑借其超高的能
    發表于 05-30 08:46

    Mpp支持RK3576

    想問下,https://github.com/rockchip-linux/mpp這里面支持RK3576么,看介紹沒有提到說支持RK3576 目前是買了個rk3576的機頂盒,搭載了安卓14,想做安卓視頻硬解。
    發表于 06-13 15:35

    RK這2款旗艦芯片RK3588 PK RK3576,誰是最優選

    ,了解兩者的區別十分重要,以下將從多個方面進行詳細對比。一、處理器性能解析(一)CPU 性能1. 核心架構? RK3576:采用四核 Cortex - A72 和四核 Cortex - A53 架構
    發表于 07-10 18:24

    【作品合集】米爾RK3576開發板測評

    測試 作者:魯治驛【米爾RK3576開發板免費體驗】測評綜合解析 【米爾RK3576開發板免費體驗】集成MQ-2煙霧傳感器和ADS1263模塊實現氣體監測 【米爾RK3576開發板免費
    發表于 09-11 10:19

    【作品合集】靈眸科技EASY EAI Orin Nano(RK3576)開發板測評

    【EASY EAI Orin Nano(RK3576)開發板試用體驗】01-開箱報告及開發環境準備 【EASY EAI Orin Nano(RK3576)開發板試用體驗】02-拓展空間及內核分析
    發表于 09-09 09:59

    新品體驗 | RK3576開發板

    前言:RK3576作為瑞芯微第二代8nm高性能AIOT平臺,一經推出便獲得了極大的關注。廣州眺望電子科技有限公司是一家專注于嵌入式處理器模組研發與應用的國家高新技術企業,目前公司已推出的相關型號有
    的頭像 發表于 11-01 08:08 ?3142次閱讀
    新品體驗 | <b class='flag-5'>RK3576</b>開發板

    RK3576單板發布倒計時:RK3399與RK3576對比

    好多人說RK3576RK3399的升級版,某種程度上也可以這么說,RK3576在強大的多媒體功能的基礎上,性能和接口都進行了升級 一、工藝 性能 rk3576采用 Rockchip
    的頭像 發表于 12-03 16:59 ?2515次閱讀
    <b class='flag-5'>RK3576</b>單板發布倒計時:<b class='flag-5'>RK</b>3399與<b class='flag-5'>RK3576</b>對比

    RK3588與RK3576區別解析

    以下是RK3576RK3588對比: 電魚電子SBC-RK3576單板 核心性能:RK3576為四核A72@2.2GHz + 四核A53@1.8GHz + M0協處理器,算力 58K
    的頭像 發表于 12-17 14:03 ?4012次閱讀
    <b class='flag-5'>RK</b>3588與<b class='flag-5'>RK3576</b>區別<b class='flag-5'>解析</b>

    瑞芯微RK3576RK3576S有什么區別,性能參數配置與型號差異解析

    瑞芯微第二代8nm高性能AIOT平臺RK3576家族再添新成員-RK3576S,先說結論:相較主型號的RK3576/RK3576J,性能略有縮減,而功耗有所降低。主要應用于商顯終端、智
    的頭像 發表于 08-14 23:57 ?2366次閱讀
    瑞芯微<b class='flag-5'>RK3576</b>與<b class='flag-5'>RK3576</b>S有什么區別,性能參數配置與型號差異<b class='flag-5'>解析</b>

    迅為如何在RK3576上部署YOLOv5;基于RK3576構建智能門禁系統

    迅為如何在RK3576開發板上部署YOLOv5;基于RK3576構建智能門禁系統
    的頭像 發表于 11-25 14:06 ?1790次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構建智能門禁系統

    迅為RK3576對比RK3568:AI算力與接口的全面躍遷

    迅為RK3576對比RK3568:AI算力與接口的全面躍遷
    的頭像 發表于 12-22 15:24 ?1582次閱讀
    迅為<b class='flag-5'>RK3576</b>對比<b class='flag-5'>RK</b>3568:AI算力與接口的全面躍遷