2015年3月20日 星期五

Use Serial Device to control something under UEFI Shell Environment


因為有個構想,想在UEFI Shell 下控制各類的Serial Device,所以對此稍微做了以下研究........

相關資料:
http://en.wikipedia.org/wiki/Serial_port
http://en.wikipedia.org/wiki/Universal_asynchronous_receiver/transmitter
http://en.wikipedia.org/wiki/FTDI
http://www.crashcourse.ca/wiki/index.php/USB/serial_driver_and_pl2303
http://www.intel.eu/content/dam/doc/product-specification/efi-v1-10-specification.pdf
http://www.uefi.org/sites/default/files/resources/UEFI_Shell_Spec_2_0.pdf



Serial Device可能有下列幾種介面:
1. ISA
2. PCI
3. USB



EFI Spec V1.10  "10.12 Serial I/O Protocol" 有定義SerialIO Protocol相關資訊

typedef struct {
 UINT32 Revision;
 EFI_SERIAL_RESET Reset;
 EFI_SERIAL_SET_ATTRIBUTES SetAttributes;
 EFI_SERIAL_SET_CONTROL_BITS SetControl;
 EFI_SERIAL_GET_CONTROL_BITS GetControl;
 EFI_SERIAL_WRITE Write;
 EFI_SERIAL_READ Read;
 SERIAL_IO_MODE *Mode;
} SERIAL_IO_INTERFACE; 




首先,先在UEFI Shell 下, 執行sermode , 得到如下結果 :
( sermode command 請參照 UEFI Shell Spec.)
Shell> sermode
sermode: No serial ports present

Shell>


看來相關的UEFI Driver ,沒有掛起來,得要自己Build ㄧ下code才行........

根據我Mainboard的COM Port設定, 估計得Build IsaSerialIoDxe module , 來源從EDK2。
試了一下,還是不行,仔細再看了ㄧ下code, 還需要Build IsaIoDxe module.......
Build好之後再試試看,結果終於有反應了,顯示如下,但不確定是否會動作正常,需再進一步驗證。

fs0:\Efi\tools> load IsaIoDxe.efi
load Image fs0:\Efi\tools\IsaIoDxe.efi loaded at B84CD000 - Success

fs0:\Efi\tools> load IsaSerialDxe.efi
load Image fs0:\Efi\tools\IsaSerialDxe.efi loaded at B84C4000 - Success

fs0:\Efi\tools> sermode
147(AD548D18) - (115200, N, 8, 1)

fs0:\Efi\tools> sermode 147 9600 N 8 1,
sermode: Mode set on handle AD548D18

fs0:\Efi\tools> sermode 
147(AD548D18) - (9600, N, 8, 1)

fs0:\Efi\tools>

在寫個測試程式前,先來找找看UEFI 有沒有Usb serial device driver.
透過Google找到了下列描述:

"Status: Completed (For FTDI). Available at OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe."

再搜尋了一下,發現市售常用的USB-serial 晶片有下列幾款:
1.FT232R
2.PL2303
3.CH340g/340T/340R
4.CP210x


目前我手上有幾款USB serial device, ID資訊如下:

CH340T => ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
PL2303 => ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
FT232R => ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC


針對FT232R Driver 修改如下:
  //
  // add code to set trigger time based on baud rate
  // setting to 0.5s for now
  //
  gBS->SetTimer (
         UsbSerialDevice->PollingLoop,
         TimerPeriodic,
         EFI_TIMER_PERIOD_MILLISECONDS (100) //從500修改成100
         );


測試結果FT232R Usb-Serial 可動作正常,傳輸資料也OK...


硬體不一樣,當然行為模式也不一樣,至於PL2303, CH340 , CP2102 的UEFI Driver 網路上還沒找到現成的,只好等有時間再來嘗試Porting了.........


Download : FtdiUsbSerialDxe.efi (64bits Version)
Download : IsaSerialIoDxe (64bits Version)
Download : IsaIoDxe (64bits Version)



31 則留言:

  1. 馬克你好 請問一下 如果要在UEFI 下 使用USBtoRS232 Cable的話 是要依據不同的MB來寫code,最後在load Driver嗎?

    回覆刪除
    回覆
    1. 你好, 不同Usb to Serial Chip 會有不同Driver , 與哪家MB無關, 就我所知UEFI Shell 目前除Onboard ISA Com Port及 FTDI FT232 USBtoSerial 外,其他還無Driver,可能要自己Porting, 畢竟這是小眾市場.......

      刪除
  2. 馬克你好 我從你網站上下載下來FTDI的Driver有load成功了,然後用Drivers和Devices有確定抓到這條cable,但是用Sermode卻是會出現No Serial Parts Present,請問還需要再做甚麼設定嗎?

    回覆刪除
    回覆
    1. 插拔試試看,我感覺這driver還有些許問題需解決…

      刪除
  3. 若不行,換個USB 2.0 Port 插插,因為各家MB/BIOS RD程度不同,UEFI USB support不盡相同......

    回覆刪除
    回覆
    1. 有關像我的板子,5個port,有2個port能用,可能是跟接Usb3.0 or Usb2.0 controller有關吧!?

      刪除
  4. 馬克你好 可以請你提供 Drvier的 source code 嗎? 讓我回去自行研究一下 謝謝

    回覆刪除
    回覆
    1. 這是open source的, 請看: https://github.com/tianocore/edk2/tree/master/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe

      刪除
    2. 馬克謝謝你 想問一下IsaIoDxe.efi 跟 IsaSerialDxe.efi 這兩個區動程式是不是得在 FT232 驅動程式之前先載入? 如果是的話可以請你提供這兩個檔案嗎?

      刪除
    3. IsaSerialDxe.efi ,IsaIoDxe.efi 已上載.....
      這2個檔案,僅是給傳統Onboard ISA COM Port用的,我還沒測過實際傳輸功能...

      刪除
    4. 馬克謝謝 我現在已經可以Load FTDI的Driver了,也可以使用sermode找到裝置,可是後續要怎麼確認這個comport可以正常傳輸呢?

      刪除
    5. 我是將RX及TX對接,另外寫了個非常簡單的測試程式,若要測試程式及代碼,可留email address,之後若要作應用,可能要開始學習寫UEFI Application了....

      刪除
    6. 馬克你好,這是我的信箱:qwer5527271@gmail.com,感謝你大力幫助我,讓我解決很多的問題

      刪除
    7. 馬克謝謝 已經收到

      刪除
    8. 馬克您好,可否跟您索取程式及代碼 chiashenyeh@gmail.com 謝謝!!

      刪除
  5. 作者已經移除這則留言。

    回覆刪除
  6. 作者已經移除這則留言。

    回覆刪除
  7. 馬克您好,
    可否跟您索取EFI的RS232測試程式..謝謝您..
    qzhk0403@gmail.com

    回覆刪除
  8. 馬克您好,
    可否跟您索取EFI的RS232測試程式..謝謝您..
    tasaim19@gmail.com

    回覆刪除
    回覆
    1. 馬克您好,可否跟您索取程式及代碼 tasaim19@gmail.com 謝謝!!
      想研究研究

      刪除
  9. 作者已經移除這則留言。

    回覆刪除
  10. 馬克您好,
    是否可以跟您索取RS232測試程式和source code?
    virtualce@gmail.com

    回覆刪除
  11. 馬克您好,
    是否可以跟您索取RS232測試程式和source code?
    謝謝~
    cakey0916@gmail.com

    回覆刪除
  12. Hi Mark, 是否還能提供測試程式及代碼? 謝謝!
    kenny616@gmail.com

    回覆刪除
  13. Hi Mark, 是否還能提供測試程式及代碼? 謝謝!
    thundermitch@gmail.com

    回覆刪除
  14. Please enable download from Google Drive

    回覆刪除
  15. Hi Mark, 是否還能提供測試程式及代碼? 謝謝! gordontcp@gmail.com

    回覆刪除
  16. Hi Mark, 是否還能提供測試程式及代碼? 謝謝! chen.a905420@gmail.com

    回覆刪除