從全局說起。先說host對dev的插入檢測。由于dev插入到host,導致為0的D+和D-線突然有了電平變化,有且只有一根線的電平會變。在高速和全速模式下,D+線會被拉高;在低速模式下D-線會被拉高。同時,host會對插入的dev進行消抖檢測,在RTL中延遲一段時間,認為抖動結束,開始真正地檢測dev是否插入。
當檢測到dev插入,host狀態機從PRT_DISCON轉向PRT_DISABLE,因為此時僅用于檢測插入,還沒有使能該port,故狀態機名字叫做PRT_DISABLE。對host,會給ulpi phy連續發送兩個數,0x84和0x50,查ulpi手冊得知,這兩個數是給ulpi芯片的地址0x4寫入0x50,將host的port opmode(port的操作模式)切換成disable bit-stuff和disable NRZI編碼,這就是通知upli PHY,下一步要發送k j序列了,不要耽誤事,不要對我的k j序列進行編碼解碼。對于高速host,在切換port的op_mode后,才能發送復位,才能進入等待chirp k狀態;對于全速設備,直接進入復位狀態。以下以高速host為例。
等待chirp k,如果插入的dev也支持高速傳輸,則會拉高D-線一段時間,向host發送chrip k,host收到后會向dev發送至少3對的k j序列,與dev握手,dev收到后將自己切換成高速狀態。這就是chrip的handshake。
隨后,host將prt_opmode切換,將PHY變成NORMAL模式。
chirp handshake結束后,D+和D-自然就回到了SE0態,即D+/D-為0。那么此時host由于處于HST_CHIRP_DONE狀態,并不會將SE0視作復位,并且該SE0持續時間很短,大概200us,而USB協議復位需要持續ms級時長才能被當作復位。
隨后,host狀態切換為正常狀態,開始每隔125us發送起始幀。