从全局说起。先说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发送起始帧。