OpenNuvoton / NUC980-linux-4.4.y

Linux 4.4 Kernel Source Code for NUC980 Series Microprocessor
Other
48 stars 58 forks source link

nuc980 usbd 驱动问题 #51

Open unixjet opened 3 years ago

unixjet commented 3 years ago

你好,我在NUC980 NK-980IoT 测试 USB Device的CDC-ACM功能,在 linux 内核配置中,USB Gadget Driver 和Serial Gadget (with CDC ACM and CDC OBEX support) 都是以编译进内核方式启用。配置如下: Device Drivers ---> [] USB support ---> <> USB Gadget Support ---> USB Peripheral Controller ---> <> NUC980 USB Device Controller <> USB Gadget Driver <*> Serial Gadget (with CDC ACM and CDC OBEX support)

开机操作:usb 线接到板子的micro USB, 一端接到PC, 然后按复位键重启系统。 发现的现象:开机进入系统后,nuc980 usb gadget 驱动不断打印 "timeout!!", 经过4~5分钟,PC 才可以枚举出这个CDC-ACM 设备。

我到linux 内核源码 查看一下文件:drivers/usb/gadget/udc/nuc980_udc.c,在行589开始处看到以下代码: 589 if (IrqStL & USBD_GINTSTS_CEPIF) 590 { 591 IrqSt = raw_readl(udc->base + REG_USBD_CEPINTSTS) & __raw_readl(udc->base + REG_USBD_CEPINTEN); 592 raw_writel(IrqSt, udc->base + REG_USBD_CEPINTSTS); 593 if (IrqSt && udc->driver) 594 paser_irq_cep(udc, IrqSt); 595 } 然后深入到paser_irq_cep(udc, IrqSt)查看,发现代码如下:
438 if (irq & USBD_CEPINTSTS_INTKIF) 439 { 440 if (udc->ep0state == EP0_IN_DATA_PHASE) 441 { 442 timeout = 0; 443 while (1) 444 { 445 if (__raw_readl(udc->base + REG_USBD_CEPINTSTS) & 0x1000) / buffer empty / 446 break; ...

觉得445行有问题,因为在进入paser_irq_cep 之前,已经通过592行清除了相关标志位,那么在445行还在轮询”BUFFER EMPTY” 这个标志位是否合理? 然后我做了修改:
589 if (IrqStL & USBD_GINTSTS_CEPIF) 590 { 591 IrqSt = raw_readl(udc->base + REG_USBD_CEPINTSTS) & __raw_readl(udc->base + REG_USBD_CEPINTEN); 592 // raw_writel(IrqSt, udc->base + REG_USBD_CEPINTSTS); 593 if (IrqSt && udc->driver) 594 paser_irq_cep(udc, IrqSt); 595 __raw_writel(IrqSt, udc->base + REG_USBD_CEPINTSTS); 596 } 注释到592行,把清除标志位的操作放在paser_irq_cep 之后,见595行;编译烧录,板子开机后可被PC快速识别出来。 这是否是bug? 这么修改是否正确?需要您确认一下,因为要应用到产品中,我 希望nuc980 的 CDC-ACM 可以很稳定。

另外,paser_irq_ceq 的paser 是typo 吗?parser 可能合理点。我检索了paser英文释义也没有确定这个单词的确切含义,或者可能是我不懂nuc980 usb 驱动的一些术语(terms)。

yachen commented 3 years ago

觉得445行有问题,因为在进入paser_irq_cep 之前,已经通过592行清除了相关标志位,那么在445行还在轮询”BUFFER EMPTY” 这个标志位是否合理?

IN token interrupt 不代表data已經送出去, 而是host 來要IN 資料, 因此要寫buffer 必須要確定data 已經送出, 不然會被覆蓋

注释到592行,把清除标志位的操作放在paser_irq_cep 之后,见595行;编译烧录,板子开机后可被PC快速识别出来。 这是否是bug? 这么修改是否正确?

這樣是可以的, 就是處理完後再清除中斷標誌

另外,paser_irq_ceq 的paser 是typo 吗?parser 可能合理点。我检索了paser英文释义也没有确定这个单词的确切含义,或者可能是我不懂nuc980 usb 驱动的一些术语(terms)。

這是typo

另外請問測試的驅動都已經跟 Github 同步了嗎?