Linux支援串連各種USB從裝置,同時也支援自己作為裝置插入到其他主機當中。最典型的例子就是Android OS的手機,插入電腦可以被識別為隨身碟之類的裝置。
對於SOC來說,這部分直接對應了USB Device部分的操作。
為了避免與作為主機時支援的"裝置驅動 (USB Device Driver)"一詞混淆, Linux給這部分的實現取名為"Gadget" (小玩具)。核心源碼的目錄為\drivers\usb\gadget,裡麵包含了核心所支援的不同類型的USB Device Controller (UDC)驅動的實現,以及架構和不同gadget的實現。
以AT91 ARM9為例,最底層的驅動為at91_udc.c(對於支援高速USB 2.0的SOC是atmel_usba_udc.c),它實現了gadget.h定義的統一介面,然後上層的各種gadget driver(如serial.c等)調用這一套統一的介面去實現不同類型的功能,如USB串口、隨身碟、USB乙太網路等等。
Atmel USB串口的架構圖:
用如下命令配置kernel configure以supportGadget serial
1 copy kernel configure 檔案到目前的目錄下的obj目錄
2 配置obj目錄下的configure檔案
3 將配置好的configure檔案儲存為.config
4 copy .config檔案至linux kernel的conifg目錄下
make mtxxxx_smp_mod_dbg_defconfig ARCH=arm O=obj/ mtxxxx_smp_mod_dbg_defconfig
make menuconfig ARCH=arm O=obj/mtxxxx_smp_mod_dbg_defconfig
cp obj/mtxxxx_smp_mod_dbg_defconfig/.config arch/arm/configs/ mtxxxx_smp_mod_dbg_defconfig
配置configure時需要選擇
Device Drivers --->
USB support --->
USB Gadget Support --->
USB Gadget Drivers (Serial Gadget (With CDC ACMand CDC OBEX support)) --->
最終configure檔案中需要包含以下幾條:
CONFIG_USB_MTK_MUSB=y
CONFIG_USB_MTK_MUSB_PERIPHERAL=y
CONFIG_USB_GADGET=y
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_F_ACM=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_F_SERIAL=y
CONFIG_USB_G_SERIAL=y
CONIFG_CONFIGS_FS=y
USB配置好device mode之後, 通過usb calbe接入PC, PC會檢測到Gadget serial device. 相應的driver可以從Linux open source擷取.
可以通過在平台端cat /dev/ttyGS0 ,同時在PC端串口中寫入資料,平台端即可看到正確的資料輸出。
( 請確認driver中boundrate / 主次裝置號設定,主次裝置號可在u_serial.c的gserial_setup() function中指定 gs_tty_driver->major = 0x000 c_ispeed = 9600等; )
To use the Windows ACMdriver you must have the "linux-cdc-acm.inf" file (driver is opensource, get it from the link ) which supports all recent versions of Windows.
http://lxr.free-electrons.com/source/Documentation/usb/
正確安裝driver之後, 通過裝置管理員可以在Ports (COM & LPT) 目錄下看到一個新的COM口.