顯示具有 USB-Serial 標籤的文章。 顯示所有文章
顯示具有 USB-Serial 標籤的文章。 顯示所有文章

2015年3月31日 星期二

安信可ESP-12測試板入門




注意事項: 此模塊出廠Firmware是搭配App IOT.apk 設計, 所以沒有設計AT Command輸入功能,主要是Demo如何用手機來控制ESP8266 Module ,使用者可考慮利用SDK開發自己的Firmware應用,或可燒錄其他現成的Firmware, 例如 NodeMCP..........



安信可ESP-12測試板出廠Firmware,預設Boot 後貌似為115200 , 8 N 1......


1  Android手机下載安装IOT.APK   IOS客户端稍后发布
2  短路帽(如下圖左側邊上的2Pin Jumper)若接上上电进入烧写模式,若拿掉則进入正常运行状态
3  装上电池后,手机搜索到网络“AI-THINKER” 的路由器
4  加入这个路由器(模块形成的路由器)密码是:ai-thinker

5  加入成功后就可以用手机直接控制模块了。

(注:此模块默认固件 AI-THINKER-IOT-2014-10-17 165528.bin (508 KB, 下载次数: 1009) ,默认已刷入,想用手机直接控制的话请勿刷写其他固件!)




若要接Usb-Serial 接法如下,

下圖為 PL2303 + ESP8266測試板

my1.jpg
請注意上面TXD及RXD所接位置,不要接錯了.......



2015年3月24日 星期二

UEFI Serial I/O Protocol


UEFI Spec. Ver.2.4

GUID
#define EFI_SERIAL_IO_PROTOCOL_GUID \
 {0xBB25CF6F,0xF1D4,0x11D2,0x9A,0x0C,0x00,0x90,\
 0x27,0x3F,0xC1,0xFD}

Revision Number
#define EFI_SERIAL_IO_PROTOCOL_REVISION 0x00010000

Protocol Interface Structure
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;
} EFI_SERIAL_IO_PROTOCOL;

Parameters
Revision The revision to which the EFI_SERIAL_IO_PROTOCOL
adheres. All future revisions must be backwards compatible. If a
future version is not back wards compatible, it is not the same
GUID.
Reset Resets the hardware device.
SetAttributes Sets communication parameters for a serial device. These
include the baud rate, receive FIFO depth, transmit/receive time
out, parity, data bits, and stop bit attributes.
SetControl Sets the control bits on a serial device. These include Request to
Send and Data Terminal Ready.
GetControl Reads the status of the control bits on a serial device. These
include Clear to Send, Data Set Ready, Ring Indicator, and
Carrier Detect.
Write Sends a buffer of characters to a serial device.
Read Receives a buffer of characters from a serial device.
Mode Pointer to SERIAL_IO_MODE data. Type SERIAL_IO_MODE
is defined in “Related Definitions” below.


Related Definitions

//*******************************************************
// SERIAL_IO_MODE
//*******************************************************
typedef struct {
UINT32 ControlMask;
 // current Attributes
 UINT32 Timeout;
 UINT64 BaudRate;
 UINT32 ReceiveFifoDepth;
 UINT32 DataBits;
 UINT32 Parity;
 UINT32 StopBits;
} SERIAL_IO_MODE;


//*******************************************************
// CONTROL BITS
//*******************************************************
// Read Only
#define EFI_SERIAL_CLEAR_TO_SEND 0x0010
#define EFI_SERIAL_DATA_SET_READY 0x0020
#define EFI_SERIAL_RING_INDICATE 0x0040
#define EFI_SERIAL_CARRIER_DETECT 0x0080
#define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100   // See if the Receive FIFO is empty.
#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200 // See if the Transmit FIFO is empty

// Write Only
#define EFI_SERIAL_REQUEST_TO_SEND 0x0002
#define EFI_SERIAL_DATA_TERMINAL_READY 0x0001

// Read Write
#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000
#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000
#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000


串列埠的原理與應用


1.可透過GetControl function查看EFI_SERIAL_INPUT_BUFFER_EMPTY決定目前有無資料被接收,若有資料,則利用Read function讀進來

ReceiveFifoDepth The requested depth of the FIFO on the receive side of the serial
interface. A ReceiveFifoDepth value of 0 will use the
device’s default FIFO depth

Timeout The requested time out for a single character in microseconds.
This timeout applies to both the transmit and receive side of the
interface. A Timeout value of 0 will use the device’s default
time out value.

設定組態
  EFI_PARITY_TYPE         Parity=NoParity;
  EFI_STOP_BITS_TYPE      StopBits=OneStopBit;
  UINTN                   BaudRate=9600;
  UINTN                   DataBits=8;

 Status = SerialIo->SetAttributes (
                              SerialIo,
                              (UINT64) BaudRate, //9600
                              0, //use default
                              0, //use default
                              Parity, // N 
                              (UINT8) DataBits, //8
                              StopBits //1
                             );

檢查有無資料進來
  UINT32 SerialControl;

  Status = SerialIo->GetControl (
                 SerialIo,
                 &SerialControl);
  if (!EFI_ERROR (Status)) {
    if ((SerialControl & EFI_SERIAL_INPUT_BUFFER_EMPTY) != 0) {
      Status = EFI_NOT_READY;
    } else {
      Status = EFI_SUCCESS;
    }
  }




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)



2015年3月19日 星期四

ESP8266 control from a PC via USB-serial

收到ESP8266 WIFI串口模塊 ESP-01,決定先測測ESP8266功能,找了下資料,發現了ESP8266 control from a PC via USB-serial 這篇文章, 所以照貓畫虎,將實現過程記下...........

參考資料 :

http://m.instructables.com/id/Getting-Started-with-the-ESP8266-ESP-12/



ESP-01電源是3.3V ,目前市面上的USB-serial 有好幾款,我用的是PL2303 款,在實驗過程中,我發現PL2303的3.3V可能因為輸出電流不足,所以推不動ESP8266,因此,我另外用了個電源模組,取他的3.3V當作ESP8266 3.3V的電壓來源,連接圖如下:
註1: FTDI 232R的3.3V好像是可推得動ESP8266的
註2: CH340G/T/R 沒有3.3V,需要有5V-3.3V LDO (see Nodemcu 開發板)








在Linux/Windows OS下, 我常用Chrome Web Browser上網 ,所以,我直接下載Chrome App : Diginow Serial Terminal 當作測試工具 ,  Baud Rate設定為9600 (預設ESP8266 Boot 時用115200,Boot 後用9600),
如圖簡單測試一下ESP8266 AT Command :






指令說明:
AT+GMR ==> 取得Module , Firmware資訊
AT+CWMODE? ==> 查詢現在Mode狀態
AT+CWMODE=3 ==> 設定APSTA mode
AT+RST ==>重啟Module,切換為APSTA mode
AT+CWSAP? ==> 查看模塊當成AP時的SSID/PWD設定,我的Module 預設為AT+CWSAP="ESP8266","1234567890",5,3
註:重設SSID後,要記得執行RST,這樣新的SSID AP才會正常被連上.


手機連連看......
值得注意的是ESP8266在AP mode預設給的IP為 192.168.4.XXX



我的手機被分配到IP : 192.168.4.101



接著可以開始學習如何活用ESP8266的AT Command了........