Re: [PATCH v2 3/7] usb: gadget: f_uvc: change endpoint allocation in uvc_function_bind()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Dec 21, 2023 at 10:14:16PM +0800, yuan linyu wrote:
> 
> On 2023/12/21 00:02, Frank Li wrote:
> >>> Some UDC driver use gadget_check_config() and match_ep() to allocate EP
> >>> internal fifo memory resource, if only pass download full speed EP.
> >> Could you share  the detail of problem ? do you mean find another different endpoint compared
> > The problem is little bit complex. I try to use simple words.
> >
> > The background:
> >
> > Generally, UDC have some EP<0..15> and have some internal memory as FIFO.
> > for example 16K.  You can simple assign EP<n> to 1K memory, which can hold
> > whole package.
> >
> > But for UVC, some controller required internal FIFO hold whole frame data
> >
> > (mult+1) * (MaxBurst +1) * wPackageSize.
> >
> > For most case,  not every gadget use all 16 EPs. So you can assgin more
> > memory into one EP, so it will reduce bus 'ping' package number and reduce
> > NACK to improve transfer speed.
> >
> > The problem:
> > pass fs_stream to udc driver, udc driver's check_config function will see
> > mult and maxburst is 0. so only reserve 1K for ISO EP, but when try to 
> > enable EP,  mult is 2, so there are not enough internal memory for it
> > because more memory already assign to other EPs.
> >
> > Ideally, when gadget frame work can call check_config again when know
> > usb speed, but it is not easy to fix it.
> >
> > Simple method use ss_stream_ep here and other function drviers. Super
> > speed's package size is bigger than high/full speed. If resource can
> > support super speed, it can support high/full speed.
> 
> 
> I don't find any difference of uvc_ss_streaming_ep, uvc_hs_streaming_ep, uvc_fs_streaming_ep
> 
> descriptors. how difference happen in UDC ?

	uvc_hs_streaming_ep.wMaxPacketSize =                                                        
                cpu_to_le16(max_packet_size | ((max_packet_mult - 1) << 11));

Hight speed will use bit [12:11] as mult

	uvc_ss_streaming_comp.bmAttributes = max_packet_mult - 1;                                   
        uvc_ss_streaming_comp.bMaxBurst = opts->streaming_maxburst;

ss will pass down uvc_ss_streaming_comp descriptor, which have bMaxBurst
and mult information.


Frank

> 
> 
> >
> >
> > /**
> >  * gadget_is_superspeed() - return true if the hardware handles superspeed
> >  * @g: controller that might support superspeed
> >  */
> >
> > @max_speed: Highest speed the driver handles
> >
> > And according to gadget_is_superspeed() define, it indicate if udc
> > controller support supersped, not link speed. 
> >
> > Orignial code is correct. If UDC support superspeed, then use ss_stream_ep.
> >
> > becasue superspeed is worse case compared as high and full speed.
> >
> > So I think original is correct.
> >
> > Frank.
> >
> >
> 




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux