ZYNQ linux上使用 USB CDC ACM
一、USB CDC ACM介紹
USB CDC ACM 是 USB 通信設(shè)備類(CDC)中的一個(gè)子類,它提供了一種通過(guò) USB 接口實(shí)現(xiàn)虛擬串行通信的標(biāo)準(zhǔn)方法。
1. 基本概念
CDC ACM 是 USB 規(guī)范中定義的一種設(shè)備類協(xié)議,它模擬傳統(tǒng)的串行端口通信,提供雙向數(shù)據(jù)傳輸通道,支持控制信號(hào)(如 RTS/CTS、DTR/DSR 等,是 USB 轉(zhuǎn)串口設(shè)備的常用實(shí)現(xiàn)方式。
2. 主要特點(diǎn)
標(biāo)準(zhǔn)化:遵循 USB-IF 定義的 CDC 規(guī)范
兼容性:大多數(shù)操作系統(tǒng)內(nèi)置驅(qū)動(dòng)支持
靈活性:可以在不同硬件平臺(tái)上實(shí)現(xiàn)
多功能:支持?jǐn)?shù)據(jù)和控制通道分離
3. 技術(shù)架構(gòu)
CDC ACM 包含兩個(gè)主要接口:
3.1 通信接口(Communication Interface)
管理設(shè)備控制和狀態(tài)
包含中斷端點(diǎn)(Interrupt Endpoint)
處理線路編碼、控制信號(hào)等
3.2 數(shù)據(jù)接口(Data Interface)
處理實(shí)際數(shù)據(jù)傳輸
包含批量輸入和輸出端點(diǎn)(Bulk In/Out Endpoints)
實(shí)現(xiàn)數(shù)據(jù)流傳輸
二、 Linux-USB Gadget驅(qū)動(dòng)框架
在ZYNQ等ARM板卡上移植好linux內(nèi)核后,就可以通過(guò)linux USB Gadget驅(qū)動(dòng)框架實(shí)現(xiàn)USB CDC類。
USB Gadget 框架是 Linux 內(nèi)核中實(shí)現(xiàn) USB 設(shè)備功能的子系統(tǒng),它允許嵌入式設(shè)備作為 USB 從設(shè)備(Peripheral)與主機(jī)通信。
在 ZYNQ 7000系列SOC上,存在兩個(gè)USB2.0接口,支持USB HOST和USB OTG。
筆者板卡(正點(diǎn)原子 ZYNQ7035)上的 USB HOST 接口與 USB OTG 接口(也稱 USB Slave 接口)共用了YNQ PS 端的 USB0 接口,所以在正常情況下,USB HOST 和 USB OTG 不能同時(shí)工作,所
以在 Z100 底板上有一組跳線帽端子 J15 用于控制 USB HOST 和 USB OTG 哪個(gè)接口工作。
對(duì)于USB OTG 接口工作:
需要通過(guò)兩個(gè)跳線帽將 J15 端子的 DN 與 SN 相連、DP 與 SP 相連,注意先連接 DN 與SN。
三、vivado工程配置
在block design中,添加ZYNQ7 PS后使能USB0接口,并選擇對(duì)應(yīng)的MIO接口:


設(shè)置完成后,重新生成xsa文件。
四、設(shè)備樹配置
在vivado中使能USB0配置后,在PCW.dtsi設(shè)備樹文件中關(guān)于usb0的節(jié)點(diǎn)status 屬性就被設(shè)置為"okay"了,

所以由此可以知道,其實(shí) pcw.dtsi 文件中已經(jīng)使能了 usb0,但是目前還是不能使用 usb0的,還需要為 usb0 節(jié)點(diǎn)添加一下屬性內(nèi)容,打開(kāi) arch/arm/boot/dts/system-user.dtsi 設(shè)備樹文件,
添加相關(guān)內(nèi)容。首先需要在 system-user.dtsi 設(shè)備樹根節(jié)點(diǎn)下添加一個(gè) usb_phy0 節(jié)點(diǎn),用于描述 USB phy相關(guān)信息,如下所示:

其中,dr_mode可以是OTG,也可以為peripheral
system-user.dtsi 設(shè)備樹文件修改完成之后,保存退出!然后在內(nèi)核源碼根文件目錄下執(zhí)行下面這條命令編譯設(shè)備樹文件:
make dtbs
將編譯得到的 system-top.dtb 文件重命名為 system.dtb,將 system.dtb 文件拷貝到開(kāi)發(fā)板SD 啟動(dòng)卡的第一個(gè)分區(qū),替換掉就的設(shè)備樹文件。
五、內(nèi)核配置
USB 的HOST在linux內(nèi)核中是默認(rèn)配置的,但是CDC是沒(méi)有默認(rèn)開(kāi)啟的,因此需要配置內(nèi)核相關(guān)配置。
在內(nèi)核源碼根文件夾下執(zhí)行:
make menuconfig
配置路徑為:
Device Drivers --->
[] USB support --->
<> USB Gadget Support --->
<*> USB Gadget precomposed configurations --->
勾選以下配置:


配置好后, save 并退出,重新編譯下內(nèi)核:
make -j8
編譯成功后會(huì)在arch/arm/boot下生成zImage內(nèi)核鏡像,將該文件拷貝至U盤的vfat分區(qū)(boot)。
同時(shí)會(huì)生成相關(guān)驅(qū)動(dòng),目錄如下:

將以下驅(qū)動(dòng)拷貝至vfat分區(qū)目錄下:
g_serial.ko, libcomposite.ko, usb_f_acm.ko, usb_f_obex.ko, usb_f_serial.ko, u_serial.ko.
并啟動(dòng)Linux,按順序加載前面生成的驅(qū)動(dòng)模塊:出現(xiàn)以下信息代表驅(qū)動(dòng)掛載成功了:

此時(shí)打開(kāi)設(shè)備文件發(fā)現(xiàn)多了/dev/ttyGS0設(shè)備,這個(gè)就是虛擬的串口設(shè)備。

六、讀寫測(cè)試
將板卡上的usb slave接口鏈接電腦,這時(shí)候在windows的設(shè)備管理器中發(fā)現(xiàn)這個(gè)USB設(shè)備:

6.1 終端寫
在電腦上通過(guò)串口工具(如xcom)打開(kāi)該設(shè)備,并在ZYNQ終端中輸入發(fā)送測(cè)試命令:
echo hello,this is usb cdc acm device > /dev/ttyGS0`
在串口工具成功接收到該信息:

6.2 終端讀
在ZYNQ終端通過(guò)cat監(jiān)聽(tīng)該USB的接收信息,在串口工具,發(fā)送任意字符,并勾選發(fā)送新行(這里筆者猜測(cè)是終端的內(nèi)核緩沖區(qū)機(jī)制,\n會(huì)讓內(nèi)核接收的信息刷新出來(lái))。否則可能不會(huì)在終端打印出來(lái)


浙公網(wǎng)安備 33010602011771號(hào)