RK 的芯片内置多个 USB 控制器,不同控制器互相独立,RK3399 就有两个 usb2.0 HOST(EHCI&OHCI)、一个 USB HSCI (EHCI)、两个 USB2.0/3.0 OTG(DWC3/XHCI)
看 dlt3399 开发板有
一路 USB3.0 host USB2.0 hub usb2.0 host type-c3.0
可以知道 USB供电 需要 额外 配置的脚:
VCC5V0_HOST_EN
TYPE-C 的除了I2C 和 type-c相关接口, 也还有个5V使能脚 VCC5V0_TYPEC0_EN
Kernel 配置,参考 rockchip_defconfig 里面是RK已经默认的配置,直接导入或者对比添加进去即可,当然我们的代码里面已经有添加的,大家看看 rockchip_defconfig 即可
使用 make ARCH=arm64 rockchip_defconfig
即可导入默认配置
使用默认配置之后,我们可以直接插鼠标看看鼠标灯能不能亮!
基本配置对了、驱动没动RK原厂的、再就是供电有了就可以使用RK 的USB功能了!
修改 Host 使能脚 为 GPIO1_C4
vcc5v0_host: vcc5v0-host-regulator {
compatible = "regulator-fixed";
enable-active-high; // 说明GPIO 拉高就使能供电
gpio = <&gpio4 25 GPIO_ACTIVE_HIGH>; // 我们的使能脚
pinctrl-names = "default";
pinctrl-0 = <&host_vbus_drv>;// 这里面使用的 pinctrl 中节点名称
regulator-name = "vcc5v0_host";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
};
可以看到,RK3399 使用的是 regulator 的配置方法进行 HOST vbus 的配置的,也就是通过电源管理方法来控制 我们 usb 的电源供给,还有一种就是配置成 GPIO 形式,直接在驱动中控制GPIO。
继续回到上面,可以知道,这是一个 rk配置 vbus-host的 regulator的配置实例,
我们搜索 host_vbus_drv pintrl 名字中也要修改成我们使用到的 使能脚
usb2 {
host_vbus_drv: host-vbus-drv {
rockchip,pins =
<4 25 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
同样的,我们也应修改 TYPE-C的使能脚,我们现在能使用 TYPE-C 是因为我们直接接电脑,有供电,要是没有连接电脑,使用 TYPE-C OTG 来使用鼠标、读取U盘也是不行的,发现鼠标灯都没亮的!
&i2c4 {
status = "okay";
i2c-scl-rising-time-ns = <475>;
i2c-scl-falling-time-ns = <26>;
fusb0: fusb30x@22 {
compatible = "fairchild,fusb302";
reg = <0x22>;
pinctrl-names = "default";
pinctrl-0 = <&fusb0_int>;// 同样也要修改 pintrl
int-n-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
vbus-5v-gpios = <&gpio4 26 GPIO_ACTIVE_HIGH>;
status = "okay";
};
};
修改 pintrl
fusb30x {
fusb0_int: fusb0-int {
rockchip,pins = <1 2 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
编译、烧写,发现鼠标灯亮了,移动看操作
接U盘,也有识别,
要是不能识别,可以通过 Lsusb 查看设备,看看是不是 kernel已经识别到,或者直接通过串口log 来看,然后就可以定位是 android层识别不到问题导致的,这个我们现在流程都是可以的!
然后使用下 鼠标右键,不能返回,
frameworks/native/services/inputflinger/InputReader.cpp -----------
old mode 100644
new mode 100755
index ef09daa..7225f89
@@ -1208,11 +1208,13 @@ uint32_t CursorButtonAccumulator::getButtonState() const {
}
if (mBtnRight) {
//$_rochchips_$_modify_by_huangjc make sure mouse BtnRight for product
+/*
char *mIsBox = new char[PROPERTY_VALUE_MAX];
property_get("ro.target.product", mIsBox, "tablet");
if(strcmp(mIsBox, "tablet")==0)
result |= AMOTION_EVENT_BUTTON_SECONDARY;
else
+ */
我们看下我们使用的驱动可以通过 搜索 compatible 名字来找匹配驱动,因为这个名字是唯一的使 dts 和 驱动进行匹配的
Fusb302.c (drivers\mfd): 这个是 TYPE-C 芯片的驱动
Fixed.c (drivers\regulator): { .compatible = "regulator-fixed", },
这是 我们usb 的电源管理驱动
usb相关的PHY 驱动在
Driver/phy 下面
usb的控制驱动就是
Driver/usb 下面
其中 dwc3 dwc2 就是 OTG3.0 OTG2.0 的 HOST 就是 对应的 host驱动!
继续看下 dts 中对 Usb 配置都是全部OKAY的
&tcphy0 {
extcon = <&fusb0>;
status = "okay";
};
&tcphy1 {
status = "okay";
};
&u2phy0 {
status = "okay";
extcon = <&fusb0>;
u2phy0_otg: otg-port {
status = "okay";
};
u2phy0_host: host-port {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
};
&u2phy1 {
status = "okay";
u2phy1_otg: otg-port {
status = "okay";
};
u2phy1_host: host-port {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
};
&usbdrd3_0 {
status = "okay";
extcon = <&fusb0>;
};
&usbdrd3_1 {
status = "okay";
};
&usbdrd_dwc3_0 {
dr_mode = "otg";
status = "okay";
};
&usbdrd_dwc3_1 {
status = "okay";
dr_mode = "host";
};
&usb_host0_ehci {
status = "okay";
};
&usb_host0_ohci {
status = "okay";
};
&usb_host1_ehci {
status = "okay";
};
&usb_host1_ohci {
status = "okay";
};