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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

修改核心是:讓內(nèi)核在發(fā)送數(shù)據(jù)的關(guān)鍵節(jié)點(diǎn)自動控制這個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兩個串口,各加1485_ctrl_gpio屬性:

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

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

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

為什么這么改?

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

?后續(xù)驅(qū)動代碼(8250_dw.c)會通過of_get_named_gpio讀取這個屬性,建立UART485控制GPIO的關(guān)聯(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.讀取設(shè)備樹GPIO:通過of_get_named_gpio(nd, "485_ctrl_gpio", 0),從設(shè)備樹讀取你定義的485_ctrl_gpio引腳號;

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

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

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

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

為什么這么改?

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

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

3.數(shù)據(jù)結(jié)構(gòu)擴(kuò)展(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:標(biāo)記是否為485串口(用0xabcd作為識別值);

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

為什么這么改?

?內(nèi)核驅(qū)動的數(shù)據(jù)結(jié)構(gòu)是狀態(tài)的載體dw8250_data原本只存UART基礎(chǔ)配置,現(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(確認(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個字節(jié)發(fā)完(避免數(shù)據(jù)殘留);

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

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

為什么這么改?

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

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

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

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

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

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

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

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

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

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

    關(guān)注

    4

    文章

    1446

    瀏覽量

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

    關(guān)注

    11

    文章

    748

    瀏覽量

    86525
  • rk3576
    +關(guān)注

    關(guān)注

    1

    文章

    254

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

    如何移植EtherCAT Igh--基于米爾RK3576開發(fā)板

    本文將介紹基于米爾電子MYD-LR3576開發(fā)板(米爾基于瑞芯微RK3576開發(fā)板)的板端移植EtherCATIgh方案的開發(fā)測試。摘自優(yōu)秀創(chuàng)作者-EPTmachine米爾基于瑞芯微RK3576
    的頭像 發(fā)表于 09-26 08:04 ?9751次閱讀
    如何移植EtherCAT Igh--基于米爾<b class='flag-5'>RK3576</b>開發(fā)板

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

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

    【米爾RK3576開發(fā)板評測】+項(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 作為旗艦級芯片,性能固然強(qiáng)大,但 RK3576 憑借其超高的能
    發(fā)表于 05-30 08:46

    Mpp支持RK3576

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

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

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

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

    【EASY EAI Orin Nano(RK3576)開發(fā)板試用體驗(yàn)】01-開箱報告及開發(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平臺,一經(jīng)推出便獲得了極大的關(guān)注。廣州眺望電子科技有限公司是一家專注于嵌入式處理器模組研發(fā)與應(yīng)用的國家高新技術(shù)企業(yè),目前公司已推出的相關(guān)型號有
    的頭像 發(fā)表于 11-01 08:08 ?3039次閱讀
    新品體驗(yàn) | <b class='flag-5'>RK3576</b>開發(fā)板

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

    好多人說RK3576RK3399的升級版,某種程度上也可以這么說,RK3576在強(qiáng)大的多媒體功能的基礎(chǔ)上,性能和接口都進(jìn)行了升級 一、工藝 性能 rk3576采用 Rockchip
    的頭像 發(fā)表于 12-03 16:59 ?2416次閱讀
    <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 ?3859次閱讀
    <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,性能略有縮減,而功耗有所降低。主要應(yīng)用于商顯終端、智
    的頭像 發(fā)表于 08-14 23:57 ?2220次閱讀
    瑞芯微<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 ?1706次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構(gòu)建智能門禁系統(tǒng)