一、摘要
? ? ? ?CH55X系列內(nèi)置USB全速主從控制器,可用于各種USB主機(jī)和設(shè)備應(yīng)用。AOA協(xié)議是Google公司推出的用于實(shí)現(xiàn)Android設(shè)備與外圍設(shè)備之間的USB通訊的協(xié)議,該協(xié)議拓展了Android設(shè)備USB接口的功能,本文檔主要介紹了CH55X通過AOA協(xié)議與Android設(shè)備配件模式進(jìn)行通訊,并實(shí)現(xiàn)和APP數(shù)據(jù)交互。
二、總體概述
(1)、AOA 協(xié)議
? ? ? ?AOA協(xié)議用于Android配件模式下通過USB與主機(jī)進(jìn)行通信。基于AOA協(xié)議實(shí)現(xiàn)Android USB通信方式稱為配件模式。此模式下,與Android終端通訊的另一端設(shè)備稱為Android配件,兩者都必須支持AOA協(xié)議。在USB通訊過程中,Android終端充當(dāng)USB從機(jī),Android配件充當(dāng)USB主機(jī)并為總線供電。Android配件需要具有主機(jī)控制器并支持AOA協(xié)議。CH559,CH554,CH563都內(nèi)置USB主機(jī)控制器并支持AOA協(xié)議。通訊邏輯框圖如下:
(2)、AOA協(xié)議通訊流程
具體如下:
? ? ? A.等待安卓設(shè)備連接;
? ? ? B.確定手機(jī)支持附屬模式(配件模式 );
當(dāng)安卓設(shè)備接入U(xiǎn)SB主機(jī)時(shí),一定處于以下3種模式之一:
? ? ? *a.支持附屬模式,并且已經(jīng)在處于這種模式中;
? ? ? *b.支持附屬模式,但是還沒有進(jìn)入該模式;
? ? ? *c.不支持附屬模式;
? ? ? 當(dāng)連接初始化時(shí),處理器需要檢測(cè)安卓設(shè)備的VID(供應(yīng)商ID)和PID(產(chǎn)品ID)。如果設(shè)備已經(jīng)在附屬模式(case a),VID需要匹配谷歌ID 0x18D1,PID應(yīng)是0x2D00或者0x2D01。如果滿足以上條件,處理器就可以和安卓設(shè)備建立數(shù)據(jù)通路,使用協(xié)議通過批量端點(diǎn)進(jìn)行通訊。在配件模式,沒有必要啟動(dòng)設(shè)備。
NOTE:
? ? ? 0x2D00用于支持配件模式的安卓設(shè)備;
? ? ? 0x2D01用于支持配件模式和ADB (Android Debug Bridge)協(xié)議,額外開放了2個(gè)端點(diǎn)的二次端口用于安卓調(diào)試,如果你可以在PC上進(jìn)行模擬處理器,就可以用這2個(gè)端點(diǎn)進(jìn)行調(diào)試。通常,不要使用這個(gè)接口除非(In general, do not use this interface unless your accessory is implementing a passthrough to ADB on the device.)。
? ? ? C.如果VID和PID不符合安卓設(shè)備的配件模式,處理器就不能辨別這個(gè)安卓設(shè)備是否支持配件模式(目前不在該狀態(tài))或者(不支持該模式)。這是因?yàn)樵O(shè)備并不會(huì)在一開始就報(bào)告VID和PID,因此,處理器應(yīng)該嘗試讓設(shè)備進(jìn)入配件模式,以判定設(shè)備是否支持該模式。
主機(jī)嘗試啟動(dòng)Android配件模式:
●發(fā)送一個(gè)0x33控制請(qǐng)求(Get Protocol),來得出設(shè)備是否支持( the Android accessory protocol),返回一個(gè)非零的數(shù)字,這個(gè)數(shù)字代表了該設(shè)備支持的協(xié)議版本號(hào);這是一個(gè)端點(diǎn)0的控制請(qǐng)求,主要有以下特性:
requestType: ? ?USB_DIR_IN | USB_TYPE_VENDOR(0xC0)
request: ? ? ? ?0x33
value: ? ? ? ? ?0
index: ? ? ? ? ?0
data: ? ? ? protocol version number (16 bits little endian sent from the device to the ? ? ? ? ? ?accessory)
●如果設(shè)備返回合理的協(xié)議版本,處理器將向設(shè)備發(fā)送一個(gè)標(biāo)識(shí)字符串,這個(gè)字符串信息將為設(shè)備找一個(gè)合適的應(yīng)用(APP),如果不存在合適的應(yīng)用(APP),將會(huì)提供一個(gè)URL。這些是端點(diǎn)0的控制請(qǐng)求(對(duì)于每個(gè)不同的字符串ID),有以下特性:
requestType: ? ?USB_DIR_OUT | USB_TYPE_VENDOR(0x40)
request: ? ? ? ?0x34
value: ? ? ? ? ?0
index: ? ? ? ? ?string ID
data ? ? ? ? ? ?zero terminated UTF8 string sent from accessory to device
*以下字符串ID是被支持的,每個(gè)字符串ID最大長(zhǎng)度不超過256B,并且一定以 `\0`結(jié)尾
manufacturer name: ? 0
model name: ? ? ? ? ?1
description: ? ? ? ? 2
version: ? ? ? ? ? ? 3
URI: ? ? ? ? ? ? ? ?4
serial number: ? ? ?5
●當(dāng)發(fā)送標(biāo)識(shí)字符串時(shí),需要設(shè)備啟用配件模式,這是一個(gè)端點(diǎn)0的控制請(qǐng)求,主要有以下特性:
requestType: ? ?USB_DIR_OUT | USB_TYPE_VENDOR(0x40)
request: ? ? ? ?0x35
value: ? ? ? ? ?0
index: ? ? ? ? ?0
data: ? ? ? ? ? none
? ? ? ?在發(fā)送完最后一個(gè)控制請(qǐng)求后,連接的USB設(shè)備應(yīng)該在配件模式下向總線重新報(bào)告自己的信息,處理器可以重新枚舉該設(shè)備(進(jìn)行一次復(fù)位操作);如果設(shè)備成功切換至配件模式 ,VID和PID會(huì)不同,并且符合谷歌的VID和PID,而不是制造商ID,處理器可以和安卓設(shè)備建立通訊。
如果以上任何一個(gè)步驟出錯(cuò),設(shè)備都無法支持配件模式,處理器需要等待下一個(gè)設(shè)備連接。
建立通訊連接
? ? ? C.如果處于accessory mode的安卓設(shè)備被插上,處理器查詢?cè)O(shè)備的接口和端點(diǎn)描述符去獲取和設(shè)備通信的批量端點(diǎn)。一個(gè)PID是0x2D00的安卓設(shè)備擁有一個(gè)包含2個(gè)批量端點(diǎn)的接口,用于數(shù)據(jù)上下傳。一個(gè)PID是0x2D01的安卓設(shè)備擁有2個(gè)接口,2個(gè)批量端點(diǎn)分別用于2個(gè)接口的數(shù)據(jù)上下傳,第一個(gè)接口是標(biāo)準(zhǔn)通信(standard communication),第二個(gè)接口主要用于ADB ?communication。為了能夠和接口通訊,需要找到一個(gè)批量上下傳端點(diǎn),使用SET_CONFIGURATION (0x09) 請(qǐng)求設(shè)置配置為1,然后就可以和端點(diǎn)通訊了。
三、硬件設(shè)計(jì)
? ? ? ?CH559是一款兼容MCS51的增強(qiáng)型E8051內(nèi)核單片機(jī),79%的指令是單字節(jié)單周期指令,內(nèi)置60K Code Flash,6K+256B Ram。CH559 內(nèi)嵌USB控制器和雙USB收發(fā)器,支持 USB-Host 主機(jī)模式和 USB-Device 設(shè)備模式,支持 USB 2.0 全速 12Mbps 或者低速 1.5Mbps,USB 主機(jī)模式下可以通過雙端口 Root-HUB 同時(shí)管理兩個(gè) USB 設(shè)備。支持最大 64 字節(jié)數(shù)據(jù)包,內(nèi)置 FIFO,支持 DMA。
? ? ? CH554是一款兼容MCS51的增強(qiáng)型E8051內(nèi)核單片機(jī),79%的指令是單字節(jié)單周期指令,內(nèi)置24MHz時(shí)鐘源,內(nèi)置1K+256B RAM,16KB iFlash-ROM。CH554提供豐富的接口資源,包括ADC模數(shù)轉(zhuǎn)換、3組定時(shí)器和信號(hào)捕捉及PWM、雙異步串口、SPI等。CH554提供6通道電容檢測(cè)模塊,互電容方式支持最多15個(gè)觸摸按鍵。 ? ? ? ? CH554內(nèi)嵌全速USB控制器,支持USB HOST主機(jī)模式和USB DEVICE設(shè)備模式。
四、軟件設(shè)計(jì)
? ? ? (1)、USB主機(jī)功能開啟
? ? ? ? ? ? ?InitUSB_Host( );
? ? ? (2)、等待USB設(shè)備連接
? ? ? ? if ( UIF_DETECT ) ? ? ? ? ? ?// 如果有USB主機(jī)檢測(cè)中斷則處理
? ? ? ? {
? ? ? ? ? ? UIF_DETECT = 0; ? ? ? ? ?// 清中斷標(biāo)志
? ? ? ? ? ? AccessoryModeOpenSuc = 0;//清除模式設(shè)置標(biāo)志位
? ? ? ? ? ? s = AnalyzeRootHub( ); ? // 分析ROOT-HUB狀態(tài)
? ? ? ? ? ? if ( s == ERR_USB_CONNECT )
? ? ? ? ? ? {
? ? ? ? ? ? ? ? FoundNewDev = 1;
? ? ? ? ? ? }
? ? ? ? }
? ? ? (3)、設(shè)置Android配件模式
? ? ? ? ? ? ?s = InitRootDevice( ); ?// 初始化USB設(shè)備,Accessory mode預(yù)設(shè)置
? ? ? ? ? ? ?s = InitRootDevice( ); ?// 設(shè)置Android配件模式
? ? ? ? ? ? ?獲取批量傳輸端點(diǎn)
? ? ? (4)獲取AOA協(xié)議版本、關(guān)聯(lián)URL、啟動(dòng)配件模式?
? ? ? ? ? ? AOAModeInit(); ? ? ? ? ?// AOA初始化函數(shù)
? ? ? (5)、批量數(shù)據(jù)通訊
五、可拓展功能
CH55X的IO、SPI、串口、并口等接口資源可以連接需要擴(kuò)展的功能模塊:
? ? ? ? ? A.連接其他傳感器進(jìn)行數(shù)據(jù)采集上傳;
? ? ? ? ? B.通過串口連接其他串口模塊進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)、透?jìng)骰蛘呒用埽?/span>
? ? ? ? ? C.其他硬件采集模塊數(shù)據(jù)與Android手持終端的數(shù)據(jù)交互等;
六、應(yīng)用場(chǎng)合
? ? ? ? 汽車電子、手機(jī)周邊、游戲產(chǎn)品等。
七、源碼