chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

RK3576內(nèi)核485控制引腳修改解析

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

掃碼添加小助手

加入工程師交流群

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

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

1.發(fā)送前設置GPIO高電平切發(fā)送模式;

2.發(fā)送完成后等數(shù)據(jù)發(fā)完再設GPIO低電平切接收模式;

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

修改核心是:讓內(nèi)核在發(fā)送數(shù)據(jù)的關鍵節(jié)點自動控制這個GPIO,應用層只需要調(diào)用write()發(fā)數(shù)據(jù),無需管方向切換。

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進入發(fā)送模式。

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

為什么這么改?

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

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

2.驅(qū)動初始化修改(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是內(nèi)核操作GPIO的必備接口;

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

3.初始化GPIO狀態(tài):

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

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

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

為什么這么改?

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

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

3.數(shù)據(jù)結(jié)構(gòu)擴展(8250_dwlib.h):存儲485控制狀態(tài)

@@ -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結(jié)構(gòu)體(RK平臺UART驅(qū)動的核心數(shù)據(jù)結(jié)構(gòu))中,新增兩個字段:

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

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

為什么這么改?

?內(nèi)核驅(qū)動的數(shù)據(jù)結(jié)構(gòu)是狀態(tài)的載體dw8250_data原本只存UART基礎配置,現(xiàn)在要控制485,必須新增字段存儲是否是485”控制哪個GPIO”;

?后續(xù)發(fā)送數(shù)據(jù)時(8250_port.c),需要通過這個結(jié)構(gòu)體獲取GPIO信息,才能控制方向。

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

+// #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.發(fā)送前:切到發(fā)送模式

?先通過port->private_data拿到dw8250_data結(jié)構(gòu)體(之前在probe函數(shù)中綁定);

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

?打印日志,提示“485串口已切發(fā)送模式。

1.發(fā)送后:切回接收模式

?當發(fā)送緩沖區(qū)為空(uart_circ_empty(xmit)),先調(diào)用__stop_tx停止發(fā)送;

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

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

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

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

為什么這么改?

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

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

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

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

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

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

四、開發(fā)者需注意的2個細節(jié)

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

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

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

    關注

    4

    文章

    1466

    瀏覽量

    42807
  • RS-485
    +關注

    關注

    11

    文章

    748

    瀏覽量

    86653
  • rk3576
    +關注

    關注

    1

    文章

    259

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于RK3576開發(fā)板的PWN使用說明

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

    基于RK3576開發(fā)板的RTC使用說明

    文章主要展示RK3576開發(fā)板的RTC信息和快速上手例程
    的頭像 發(fā)表于 05-07 15:04 ?2173次閱讀
    基于<b class='flag-5'>RK3576</b>開發(fā)板的RTC使用說明

    基于RK3576開發(fā)板的人臉識別算法

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

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

    在中國半導體產(chǎn)業(yè)的版圖中,瑞芯微作為國內(nèi)SoC芯片領跑者,憑借其在處理器芯片設計領域的深厚積累和持續(xù)創(chuàng)新,推出很多智能應用處理器芯片,在嵌入式系統(tǒng)領域得到大規(guī)模的應用。RK3588和RK3576系列
    發(fā)表于 12-27 11:44

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

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

    RK3576 vs RK3588:為何越來越多的開發(fā)者轉(zhuǎn)向RK3576?

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

    Mpp支持RK3576

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

    RK這2款旗艦芯片RK3588 PK RK3576,誰是最優(yōu)選

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

    【作品合集】米爾RK3576開發(fā)板測評

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

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

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

    新品體驗 | RK3576開發(fā)板

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

    RK3576單板發(fā)布倒計時:RK3399與RK3576對比

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

    RK3588與RK3576區(qū)別解析

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

    瑞芯微RK3576RK3576S有什么區(qū)別,性能參數(shù)配置與型號差異解析

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

    迅為如何在RK3576上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)

    迅為如何在RK3576開發(fā)板上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)
    的頭像 發(fā)表于 11-25 14:06 ?1769次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構(gòu)建智能門禁系統(tǒng)