linux g_webcam.ko问题

      原来的想法是先把H264CAMERA简单测试版学好。之后再学习USB,看能不能通过USB来传输。现在有要求,只能现看USB部分了,那个回去再研究研究。

      想使用Linux内核自带的usb webcam gadget,没想到一场血案就这样发生了。

      linux g_webcam.ko问题_第1张图片

追查留下的踪迹:

F_uvc.c:

uvc_function_bind() 

Epautoconf.c: 

-> usb_ep_autoconfig() 

-> usb_ep_autoconfig_ss() 

-> ep_matches()

找到具体的事物:

linux g_webcam.ko问题_第2张图片
  linux g_webcam.ko问题_第3张图片


经盘查:

Cdev->gadget->name = “s3c-udc”

linux g_webcam.ko问题_第4张图片


继续盘查来源:

ep->name : ep1-bulk ep2-bulk ep3-int

S3c_udc_otg.c:

static struct s3c_udc memory = {

...

.gadget

.ep[0]

...

.ep[14]

};

 

来源知道了,有了一个源ep3-int,看另一个源:

linux g_webcam.ko问题_第5张图片

linux g_webcam.ko问题_第6张图片


咦,来源中没有“USB_ENDPOINT_XFER_ISOC”的源,中间商不接收:

linux g_webcam.ko问题_第7张图片

linux g_webcam.ko问题_第8张图片


竟然是偷运来的,看如何偷运:披了一层皮

linux g_webcam.ko问题_第9张图片

披的假皮还不止一层,太深了。那就换个方向,货很多,必须一次一次搬运,追查下来源的货:

#define S3C_MAX_ENDPOINTS 16

linux g_webcam.ko问题_第10张图片

算是将货源追查清楚了。继续来看看偷运途径:

linux g_webcam.ko问题_第11张图片

另外一头,在来的货源中搜索,没有找到自己想要的货,就大开杀戒了:

.ep[15].ep.name = NULL; 引发段错误,引发Oops

 

应该可以就此结案了:

修改:ep->name为NULL时 return 0;

 

那么就 goto error;

linux g_webcam.ko问题_第12张图片

不曾想,后面竟发生了惊天血案啊:

linux g_webcam.ko问题_第13张图片

后序:

在s3c_udc_otg.c中struct s3c_udc memory里没有属性为USB_ENDPOINT_XFER_ISOC的端点。那USB_ENDPOINT_XFER_ISOC所表示的端点有何作用?

 

  从开发人员的角度看,每一个usb设备有若干个配置(configuration)组成,每个配置又可以有多个接口(interface),每个接口又有多个设置(setting图中没有给出),而接口本身可能没有端点或者多个端点(end point)。USB的数据交换通过端点来进行,主机与各个端点之间建立起单向的管道来传输数据。而这些接口可以分为四类:

控制(control

       用于配置设备、获取设备信息、发送命令或者获取设备的状态报告

中断(interrupt

       USB宿主要求设备传输数据时,中断端点会以一个固定的速率传送少量数据,还用于发送数据到USB设备以控制设备,一般不用于传送大量数据。

批量(bulk

       用于大量数据的可靠传输,如果总线上的空间不足以发送整个批量包,它会被分割成多个包传输。

等时(isochronous

       大量数据的不可靠传输,不保证数据的到达,但保证恒定的数据流,多用于数据采集。

 

       Linux中用struct usb_host_endpoint来描述USB端点,每个usb_host_endpoint中包含一个struct usb_endpoint_descriptor结构体,当中包含该端点的信息以及设备自定义的各种信息,这些信息包括:

bEndpointAddressb for byte

       8位端点地址,其地址还隐藏了端点方向的信息(之前说过,端点是单向的),可以用掩码USB_DIR_OUTUSB_DIR_IN来确定。

bmAttributes

       端点的类型,结合USB_ENDPOINT_XFERTYPE_MASK可以确定端点是USB_ENDPOINT_XFER_ISOC(等时)、USB_ENDPOINT_XFER_BULK(批量)还是USB_ENDPOINT_XFER_INT(中断)。

 

后面还要继续追查......


你可能感兴趣的:(linux g_webcam.ko问题)