iT邦幫忙

0

[6.1810][spec] 閱讀 uart spec

  • 分享至 

  • xImage
  •  

系列文章 : [6.1810] 跟著 MIT 6.1810 學習基礎作業系統觀念

這邊只針對 xv6 有用到的部分,稍微閱讀一下。

雖然閱讀 spec 可能會是個枯燥的過程,但是想要用軟體操控硬體的話,仔細地閱讀 spec 又是不可避免的過程。幸好現在有 AI 的輔助,尤其是 notebookLM,對於閱讀 spec 的幫助很大。把 spec 丟給 notebookLM 之後,忘記了 spec 某部份的細節,都可以向 notebookLM 諮詢。但要注意的是,AI 還是有機會犯錯,我還是習慣會大概地 review AI 產生的結果。

UART 在收到 的 memory transaction 的時候,就算寫入的位址相同,也可以導向不同的 register

例如 RHRTHR 的 offset 都是 0x0,但是當我們對 UART 進行讀取的時候,會導向 RHR,當我們進行寫入的時候,會導向 THR

  • RHR ( RECEIVER HOLDING REGISTER )
    • addr : 0 ( read )
    • 讀取來自外面的資訊
    • 假如有開 FIFO mode 的話,會得到 16 bytes 的緩衝。
  • THR ( TRANSMITTER HOLDING REGISTER )
    • addr : 0 ( write )
    • 通過 UART 傳訊息給外面
    • 假如有開 FIFO mode 的話,會得到 16 bytes 的緩衝。
  • IER ( INTERRUPT ENABLE REGISTER )
    • addr : 1 ( write )
    • bit 0 ( IER_RX_ENABLE ) : 當我們 assert 這個 bit,當有資料進來的時候,會 interrupt 通知 CPU。
    • bit 1 ( IER_TX_ENABLE ) : 當我們 assert 這個 bit,當我們寫資料出去,並且資料傳到外面 ( THR empty ),會 interrupt 通知 CPU。
  • ISR ( INTERRUPT STATUS REGISTER )
    • addr : 2 ( read )
    • 閱讀這個 register 可以知道 interrupt 發生的原因,但在 xv6-riscv 似乎不會去看 interrupt 的原因是什麼。
  • FCR ( FIFO CONTROL REGISTER )
  • LCR
    • addr : 3 ( write )
    • bit 0, 1 (word length)
      • val : 0b00 代表 character 的 word length 是 5 bits
      • val : 0b01 : word length == 6 bits
      • val : 0b10 : word length == 7 bits
      • val : 0b11 : word length == 8 bits
    • bit 7 (Divisor Latch Access Bit (DLAB)) : 當這個 bit 被 assert 的時候,16550a 的 register 的意義會改變。
      • addr : 0 會從 RHR/THR 變成 DLL
      • addr : 1 會從 IER 變成 DLM
      • 設定 baud rate 的時候會用到
  • LSR ( Line Status Register )
    • 功能 : 目前 uart 的狀態
    • addr : 5 ( read )
    • bit 0 ( receive data ready ) : 當這個 bit 的值為 1 的時候,代表我們可以透過 RHR 閱讀來自外面的資訊。
    • bit 5 ( transmit holding empty ) : 當這個 bit 的值為 1 的時候,代表我們可以透過 THR 傳輸資訊給外面。
  • DLL, DLM ( DIVISOR LATCH )
    • 設定 baud rate

Reference


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言