1. 程式人生 > >Linux下USB轉串列埠驅動

Linux下USB轉串列埠驅動

Linux發行版自帶usb to serial驅動,以模組方式編譯驅動,在核心原始碼目錄下執行Make MenuConfig選擇Devces drivers-->USB seupport--> <M>USB Serial Converter support --> <M> USB driver for GSM and CDMA modems & [*]USB Generic Serial Driver,儲存退出。執行make modules,編譯成功後可找到usbtoserial.ko及option.ko兩個驅動(2.6以上核心版本模組驅動用.ko表示)。如果想在開發板上執行,要用arm-linux-gcc編譯。

在2.6.18以前的核心版本中,很多公司及產品未定義,直接用usbtoserial.ko指定ID號可以驅動模組,不需要option.ko。格式為[insmod usbserial.ko vendor=<comp.ID> product=<pro.ID>],對於除錯過的模組,給出ID如下:

 Telit_UC864:
vendor=0x1bc7 product=0x1003
轉出ttyUSB0~2三個串列埠,ttyUSB0可用,響應AT指令。

 大唐 DTM6211:
vendor=0x1ab7 product=0x6000
轉出ttyUSB0~5六個串列埠,ttyUSB5可用,響應AT指令。

 華為 MC703:
vendor=0x12d1 product=0x1001
轉出ttyUSB0~2三個串列埠,ttyUSB0和ttyUSB2可用,響應AT指令。

 例如要驅動UC864,可輸入insmod usbserial.ko vendor=0x1bc7 product=0x1003。注意生成的串列埠不一定能自動建立,查詢/dev下面的裝置看是否存在ttyUSBx。如不存在,需要手動呼叫mknod建立節點。cat /proc/devices,檢視載入的驅動號,一般usbtoserial的裝置號為188。因此可呼叫mknod ttyUSB0 c 188 0,建立節點。c表示字元驅動,188是查到的主裝置號,0為子裝置號。

 2.6.18以後的核心,option.c中定義了很多公司和裝置,檢視核心原始碼,開啟option.c檔案,查詢 static struct usb_device_id option_ids[] 結構體陣列,裡面定義了很多模組廠商和產品的ID,如果未找到我們的模組,可手動新增,然後按上面的步驟重新編譯驅動。使用新生成的usbtoserial.ko和option.ko檔案,不需要指定ID號,直接insmod usbtoserial.ko再insmod option.ko,即可驅動模組。
 

參考文章二:

現在市面上的USB轉串列埠線非常便宜,而且現在大部分機器都沒有串列埠.因此在嵌入式LINUX下開發使用USB轉串列埠的線相當普遍.而我測試最穩定是 PL2303晶片,即一般是黑色不透明那種.在WINDOWS XP下使用比較穩定.學生一般問我,我都推薦這種,反而是市面上那種綠色透明的轉換線,相當不穩定.

關於PL2303的驅動    現在情況是,我們需要在桌面版LINUX上使用USB轉串列埠.而且現在開發板都是一個串列埠,因此做GPS測試,AT撥號等實驗相當不方便.因此讓PL2303在X86和ARM Linux工作,無論是對開發是有相當的意思.   廠家提供了Windows XP驅動,在網上也能下到針對WinCE5,Redhat9 驅動  在這裡能下到很多關於PL2303的資料 其中WinCE5 X86驅動是 WinCE5 ARM驅動是 針對redhat 7.0/8.0/9.0的帶原始碼的驅動 並且它註明了 Linux Kernel 2.4.10 and above already includes built-in drivers for PL-2303H.
Linux Kernel 2.4.31 and above already includes built-in drivers for PL-2303H, PL-2303XA/HXA and PL-2303HXD.
因此我的機器上的RHEL實際是自帶驅動.果然去原始碼目錄一找就發現已經帶了編譯好的動態模組. 在/lib/modules/2.6.18-128.el5/kernel/drivers/usb/serial 找到pl2303.ko 因此可以直接使用它來安裝了. 安裝X86的驅動 在驅動目錄下執行如下命令安裝驅動模組   insmod usbserial.ko   insmod pl2303.ko 沒有提示即為正常載入。可以執行lsmod 檢視模組裝載的情況   [[email protected] serial]# lsmod | grep pl2303
    pl2303                 21701  0 
    usbserial              33065  1 pl2303 可以檢視系統控制檯的輸出 dmesg | tail ,資訊已經提示驅動已經註冊上了。

[[email protected] serial]# dmesg | tail
pl2303: Unknown symbol usb_serial_probe
pl2303: Unknown symbol usb_serial_register
pl2303: Unknown symbol usb_serial_deregister
usbcore: registered new driver usbserial
drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
usbcore: registered new driver usbserial_generic
drivers/usb/serial/usb-serial.c: USB Serial Driver core
drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303
usbcore: registered new driver pl2303
drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driver

測試轉換線   找一塊開發板通電,將轉換線插入,當USB線接入LINUX主機後。再次檢視控制檯輸出,這時已經表明驅動已經開始工作,並且建立了裝置結點 ttyUSB0.  

[[email protected] serial]# dmesg | tail

usb 1-3: USB disconnect, address 7
usb 3-1: new full speed USB device using uhci_hcd and address 2
usb 3-1: configuration #1 chosen from 1 choice
pl2303 3-1:1.0: pl2303 converter detected
usb 3-1: pl2303 converter now attached to ttyUSB0

檢視/dev/ttyUSB0發現這是一個主裝置為188的字元驅動。 [[email protected] serial]# ls -l /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 0 Mar 12 13:16 /dev/ttyUSB0  配置串列埠終端程式.
  • 執行 minicom -s進行配置。選擇Serial port setup
    • 注意裝置名選擇 /dev/ttyUSB0,我的開發板的引數是 115200 8-N-1.
  • 然後執行選單 Save setup as dfl ...儲存為預設配置。
  • 然後選擇 Exit進入串列埠,或完全退出minicom後,重新執行 minicom

這時在minicom就能操作開發板!整個過程到處完全成功。