3.2release中USB的HDF适配及acm模式切换方法

 目标

进行USB的HDF适配,能使USB进行模式间的切换。

一、USB的HDF适配

步骤一 增加编译文件f_generic.c

1. kernel\linux\linux-5.10\arch\arm64\configs中的XXX_defconfig文件中增加

CONFIG_DRIVERS_HDF_USB_F_GENERIC=y

2. kernel\linux\linux-5.10\drivers\usb\gadget\Kconfig中增加

config DRIVERS_HDF_USB_F_GENERIC
bool "Enable F_GENERIC driver"
default y
depends on DRIVERS_HDF
help
Answer Y to choice HDF USB F_GENERIC driver.

3. kernel\linux\linux-5.10\drivers\usb\gadget\function\Makefile中增加

usb_f_generic-y		:= f_generic.o
obj-$(CONFIG_DRIVERS_HDF_USB_F_GENERIC) += usb_f_generic.o

 步骤二 增加USB设备通知事件代码

1. 在kernel\linux\linux-5.10\drivers\usb\core\notify.c中增加

void usb_notify_online_status(bool online)
{
	if (online) {
		blocking_notifier_call_chain(&usb_notifier_list, USB_GADGET_ADD, NULL);
	} else {
		blocking_notifier_call_chain(&usb_notifier_list, USB_GADGET_REMOVE, NULL);
	}
}

2. 在kernel\linux\linux-5.10\drivers\usb\dwc3\gadget.c中

 3653行增加

usb_notify_online_status(false); //3653行

3661行增加

usb_notify_online_status(true);//3661行

3. kernel\linux\linux-5.10\include\linux\usb.h中增加2022行--2026行

#define USB_GADGET_ADD 0x0005
#define USB_GADGET_REMOVE 0x0006
extern void usb_register_notify(struct notifier_block *nb);
extern void usb_unregister_notify(struct notifier_block *nb);
extern void usb_notify_online_status(bool online);

 步骤三 增加vendor仓下OH相关配置

1. 进行config.json文件配置,可以参考vendor\hihope\rk3568\config.json;

2. 进行device_info.hcs文件配置,可以参考vendor\hihope\rk3568\hdf_config\uhdf\device_info.hcs,重点关注

 usb :: host {
            hostName = "usb_host";
            priority = 50;
            caps = ["DAC_OVERRIDE"];
            usb_pnp_manager_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 70;
                    moduleName = "libusb_pnp_manager.z.so";
                    serviceName = "usb_pnp_manager";
                }
            }
            usbfn_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 80;
                    moduleName = "libusbfn_master.z.so";
                    serviceName = "usbfn_master";
                    deviceMatchAttr = "usbfn_master_driver";
                }
            }
            ecm_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 81;
                    moduleName = "libusbfn_cdcecm.z.so";
                    serviceName = "usbfn_cdcecm";
                    deviceMatchAttr = "usbfn_cdcecm_driver";
                }
            }
            acm_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    moduleName = "libusbfn_cdcacm.z.so";
                    serviceName = "usbfn_cdcacm";
                    deviceMatchAttr = "usbfn_cdcacm_driver";
                }
            }
            usb_device :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    moduleName = "libusb_driver.z.so";
                    serviceName = "usb_interface_service";
                }
            }
        }

步骤三 增加芯片相关配置

1.  查看default_config.h中dwc3值是否正确,不正确则需要修改,此值可以通过驱动配置dts文件获取;RK3568中此值为fcc00000,在device\soc\rockchip\common\hal\usb\rk3568\include\default_config.h中设置

#define UDC_NAME "fcc00000.dwc3"

2. 参考device\soc\rockchip\rk3568\soc.gni中增加

usb_default_config_path = "//device/soc/rockchip/common/hal/usb/rk3568/include"

3.  参考RK3568检查drivers\peripheral\usb\BUILD.gn中是否有deps被注释掉

group("usb_entry") {
    deps = [
      "//drivers/peripheral/usb/cfg:usb_etc_files",
      "//drivers/peripheral/usb/ddk:libusb_core",
      "//drivers/peripheral/usb/gadget/function/acm:libusbfn_cdcacm",
      "//drivers/peripheral/usb/gadget/function/ecm:libusbfn_cdcecm",
      "//drivers/peripheral/usb/gadget/function/master:libusbfn_master",
      "//drivers/peripheral/usb/hdi_service:hdi_usb_service",
      "//drivers/peripheral/usb/net:libusbhost_ecm",
      "//drivers/peripheral/usb/serial:libusbhost_acm",
      "//drivers/peripheral/usb/serial:libusbhost_acm_rawapi",
    ]
  }

4. 参考RK3568检查drivers\peripheral\usb\bundle.json中usb的配置项

  "build": {
      "sub_component": [
        "//drivers/peripheral/usb:usb_entry"
      ],
      "test": [
        "//drivers/peripheral/usb/test:hdf_test_usb"
      ],

5.  参考RK3568检查drivers\peripheral\usb\usb.gni中usb路径是否存在

import("//vendor/${product_company}/${product_name}/product.gni")
default_config_path = usb_default_config_path

注意:USB适配完毕后,记得插拔一下USB设备,来触发notify方法。

二、USB切换acm、ecm等方法

备注:此模式切换以RK3568为例进行说明,同时提前需用zadig.exe安装libusb-win32 devices驱动

1.  修改base\usb\usb_manager\test\native\BUILD.gn代码,在把第19行代码修改如下

--deps = []
++deps = ["../tool/:usb_function_port_test"]

2.  编译工具

./build.sh --product-name rk3568 --build-target usb_unittest_test

3. 安装工具

工具输出目录为//out/rk3568/usb/usb_manager/ 下,使用hdc file send推进到单板中,如下命令

hdc file send C:\Users\xxx\Desktop\usb_function_port_test /data

4.  修改执行权限(在/data目录下)

chmod +x usb_function_port_test

5.  查看当前模式,执行以下命令,会显示 GetCurrentFunctionInfo:62 get current function: hdc,表明当前模式为HDC模式

./usb_function_port_test -f 0

6. 切换其他模式

其他模式的切换命令是一致的,如切换为acm 模式,命令如下,此时hdc会自动断开

./usb_function_port_test -f 1

7.  查看可使用的命令

./usb_function_port_test -h
2 args
-p 0: Query Port
-p 1: Switch to host
-p 2: Switch to device:
-f 0: Query function
-f 1: Switch to function:acm
-f 2: Switch to function:ecm
-f 3: Switch to function:acm&ecm
-f 4: Switch to function:hdc
-f 5: Switch to function:acm&hdc
-f 6: Switch to function:ecm&hdc
-f 32: Switch to function:rndis
-f 512: Switch to function:storage
-f 36: Switch to function:rndis&hdc
-f 516: Switch to function:storage&hdc

openharmony hdf适配是指在openharmony操作系统,使用hdf框架进行硬件设备的适配hdf是一种硬件设备抽象层的开发框架,可以帮助开发者简化硬件设备的驱动开发工作。 在openharmony系统,不同的硬件设备需要与操作系统进行交互,以实现功能的完整性。而hdf框架的作用就是通过提供一系列接口和函数,使不同硬件设备的驱动程序能够与openharmony系统进行交互和通信。 通过使用hdf框架进行适配,可以实现如下优点: 1. 硬件设备的抽象化:hdf框架提供了一系列标准化接口,可以将硬件设备的具体实现进行抽象化,使得不同的硬件设备能够使用相同的接口进行访问和控制。 2. 简化开发工作:使用hdf框架可以避免开发者直接与底层硬件进行交互,减少了开发工作的复杂性。开发者只需要通过hdf的接口函数进行调用和操作,就能够完成硬件设备的驱动开发。 3. 提高代码的可重用性:hdf框架提供了一套通用的接口,这些接口可以在不同的硬件设备之间进行共享和复用。这样一来,当需要适配新的硬件设备时,只需要实现部分适配层的代码即可,大大提高了代码的可重用性。 4. 方便维护和升级:通过使用hdf框架进行适配,系统维护和升级变得更加方便。当需要对硬件设备进行维护或者升级时,只需要修改hdf框架的适配代码,而不需要修改原始的驱动程序。 总之,openharmony hdf适配的目的在于简化硬件设备的驱动开发工作,提高代码的可重用性和系统的维护性。通过使用hdf框架,开发者可以更加方便地实现不同硬件设备的适配,为用户提供更加稳定和高效的系统体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值