Source(供电端)、Sink(用电端)和 DRP(双重角色,或为供电端,或为用电端,可根据需要随时变换),TYPEC USB3.0 使用两对差分信号:TX 差分两根线 , RX 差分两根线。
结构框图
上面是FUSB301的结构框图,上面标注了3个框:
-
配置接口使用的是I2C,遵循I2C协议通讯,可对FUSB301进行配置。
-
如果typec 使用的是usb3.1 ,速率为10Gbps(USB3.0 5Gbps)。如果信号线还是被简单地一分二的话,不连续的信号线阻抗将严重破坏数据传输质量,因此必须由MUX切换来保证信号路径阻抗的一致性,以确保信号传输质量。这个mux芯片就是FUSB340芯片。此芯片可以根据ss_sw去选择对应的路。图如下:
3. CC检测引脚。usb线就只有一个CC线。如下图所示:
通过检测CC的电压状态,来判断插入的是device还是host。 通过CC1还是CC2是否连接判断正反插。
-
ID引脚输出表,表如下:
当有device插入时,ID引脚输出低电平。 默认为高组态。可以上拉一个电源。
如下:
FUSB301配置接口I2C
-
I2C的一些基础知识
I2C 输出都是开漏输出,所以在输出端都需要上拉电阻,在正常状态下都是高电平状态。I2C。 -
时序图
-
读写操作
驱动读代码段:
读分为两个消息:
第一个是写:写寄存器地址
第二个是读: 读数据
驱动写代码段:
写就是一个消息:
需要写的寄存器地址和数据
FUSB301芯片使用
根据数据手册,首先确认slave addr: 地址为0x25
如果要配置为OTG的话,需要将mode设置为DRP模式:
使用I2C工具进行调试:
查看有哪些I2C控制器
iking@iking:~$ i2cdetect -l
i2c-3 i2c 3190000.i2c I2C adapter
i2c-30 i2c i2c-2-mux (chan_id 0) I2C adapter
i2c-1 i2c c240000.i2c I2C adapter
i2c-37 i2c i2c-2-mux (chan_id 7) I2C adapter
i2c-8 i2c 31e0000.i2c I2C adapter
i2c-35 i2c i2c-2-mux (chan_id 5) I2C adapter
i2c-6 i2c 31c0000.i2c I2C adapter
i2c-33 i2c i2c-2-mux (chan_id 3) I2C adapter
i2c-4 i2c Tegra BPMP I2C adapter I2C adapter
i2c-31 i2c i2c-2-mux (chan_id 1) I2C adapter
i2c-2 i2c 3180000.i2c I2C adapter
i2c-0 i2c 3160000.i2c I2C adapter
i2c-9 i2c NVIDIA SOC i2c adapter 0 I2C adapter
i2c-36 i2c i2c-2-mux (chan_id 6) I2C adapter
i2c-7 i2c c250000.i2c I2C adapter
i2c-34 i2c i2c-2-mux (chan_id 4) I2C adapter
i2c-5 i2c 31b0000.i2c I2C adapter
i2c-32 i2c i2c-2-mux (chan_id 2) I2C adapter
通过数据手册确认了我们使用的I2C控制器为I2C2,对应为i2c-1。
扫描看控制器上有哪些设备:
iking@iking:~$ i2cdetect -y 1
Warning: Can't use SMBus Quick Write command, will skip some addresses
0 1 2 3 4 5 6 7 8 9 a b c d e f
00:
10:
20:
30: -- -- -- -- -- -- -- --
40:
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60:
70:
结果好像没有找到0x25的设备。
使用工具直接与0x25设备通讯,获取寄存器数据:
iking@iking:~$ i2cdump -f -y 1 0x25
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 12 04 03 00 00 00 00 00 00 00 00 00 00 00 00 .???............
10: 00 09 08 00 00 00 00 00 00 00 00 00 00 00 00 00 .??.............
20: 00 00 c1 80 20 00 00 00 00 00 00 00 00 00 00 00 ..?? ...........
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
可以看到设备id为0x12.硬件设备通讯正常。
如果不想写驱动,可以直接通过工具将数据写进去:
i2cset -f -y 1 0x25 0x02 0x10
写完后查看:
iking@iking:~$ i2cdump -f -y 1 0x25
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 12 10 03 00 00 00 00 00 00 00 00 00 00 00 00 .???............
10: 00 09 08 00 00 00 00 00 00 00 00 00 00 00 00 00 .??.............
20: 00 00 c1 80 20 00 00 00 00 00 00 00 00 00 00 00 ..?? ...........
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
从上面看出02寄存器的数据由0x04默认值变更为0x10数值了。
稍后把设备的驱动程序附上。