本文已参与 [新人创作礼] 活动,一起开启掘金创作之路。
《HiMobileCam SDK安装使用说明》中6.2节介绍了基于海思芯片的USB网口的搭建,分为两部分:6.2.1 USB Device网口操作实例和6.2.2 Windows 10系统USB转网口驱动配置。博客二、海思平台USB转网口在Win10上的使用_lan120576664的博客-CSDN博客_win10usb转网口怎么设置 《二、海思平台USB转网口在Win10上的使用》和三、海思平台通过USB转网口 桥接连接外网_lan120576664的博客-CSDN博客_使用网口转usb访问网关不同 《三、海思平台通过USB转网口 桥接连接外网》也基于海思的文档的这部分内容进行了详细步骤说明,写得十分细致,写明了很多手册中模棱两可的地方。
但有一点值得注意的是,无论是海思指导文档还是博客文章中,都只说通过(两头公)USB线连接PC和海思板子后,在海思板子上运行komod/usb2net_load.sh脚本,PC端设备管理器中就会发现新设备,之后就要加载驱动,之后一步一步往下进行……这两者都没有提到通过USB线连接PC与海思板子,并且海思板侧也运行了usb2net_load.sh脚本后,PC端设备管理器没有发现新设备,甚至完全没有反应,这种情况下应该怎么做,是哪里的原因。笔者遇到了这种情况,非常艰难地解决了这个问题,越过了这个深坑。下边就来说一说应该如何解决这个问题。
实际上博客《二、海思平台USB转网口在Win10上的使用》这篇文章中已经提到了需要配置内核。但是笔者按照它的说明配置了内核,结果编译烧录后Windows下仍然无法发现设备,板端也无法映射出usb0这个网络设备。经过反复查找原因和实验,最终在供应商的大力帮助下,终于找到了问题所在。
解决这个问题需要以下几个步骤:
1. 修改dtsi文件
供应商建议将usb模式由host修改为device,这需要通过修改dtsi文件来实现。他们给出了他们的dtsi问年间,现贴出usb相关部分代码。文件位于{SDK}/osdrv/opensource/kernel/linux-4.9.y/arch/arm/boot/dts/下,名称为hi35XX(av)X00.dtsi。
-------------------------------------------------------------------------------------------------------------------------------------------------------
#ifndef CONFIG_HISI_MC
#if 1
hidwc3_0@0x04110000 {
compatible = "snps,dwc3";
reg = <0x04110000 0x10000>;
interrupts = <0 111 4>;
interrupt-names = "peripheral";
maximum-speed = "super-speed";
dr_mode = "peripheral";
snps,dis_initiate_u1;
snps,dis_initiate_u2;
};
#else
xhci_0@0x04110000 {
compatible = "generic-xhci";
reg = <0x04110000 0x10000>;
interrupts = <0 111 4>;
usb2-lpm-disable;
};
#endif
#if 1
hidwc3_1@0x04120000 {
compatible = "snps,dwc3";
reg = <0x04120000 0x10000>;
interrupts = <0 112 4>;
interrupt-names = "peripheral";
maximum-speed = "high-speed";
dr_mode = "peripheral";
};
else
xhci_1@0x04120000 {
compatible = "generic-xhci";
reg = <0x04120000 0x10000>;
interrupts = <0 112 4>;
usb2-lpm-disable;
};
#endif
#else
#if 0
xhci_0@0x04110000 {
compatible = "generic-xhci";
reg = <0x04110000 0x10000>;
interrupts = <0 111 4>;
usb2-lpm-disable;
};
#endif
#if 0
hidwc3_1@0x04120000 {
compatible = "snps,dwc3";
reg = <0x04120000 0x10000>;
interrupts = <0 112 4>;
interrupt-names = "peripheral";
maximum-speed = "high-speed";
dr_mode = "peripheral";
};
#endif
#if 1
xhci_1@0x04120000 {
compatible = "generic-xhci";
reg = <0x04120000 0x10000>;
interrupts = <0 112 4>;
usb2-lpm-disable;
};
#endif
#if 1
hidwc3_0@0x04110000 {
compatible = "snps,dwc3";
reg = <0x04110000 0x10000>;
interrupts = <0 111 4>;
interrupt-names = "peripheral";
maximum-speed = "super-speed";
dr_mode = "peripheral";
snps,dis_initiate_u1;
snps,dis_initiate_u2;
};
#endif
#endif
-------------------------------------------------------------------------------------------------------------------------------------------------
2. 参照ReleaseDoc(HI35XXXXX00)liteos\zh\01.software\board\OSDRV\《外围设备驱动 操作指南》进行修改
《外围设备驱动 操作指南》中提到的步骤倒也没必要完全照做,只需要将USB复合设备相关驱动和USB Device控制器驱动中提到的ko对应的menuconfig中的项勾选上,保证这些ko能够正确生成就可以了。
3. usb2net_load.sh脚本文件修改
笔者执行了以上2步之后,编译出内核镜像烧录到海思开发板上。原以为这次PC端会检测到新设备,海思板端ifconfig -a 时会出现usb0设备,如同供应商在他那里的现象一样,但没想到仍然无法映射出设备。这就有点匪夷所思了,因为几乎同样的内核代码,同样的内核配置,得到的结果却不一样。仔细观察供应商提供的他的板子上的信息,发现lsmod时少了一个dwc3,也就是说没有insmod dwc3.ko。保证试一试的态度运行了insmod /app/komod/dwc3.ko这个命令,这次usb0设备出来了!这就说明dwc3.ko十分关键,少了它就不能正常映射出usb0设备。
usb2net_load.sh内容如下:
/ # cat /app/komod/usb2net_load.sh
-------------------------------------------------------------------------------------------------------------
#!/bin/sh
cd /app/komod/
insmod libcomposite.ko
insmod u_ether.ko
insmod u_serial.ko
insmod usb_f_acm.ko
insmod usb_f_rndis.ko
insmod g_multi.ko
exit
--------------------------------------------------------------------------------------------------------------
/ #
可以看到其中并没有insmod dwc3.ko这条语句,那么就需要手动添加到文件中了。
添加好之后保存退出,执行usb2net_load.sh,这样usb0设备就能正常出现了。
之后的步骤按照海思文档尤其是博客中的2篇文章一步一步做就可以了。
经过了后来的调试,发现之前的判断并不完全准确。不是只要插入dwc3.ko就会起作用,而是dwc3.ko与/app/komod/usb2net_load.sh中的各个ko共同作用的结果。
最新调试发现,在运行main_app后,直接运行原始的usb2net_load.sh即可映射出usb0网络设备。如果没有运行main_app,则需要运行usb2net_load.sh,再运行insmod dwc3.ko,这样也可以映射出usb0设备。