91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

wKgZO2kancKAJVkmAAAh6iVKS-k162.png

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

1.設(shè)備樹修改(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兩個(gè)串口,各加1個(gè)485_ctrl_gpio屬性:

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

?GPIO_ACTIVE_HIGH表示:GPIO高電平時(shí),485進(jìn)入發(fā)送模式。

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

為什么這么改?

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

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

2.驅(qū)動(dòng)初始化修改(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.讀取設(shè)備樹GPIO:通過of_get_named_gpio(nd, "485_ctrl_gpio", 0),從設(shè)備樹讀取你定義的485_ctrl_gpio引腳號(hào);

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

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

?存儲(chǔ)GPIO引腳號(hào)(data->dir_gpio_pin = gpio_ctrl);

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

為什么這么改?

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

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

3.數(shù)據(jù)結(jié)構(gòu)擴(kuò)展(8250_dwlib.h):存儲(chǔ)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平臺(tái)UART驅(qū)動(dòng)的核心數(shù)據(jù)結(jié)構(gòu))中,新增兩個(gè)字段:

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

?dir_gpio_pin:存儲(chǔ)485方向控制GPIO的引腳號(hào)。

為什么這么改?

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

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

4.發(fā)送邏輯修改(8250_port.c):自動(dòng)切換收發(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);+                +        }+    }    

改了什么?

這是最核心的自動(dòng)控制邏輯,分兩個(gè)階段:

1.發(fā)送前:切到發(fā)送模式

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

?檢查flags == 0xabcd(確認(rèn)是485串口),且GPIO當(dāng)前不是高電平設(shè)GPIO為高電平(gpio_set_value(1));

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

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

?當(dāng)發(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個(gè)字節(jié)發(fā)完(避免數(shù)據(jù)殘留);

最多等200msloop_count=200),超時(shí)打印錯(cuò)誤日志;

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

為什么這么改?

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

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

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

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

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

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

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

1.GPIO引腳唯一性uart5GPIO3_PD6、uart11GPIO3_PD7,需確保這兩個(gè)GPIO沒被其他硬件(如SPI、I2C)占用,否則會(huì)導(dǎo)致引腳沖突;

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

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

    關(guān)注

    4

    文章

    1468

    瀏覽量

    42888
  • RS-485
    +關(guān)注

    關(guān)注

    11

    文章

    748

    瀏覽量

    86752
  • rk3576
    +關(guān)注

    關(guān)注

    1

    文章

    268

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

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

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

    【米爾RK3576開發(fā)板評(píng)測(cè)】+項(xiàng)目名稱值得購買的米爾RK3576開發(fā)板

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

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

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

    Mpp支持RK3576

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

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

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

    【作品合集】米爾RK3576開發(fā)板測(cè)評(píng)

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

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

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

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

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

    RK3576單板發(fā)布倒計(jì)時(shí):RK3399與RK3576對(duì)比

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

    RK3588與RK3576區(qū)別解析

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

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

    瑞芯微第二代8nm高性能AIOT平臺(tái)RK3576家族再添新成員-RK3576S,先說結(jié)論:相較主型號(hào)的RK3576/RK3576J,性能略有縮減,而功耗有所降低。主要應(yīng)用于商顯終端、智
    的頭像 發(fā)表于 08-14 23:57 ?2397次閱讀
    瑞芯微<b class='flag-5'>RK3576</b>與<b class='flag-5'>RK3576</b>S有什么區(qū)別,性能參數(shù)配置與型號(hào)差異<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 ?1810次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構(gòu)建智能門禁系統(tǒng)

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

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