簡體   English   中英

帶有GPIO的串行Linux嵌入式驅動程序

[英]Serial Linux embedded Driver with GPIO

我正在嘗試開發與設備進行通信的驅動程序。 我的驅動程序使用sysfs與用戶空間進行通信,並使用rs232從外部設備發送/接收信息。 我的Boad和其他設備通過rs232通信,但是我不知道如何用我的rx,tx,cts / rts在驅動程序中初始化此通信。 我看到了很多關於tty的信息。 但是沒有任何關於直接使用GPIO進行rs232通信的事情。

結構

用戶->董事會

| ----- rx ------ |
| ----- tx ------ |
| ----- cts ----- |

設備

如果有人有主意:)

謝謝

我最近在職業生涯中遇到了類似的問題。 我們用完了硬件UART,需要使用GPIO上的單線來實現UART協議。

現在,如果我正確地理解了您(或者我是否錯過了您要問的特定體系結構?),您正在嘗試在可以(或正在)運行linux的某種微處理器上實現該功能。 根據您的硬件和可用的調試工具/編程器的種類,您幾乎有兩種選擇可以運行基本的裸機(讀取:無操作系統)UART通信,該通信可以通過串行端口配置進行擴展(並且通常可以簡化)在操作系統級別的linux內核中。 我不會在操作系統級別上詳細配置串行端口,但是如果您可以在裸機上進行配置,則可以在操作系統中進行配置。 我將重點介紹兩種簡單的解決方案。

編輯:我現在意識到,您的確確實處於完整的OS中。 下面的所有內容都是針對固件的,您必須開發該固件並將其與Gautham Kantharaju所述的呼叫相關聯。 因此,軟件UART可能並不完全有用。

這些是:

  1. 微控制器/微處理器上的硬件UART端口已經具有用於UART配置和FIFO的專用寄存器。
  2. 您只能訪問GPIO模塊,而且只能訪問純GPIO功能-輸出邏輯高/低,中斷配置(在上升沿,下降沿中斷;向矢量或DMA請求發送中斷等)。 和一個輸入數據寄存器。

無論哪種情況,您都需要仔細閱讀微處理器的數據表和參考手冊,以首先了解其UART寄存器的工作原理。 您幾乎肯定還會找到在芯片上實現和啟用UART的應用筆記。 這是跨硬件的相當標准,它們之間只有很小的差異。 幾乎總是有代碼示例為您完成這些任務,但是根據您的需要,您可能必須至少修改一些配置設置。

您應該看到帶有以下形式的寄存器:

  1. 某種形式的使能寄存器可以有效地為模塊供電。 這可能涉及取消時鍾寄存器的工作(模塊沒有時鍾就無法運行)和其他一些可能與硬件有關的步驟。
  2. 注冊以設置流量控制。 這里可以有很多。 用於一起啟用流控制,CTS線是處於高/低電平有效狀態,是否允許中斷以及中斷標志在何處等。
  3. 通用UART配置(這可能是初始化階段的一部分,因為某些UART [例如飛思卡爾的ARM]可以通過寫入配置寄存器進行初始化。在這些位置,您將看到停止位的數量,數據位的數量,奇偶校驗位等等。使用UART可以配置很多...這是一個非常成熟的標准。
  4. 您的FIFO寄存器以及如何訪問它們。

同樣,您的庫/應用程序堆棧可能會包含提供宏和函數以完成所有這些配置選項的示例,並且在許多情況下,默認配置將起作用。 您可能需要進入串行驅動程序(通常為serial.c)並更改代碼以適合您的需求,但是如果您知道寄存器和配置的工作情況,那么更容易理解搞亂哪些設置


現在,如果是后者,則需要實現軟件UART。 那里有很多示例,但是除非您了解GPIO引腳的輸入和輸出端口控制以及UART硬件完成的功能的本質,否則它對您沒有任何幫助。 聽起來比實際困難得多。 希望您有兩行:一條用於RX,另一條用於TX。 如果您不需要流控制,那么這就是您所需要的。 否則,您將需要RTS和CTS線路。 這些只是簡單的GPIO,它們以RTS引腳驅動的“活動”邏輯電平(取決於硬件,高或低-讀數據表)來控制方向,以指示發送請求和來自CTS線的確認,指示傳輸現在可以開始了。

假設暫時沒有流控制,讓我們從簡單的接收開始。 基本上,您將需要在起始位上執行某種形式的中斷。 在中斷的處理程序中,啟動某種硬件計時器(還需要配置另一個寄存器/模塊),然后以周期性的間隔對RX行進行采樣,直到數據幀結束為止(start_bit + data_bits + stop_bit(s)) + parity_bit)或使用計時器來計時多長時間將一條線保持在高/低電平狀態,並在其他功能中執行一些數學運算(不要在中斷處理程序中!)。 在大多數情況下,您將需要前一種計時器,但是如果有有趣的設備涉及特定的握手,則可能需要在計時方面更加靈活,並選擇第二種形式的傳入數據采樣。 另外,在調試時,緩沖區將非常有用且必不可少,因此在執行此操作時,您可能非常想記住這一點。

要進行傳輸,您將需要禁用中斷(或屏蔽它們),以使您的傳輸不會被中斷(對於單線連接尤其重要)。 然后,您將必須解析數據以確定每個位是1還是0(高電平有效或低電平有效),並為一個“位時間”(波特率的倒數)設置一個硬件計時器。

如果需要流控制,則在進入活動接收之前,您只需添加另一種簡單的輪詢方法,以使設備知道“允許”進行通信。

如果啟用了奇偶校驗位,則還需要在傳輸過程中將奇偶校驗位與數據一起發送出去,或者在接收之后還要確定數據是否已成功傳輸。

谷歌搜索“軟件uart”將從ATMEL的AVR芯片中獲得許多示例,而其他示例則詳細說明了如何實施。 此應用筆記對基礎知識和基礎理論很有用,本頁上ZIP鏈接的代碼確實有助於解釋如何進行編碼


希望這能給您一些好的起點。

@ Makit,1)首先閱讀處理器的技術參考手冊(TRM) 了解如何配置與外部設備連接的UART端口。 需要編寫/開發固件(與操作系統無關的代碼),在其中您將要配置一些uart寄存器,例如: 線路控制寄存器(LCR) ,其中in將配置開始,奇偶校驗,停止位(8N1)並需要進行配置根據TRM中的公式進行波特率傳輸,並將適當的值分配給DLL和DLH寄存器。 之后---> 2)從開發具有通用文件操作(打開,關閉,讀取和寫入)的字符設備驅動程序開始。 之后,需要使用“ ioremap_nocache ”內核api映射已標識的uart端口寄存器,並使用返回值(指針值)通過ioread [8 | 16 | 32] / iowrite [8 | 16 | 32]來讀取/寫入外部設備。 Uart設備驅動程序將使用開發的固件代碼來配置uart寄存器,讀寫外部設備。 請隨時反饋:-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM