hzyitc / armbian-onecloud

Armbian for onecloud. 玩客云用armbian
1.24k stars 239 forks source link

模拟U盘拔掉再插死机问题 #71

Open fat-wang opened 2 years ago

fat-wang commented 2 years ago

在使用玩客云OTG模拟U盘过程中发现,从电脑拔掉公对公USB然后再插,玩客云100%会死机。 TTL和SSH都会无响应,网络过一会儿会断开。 TTL中最后的日志为: [ 299.371333] dwc2 c9040000.usb: dwc2_hsotg_ep_stop_xfr: timeout GINTSTS.GOUTNAKEFF [ 299.373543] dwc2 c9040000.usb: dwc2_hsotg_ep_stop_xfr: timeout DOEPCTL.EPDisable

网上搜发现 https://bugzilla.kernel.org/show_bug.cgi?id=209555 和我的问题类似。尝试修改了对应位置并重编译内核,但对玩客云并没什么用。

请问大佬有解决办法吗?

hzyitc commented 2 years ago

我自己确实也有这个问题,但没有这些日志。

个人怀疑是冲击电流的原因。暂时没去研究这个问题。

BTW, 你的连接线有断开vcc吗

fat-wang commented 2 years ago

连接线有断开VCC。并且测试了没断开VCC的USB线,也存在问题。 这个问题在1.0和1.3主板上都存在。 另外我测试了3.10.107内核(来自odroid-c的ubuntu镜像), 没有这个问题, 多次插拔一切正常。但它在1.0主板上似乎不能通过dtb控制usb模式为otg。 3.10.107内核多次插拔工作正常的日志为(每次插拔都会有): [ 1223.852531] USB RESET [ 1224.028630] g_mass_storage gadget: high-speed config #1: Linux File-Backed Storage

shuxin commented 1 year ago

看起来需要强制开启device模式,不然不能自动识别。 echo device > /sys/class/usb_role/c9040000.usb-role-switch/role

我也遇到了,哪怕是模拟HID键鼠,拔掉再插,也是必然死机。不过我这不影响,我的需求就是插上不动。20块玩客云+18块的usb采集卡,成本最低的pi kvm。

fat-wang commented 1 year ago

测试了大佬https://github.com/hzyitc/pikvm-onecloud这个包。 问题解决了一半。 插拔不再死机,但模拟的设备插拔后不能正确识别。 这已经是个很大的进步了,至少现在我可以通过SSH控制重启来恢复设备。

shuxin commented 1 year ago

测试了大佬https://github.com/hzyitc/pikvm-onecloud 这个包。问题解决了一半。 插拔不再死机,但模拟的设备插拔后不能正确识别。 这已经是个很大的进步了,至少现在我可以通过SSH控制重启来恢复设备。

你用的那个版本?1.0还是1.3? 我刷的这个包,断开会导致 玩客云重启。因为重启太慢,用到是能用,但是跟不上bios界面。

fat-wang commented 1 year ago

测试了大佬https://github.com/hzyitc/pikvm-onecloud 这个包。问题解决了一半。 插拔不再死机,但模拟的设备插拔后不能正确识别。 这已经是个很大的进步了,至少现在我可以通过SSH控制重启来恢复设备。

你用的那个版本?1.0还是1.3? 我刷的这个包,断开会导致 玩客云重启。因为重启太慢,用到是能用,但是跟不上bios界面。

我用1.0主板测试的. 我只试了g_mass_storage. 断开重启问题你可以再看下armbian中hzyitc提交的关于USB以及PWM相关的补丁, 和pikvm-onecloud的补丁结合下重编译内核试试.

shuxin commented 1 year ago

测试了大佬https://github.com/hzyitc/pikvm-onecloud 这个包。问题解决了一半。 插拔不再死机,但模拟的设备插拔后不能正确识别。 这已经是个很大的进步了,至少现在我可以通过SSH控制重启来恢复设备。

你用的那个版本?1.0还是1.3? 我刷的这个包,断开会导致 玩客云重启。因为重启太慢,用到是能用,但是跟不上bios界面。

我用1.0主板测试的. 我只试了g_mass_storage. 断开重启问题你可以再看下armbian中hzyitc提交的关于USB以及PWM相关的补丁, 和pikvm-onecloud的补丁结合下重编译内核试试.

看来是
pikvm-onecloud 在1.0无效,1.3重启 armbian-onecloud 在1.0、1.3都死机无任何日志

mofeng-git commented 1 year ago

使用作者旧版Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.xz 在旧版主板和主板otg功能正常(pikvm所需的otg功能可以正常使用,没有拔插重启现象),不过需手动在dtb处开启。

shuxin commented 1 year ago

Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.

是这个吗?Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.xz

mofeng-git commented 1 year ago

Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.

是这个吗?Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.xz

是的,它需要在dtb开启OTG功能,新旧版本主板使用此系统模拟键鼠和U盘都是正常的,我使用此镜像近乎完美的运行了pikvm(在B站上发布pikvm相关教程,网友反馈正常)

fat-wang commented 1 year ago

5.10.x的内核确实没问题。完美~

shuxin commented 1 year ago

Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.

是这个吗?Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.xz

是的,它需要在dtb开启OTG功能,新旧版本主板使用此系统模拟键鼠和U盘都是正常的,我使用此镜像近乎完美的运行了pikvm(在B站上发布pikvm相关教程,网友反馈正常)

请问dtb改哪里呢?

fat-wang commented 1 year ago

Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.

是这个吗?Armbian_22.11.0-trunk_Onecloud_jammy_legacy_5.10.149.burn.img.xz

是的,它需要在dtb开启OTG功能,新旧版本主板使用此系统模拟键鼠和U盘都是正常的,我使用此镜像近乎完美的运行了pikvm(在B站上发布pikvm相关教程,网友反馈正常)

请问dtb改哪里呢?

看这里 https://www.bilibili.com/read/cv26519526/

shuxin commented 1 year ago

测试了大佬 https://github.com/hzyitc/pikvm-onecloud 这个包。

问题解决了一半。

插拔不再死机,但模拟的设备插拔后不能正确识别。

这已经是个很大的进步了,至少现在我可以通过SSH控制重启来恢复设备。

我有个大胆的想法。把这个包 https://github.com/hzyitc/pikvm-onecloud 的boot分区,从5.18换成5.10。毕竟都是jammy,应该兼容。这样工作量最小。刷完后,替换boot分区几个文件而已。

fat-wang commented 1 year ago

测试了大佬 https://github.com/hzyitc/pikvm-onecloud 这个包。 问题解决了一半。 插拔不再死机,但模拟的设备插拔后不能正确识别。 这已经是个很大的进步了,至少现在我可以通过SSH控制重启来恢复设备。

我有个大胆的想法。把这个包 https://github.com/hzyitc/pikvm-onecloud 的boot分区,从5.18换成5.10。毕竟都是jammy,应该兼容。这样工作量最小。刷完后,替换boot分区几个文件而已。

意义何在?想要5.10内核不同的系统?releases中搜5.10,armbian/ubuntu、线刷的/U盘的、不同版本的镜像 任君挑选~ 如果是已有系统不想重刷, 那你要替换 /boot/zImage /boot/uInitrd /boot/dtb /lib/modules/

mofeng-git commented 9 months ago

提交此问题的otg修复补丁 描述:猜测是玩客云不支持时钟门方式省电,此功能从5.15内核第一次引入并沿用至今,所以自5.15内核开始出现otg拔插死机问题。 适用分支:5.15内核及以上版本 测试环境:在6.6.15和6.7内核上测试otg拔插正常

-- 
 drivers/usb/dwc2/core_intr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index 158ede753..cf261581c 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -524,12 +524,12 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
            case DWC2_POWER_DOWN_PARAM_NONE:
                /*
                 * If neither hibernation nor partial power down are supported,
                 * clock gating is used to save power.
                 */
-               if (!hsotg->params.no_clock_gating)
-                   dwc2_gadget_enter_clock_gating(hsotg);
+               if (!hsotg->params.no_clock_gating) ;
+                   //dwc2_gadget_enter_clock_gating(hsotg);
            }

            /*
             * Change to L2 (suspend) state before releasing
             * spinlock
-- 
hzyitc commented 8 months ago

提交此问题的otg修复补丁 描述:猜测是玩客云不支持时钟门方式省电,此功能从5.15内核第一次引入并沿用至今,所以自5.15内核开始出现otg拔插死机问题。 适用分支:5.15内核及以上版本 测试环境:在6.6.15和6.7内核上测试otg拔插正常

-- 
 drivers/usb/dwc2/core_intr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index 158ede753..cf261581c 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -524,12 +524,12 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
          case DWC2_POWER_DOWN_PARAM_NONE:
              /*
               * If neither hibernation nor partial power down are supported,
               * clock gating is used to save power.
               */
-             if (!hsotg->params.no_clock_gating)
-                 dwc2_gadget_enter_clock_gating(hsotg);
+             if (!hsotg->params.no_clock_gating) ;
+                 //dwc2_gadget_enter_clock_gating(hsotg);
          }

          /*
           * Change to L2 (suspend) state before releasing
           * spinlock
-- 

GJ,看起来可以通过no_clock_gating直接控制,有没有尝试过直接修改该参数?

mofeng-git commented 8 months ago

提交此问题的otg修复补丁 描述:猜测是玩客云不支持时钟门方式省电,此功能从5.15内核第一次引入并沿用至今,所以自5.15内核开始出现otg拔插死机问题。 适用分支:5.15内核及以上版本 测试环境:在6.6.15和6.7内核上测试otg拔插正常

-- 
 drivers/usb/dwc2/core_intr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index 158ede753..cf261581c 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -524,12 +524,12 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
            case DWC2_POWER_DOWN_PARAM_NONE:
                /*
                 * If neither hibernation nor partial power down are supported,
                 * clock gating is used to save power.
                 */
-               if (!hsotg->params.no_clock_gating)
-                   dwc2_gadget_enter_clock_gating(hsotg);
+               if (!hsotg->params.no_clock_gating) ;
+                   //dwc2_gadget_enter_clock_gating(hsotg);
            }

            /*
             * Change to L2 (suspend) state before releasing
             * spinlock
-- 

GJ,看起来可以通过no_clock_gating直接控制,有没有尝试过直接修改该参数?

以前的测试结果:向dwc2驱动的meson8b配置添加p->no_clock_gating = true;后仍内核失联假死,但多次拔插后otg设备可用(即内核失联时otg虚拟设备仍正常工作,不会提示未知设备)。再在dwc2_set_param_power_down函数添加hsotg->params.power_down = 0;后工作正常。但出现了副作用:windows识别otg虚拟设备非常慢,接近半分钟。

而注释dwc2_gadget_enter_clock_gating(hsotg);不会带来副作用,不会影响otg虚拟设备识别速度。

hzyitc commented 8 months ago

以前的测试结果:向dwc2驱动的meson8b配置添加p->no_clock_gating = true;后仍内核失联假死,但多次拔插后otg设备可用(即内核失联时otg虚拟设备仍正常工作,不会提示未知设备)。再在dwc2_set_param_power_down函数添加hsotg->params.power_down = 0;后工作正常。但出现了副作用:windows识别otg虚拟设备非常慢,接近半分钟。

而注释dwc2_gadget_enter_clock_gating(hsotg);不会带来副作用,不会影响otg虚拟设备识别速度。

行,等我有空测试下