当前位置:  技术问答>linux和unix

zc301驱动zc0301_core.c的zc0301_usb_init 函数调用后,没有调用驱动对应的zc0301_usb_ probe 函数是怎么回事

    来源: 互联网  发布时间:2017-05-12

    本文导语:  这个问题我弄很久了,希望大神能够帮帮忙。按网上的说法是自动创建节点video0,不需要自动创建,但是还是没有video0. 我后来发现zc0301_core.c中的probe函数都没有运行。 。。。。。。。。。。。。。。。。。。。。...

这个问题我弄很久了,希望大神能够帮帮忙。按网上的说法是自动创建节点video0,不需要自动创建,但是还是没有video0. 我后来发现zc0301_core.c中的probe函数都没有运行。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
其中一部分代码。。:

static int
zc0301_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
{
struct usb_device *udev = interface_to_usbdev(intf);
struct zc0301_device* cam;
static unsigned int dev_nr;
unsigned int i;
int err = 0;
printk("sssssssssssssssssssssssssssssssssssssssssssss");
if (!(cam = kzalloc(sizeof(struct zc0301_device), GFP_KERNEL)))
return -ENOMEM;

cam->usbdev = udev;

if (!(cam->control_buffer = kzalloc(4, GFP_KERNEL))) {
DBG(1, "kmalloc() failed");
err = -ENOMEM;
goto fail;
}

if (!(cam->v4ldev = video_device_alloc())) {
DBG(1, "video_device_alloc() failed");
err = -ENOMEM;
goto fail;
}
       
DBG(2, "ZC0301[P] Image Processor and Control Chip detected "
       "(vid/pid 0x%04X:0x%04X)",id->idVendor, id->idProduct);

for  (i = 0; zc0301_sensor_table[i]; i++) {
err = zc0301_sensor_table[i](cam);
if (!err)
break;
}

if (!err)
DBG(2, "%s image sensor detected", cam->sensor.name);
else {
DBG(1, "No supported image sensor detected");
err = -ENODEV;
goto fail;
}

if (zc0301_init(cam)) {
DBG(1, "Initialization failed. I will retry on open().");
cam->state |= DEV_MISCONFIGURED;
}

strcpy(cam->v4ldev->name, "ZC0301[P] PC Camera");
cam->v4ldev->fops = &zc0301_fops;
cam->v4ldev->minor = video_nr[dev_nr];
cam->v4ldev->release = video_device_release;
cam->v4ldev->parent = &udev->dev;
video_set_drvdata(cam->v4ldev, cam);

init_completion(&cam->probe);

err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
    video_nr[dev_nr]);
if (err) {
DBG(1, "V4L2 device registration failed");
if (err == -ENFILE && video_nr[dev_nr] == -1)
DBG(1, "Free /dev/videoX node not found");
video_nr[dev_nr] = -1;
dev_nr = (dev_nr probe);
goto fail;
}

DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->num);

cam->module_param.force_munmap = force_munmap[dev_nr];
cam->module_param.frame_timeout = frame_timeout[dev_nr];

dev_nr = (dev_nr kref);
usb_get_dev(cam->usbdev);

complete_all(&cam->probe);

return 0;

fail:
if (cam) {
kfree(cam->control_buffer);
if (cam->v4ldev)
video_device_release(cam->v4ldev);
kfree(cam);
}
return err;
}


static void zc0301_usb_disconnect(struct usb_interface* intf)
{
struct zc0301_device* cam;

down_write(&zc0301_dev_lock);

cam = usb_get_intfdata(intf);

DBG(2, "Disconnecting %s...", cam->v4ldev->name);

if (cam->users) {
DBG(2, "Device /dev/video%d is open! Deregistration and "
       "memory deallocation are deferred.",
    cam->v4ldev->num);
cam->state |= DEV_MISCONFIGURED;
zc0301_stop_transfer(cam);
cam->state |= DEV_DISCONNECTED;
wake_up_interruptible(&cam->wait_frame);
wake_up(&cam->wait_stream);
} else
cam->state |= DEV_DISCONNECTED;

wake_up_interruptible_all(&cam->wait_open);

kref_put(&cam->kref, zc0301_release_resources);

up_write(&zc0301_dev_lock);
}


static struct usb_driver zc0301_usb_driver = {
.name =       "zc0301",
.id_table =   zc0301_id_table,
.probe =      zc0301_usb_probe,
.disconnect = zc0301_usb_disconnect,
};

/*****************************************************************************/

static int __init zc0301_module_init(void)
{
int err = 0;
printk("initkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
KDBG(2, ZC0301_MODULE_NAME " v" ZC0301_MODULE_VERSION);
KDBG(3, ZC0301_MODULE_AUTHOR);

if ((err = usb_register(&zc0301_usb_driver)))
KDBG(1, "usb_register() failed");

return err;
}


static void __exit zc0301_module_exit(void)
{
usb_deregister(&zc0301_usb_driver);
}


module_init(zc0301_module_init);
module_exit(zc0301_module_exit);

|
 zc0301_id_table这个需要和device matched。 才会调probe, 你没有这个设备?

const struct usb_device_id *usb_match_id(
                     struct usb_interface        *interface,
                     const -struct usb_device_id *id)
{
    /* proc_connectinfo in devio.c may call us with id == NULL. */
    if (id == NULL)
        return NULL;

    /* It is important to check that id->driver_info is nonzero,
       since an entry that is all zeroes except for a nonzero
       id->driver_info is the way to create an entry that
       indicates that the driver want to examine every
       device and interface. */
    for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||
           id->driver_info; id++) {
        if (usb_match_one_id(interface, id))
            return id;
    }

    return NULL;
}

|
usb_register调用probe之前, 会调用usb总线match函数, 判断总线初始化扫描得到的device id是否与你给出的一致.  你可以看看/sys/bus/usb/devices/

|
lsusb -v 看看有那个设备么. 


|
“1d6b”= “Linux Foundation”,“0001” = “1.1 root hub”

usb驱动, 没有枚举出设备. 

|
这个不是zc301p驱动的问题, 是内核中usb总线扫描时根本就没有识别你这个设备. 

你断开/连接设备或其它的USB口, dmesg会有什么打印?

|
usb 1-1: device descriptor read/64, error -62

是这个原因么?
http://sunnyshineboy.blog.163.com/blog/static/2028151182012580123731/

|
我给你讲一下原理, 你的usb摄像头连接后, usb host controller驱动会读取设备的descriptor, 这个你可以看usb的specification, 会保存在usb_bus的device链表的device设备结构中.

这时加载驱动,  video_register_device会调用usb_bus的match函数比较驱动提供的ID和已经读出的设备ID, 如果匹配, 调用驱动probe函数.

usb 1-1: device descriptor read/64, error -62
这个根本就是没有读出设备ID.



|
LZ是驱动中星微的摄像头么?

数据编解码自己写的还是?

    
 
 

您可能感兴趣的文章:

  • linux:怎么在驱动中调用IIC驱动?
  • Linux环境下,如何一个驱动中调用另外一个驱动
  • linux下一个驱动怎么调用另一个驱动
  • Linux源代码中ata驱动为什么要调用pci驱动的代码
  • 请教一下在驱动里怎么调用应用程序
  • 怎么调用PC的linux驱动接口??
  • LINUX下如何调用网卡驱动程序?
  • 请教:linux的驱动程序如何调用动态连接库?
  • 请问驱动程序中系统调用使用情况
  • 驱动可以调用共享库文件so吗??
  • 【求助】:如何用ioctl()函数调用一个驱动程序
  • CAT命令读取设备文件,驱动read函数被反复调用,为什么?
  • 如何在程序中调用SHELL Library驱动中的命令
  • 底层硬件驱动如何调用应用层的回调函数,求指点!
  • 请教:修改Linux内核时,需要调用驱动程序的函数,头文件也包含了,但是编译时候说头文件找不到!
  • 调用驱动的一个初学者问题,大家指教,谢谢了。!!!!!!!!!!
  • 应用程序调用网卡驱动,收不到包,为什么
  • linux驱动程序中怎么做api函数供应用程序调用
  • 驱动接口调用问题,大家指教,初学。
  • linux网卡驱动层,如何直接调用hard_start_xmit发二层包
  • 救急!!linux驱动函数问题!!
  • 驱动开发有没有函数手册
  • 驱动函数中的return
  • usb驱动关于probe函数
  • linux驱动中probe函数中参数传递问题?
  • 驱动模块中用socket,哪有相关的函数啊??
  • 请教:Linux驱动程序中的llseek函数
  • Linux内核驱动中有没有像waitforsingleobject这样的函数
  • linux 下 usb 鼠标驱动 关于 open 函数里面 mouse->irq->dev = mouse->usbdev 疑问
  • linux驱动open函数问题,大家来看看(我没有分,所以给的少点)
  • C# 调用API函数弹出映射网络驱动器对话框问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 驱动接口调用问题,大家指教,初学。 iis7站长之家
  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • 好不容易下到sis900网卡for unix的驱动,但装上驱动后系统驱动时: SiS900 adapter initialization failure!
  • 我的网卡在redhat7.3下不能自动驱动,但我有for linux的驱动程序,请问如何才能驱动我的网卡,我是菜菜,请详细说明,谢谢!
  • Linux环境下,“PC机的驱动”与“嵌入式驱动”有什么区别?
  • linux驱动 单片机驱动
  • u boot中怎样写flash驱动以及串口驱动
  • 一个驱动文件,生成多个驱动模块??
  • -------------- 请问大家,做好一个PCI设备驱动了,如何做个应用程序来使用这个驱动呢??
  • pcie驱动和pci驱动
  • usb驱动中 hcd,pcd,device,gadget驱动有什么区别啊?
  • 移植pci驱动和RTL8139网卡驱动,只发生一次中断?
  • 想试着编写简单驱动玩,但是手头上没有什么好驱动的设备,大家支招
  • 请教有关linux驱动开发,按关机键关机时,驱动应作哪些结束工作?
  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • Linux 9.0+865G,只能上到640×480,Intel官方站点的最新驱动安装失败,那位有驱动?
  • insmod 加载驱动模块后,重启后驱动为什么没有了
  • 有两个USB键盘怎么用自己写的USB键盘驱动程序只替换其中一个驱动?
  • 哪位大哥大姐懂驱动驱动程序开发哇?
  • fedora13 安装ati官方驱动后 不能正常驱动ati显卡


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,