瑞芯微Rockchip开发者社区
直播中

h1654155275.5669

7年用户 1028经验值
私信 关注
[经验]

RK3399内置USB控制器支持u盘鼠标

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

[url=home.php?mod=space&uid=1999721]@@[/url] -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";

};

原作者:荣敢飞

更多回帖

发帖
×
20
完善资料,
赚取积分