原来的想法是先把H264CAMERA简单测试版学好。之后再学习USB,看能不能通过USB来传输。现在有要求,只能现看USB部分了,那个回去再研究研究。
想使用Linux内核自带的usb webcam gadget,没想到一场血案就这样发生了。
追查留下的踪迹:
F_uvc.c:
uvc_function_bind()
Epautoconf.c:
-> usb_ep_autoconfig()
-> usb_ep_autoconfig_ss()
-> ep_matches()
找到具体的事物:
经盘查:
Cdev->gadget->name = “s3c-udc”
继续盘查来源:
ep->name : ep1-bulk ep2-bulk ep3-int
S3c_udc_otg.c:
static struct s3c_udc memory = {
...
.gadget
.ep[0]
...
.ep[14]
};
来源知道了,有了一个源ep3-int,看另一个源:
咦,来源中没有“USB_ENDPOINT_XFER_ISOC”的源,中间商不接收:
竟然是偷运来的,看如何偷运:披了一层皮
披的假皮还不止一层,太深了。那就换个方向,货很多,必须一次一次搬运,追查下来源的货:
#define S3C_MAX_ENDPOINTS 16
算是将货源追查清楚了。继续来看看偷运途径:
另外一头,在来的货源中搜索,没有找到自己想要的货,就大开杀戒了:
.ep[15].ep.name = NULL; 引发段错误,引发Oops
应该可以就此结案了:
修改:ep->name为NULL时 return 0;
那么就 goto error;
不曾想,后面竟发生了惊天血案啊:
后序:
在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结构体,当中包含该端点的信息以及设备自定义的各种信息,这些信息包括:
bEndpointAddress(b for byte)
8位端点地址,其地址还隐藏了端点方向的信息(之前说过,端点是单向的),可以用掩码USB_DIR_OUT和USB_DIR_IN来确定。
bmAttributes
端点的类型,结合USB_ENDPOINT_XFERTYPE_MASK可以确定端点是USB_ENDPOINT_XFER_ISOC(等时)、USB_ENDPOINT_XFER_BULK(批量)还是USB_ENDPOINT_XFER_INT(中断)。
后面还要继续追查......