免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3155 | 回复: 2
打印 上一主题 下一主题

求助,编译skeletcon.c不能通过 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-25 07:29 |只看该作者 |倒序浏览
编译的时候总是提示undefined,请问是怎么回事?是没有找到头文件吗?可是已经将头文件include到c文件中了啊
skeletcon.c是2.6.14内核中的文件
  1. /*
  2. * USB Skeleton driver - 2.0
  3. *
  4. * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
  5. *
  6. *        This program is free software; you can redistribute it and/or
  7. *        modify it under the terms of the GNU General Public License as
  8. *        published by the Free Software Foundation, version 2.
  9. *
  10. * This driver is based on the 2.6.3 version of drivers/usb/usb-skeleton.c
  11. * but has been rewritten to be easy to read and use, as no locks are now
  12. * needed anymore.
  13. *
  14. */

  15. #include <linux/config.h>
  16. #include <linux/kernel.h>
  17. #include <linux/errno.h>
  18. #include <linux/init.h>
  19. #include <linux/slab.h>
  20. #include <linux/module.h>
  21. #include <linux/kref.h>
  22. #include <asm/uaccess.h>
  23. #include <linux/usb.h>


  24. /* Define these values to match your devices */
  25. #define USB_SKEL_VENDOR_ID        0xfff0
  26. #define USB_SKEL_PRODUCT_ID        0xfff0

  27. /* table of devices that work with this driver */
  28. static struct usb_device_id skel_table [] = {
  29.         { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
  30.         { }                                        /* Terminating entry */
  31. };
  32. MODULE_DEVICE_TABLE (usb, skel_table);


  33. /* Get a minor range for your devices from the usb maintainer */
  34. #define USB_SKEL_MINOR_BASE        192

  35. /* Structure to hold all of our device specific stuff */
  36. struct usb_skel {
  37.         struct usb_device *        udev;                        /* the usb device for this device */
  38.         struct usb_interface *        interface;                /* the interface for this device */
  39.         unsigned char *                bulk_in_buffer;                /* the buffer to receive data */
  40.         size_t                        bulk_in_size;                /* the size of the receive buffer */
  41.         __u8                        bulk_in_endpointAddr;        /* the address of the bulk in endpoint */
  42.         __u8                        bulk_out_endpointAddr;        /* the address of the bulk out endpoint */
  43.         struct kref                kref;
  44. };
  45. #define to_skel_dev(d) container_of(d, struct usb_skel, kref)

  46. static struct usb_driver skel_driver;

  47. static void skel_delete(struct kref *kref)
  48. {       
  49.         struct usb_skel *dev = to_skel_dev(kref);

  50.         usb_put_dev(dev->udev);
  51.         kfree (dev->bulk_in_buffer);
  52.         kfree (dev);
  53. }

  54. static int skel_open(struct inode *inode, struct file *file)
  55. {
  56.         struct usb_skel *dev;
  57.         struct usb_interface *interface;
  58.         int subminor;
  59.         int retval = 0;

  60.         subminor = iminor(inode);

  61.         interface = usb_find_interface(&skel_driver, subminor);
  62.         if (!interface) {
  63.                 err ("%s - error, can't find device for minor %d",
  64.                      __FUNCTION__, subminor);
  65.                 retval = -ENODEV;
  66.                 goto exit;
  67.         }

  68.         dev = usb_get_intfdata(interface);
  69.         if (!dev) {
  70.                 retval = -ENODEV;
  71.                 goto exit;
  72.         }

  73.         /* increment our usage count for the device */
  74.         kref_get(&dev->kref);

  75.         /* save our object in the file's private structure */
  76.         file->private_data = dev;

  77. exit:
  78.         return retval;
  79. }

  80. static int skel_release(struct inode *inode, struct file *file)
  81. {
  82.         struct usb_skel *dev;

  83.         dev = (struct usb_skel *)file->private_data;
  84.         if (dev == NULL)
  85.                 return -ENODEV;

  86.         /* decrement the count on our device */
  87.         kref_put(&dev->kref, skel_delete);
  88.         return 0;
  89. }

  90. static ssize_t skel_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
  91. {
  92.         struct usb_skel *dev;
  93.         int retval = 0;
  94.         int bytes_read;

  95.         dev = (struct usb_skel *)file->private_data;
  96.        
  97.         /* do a blocking bulk read to get data from the device */
  98.         retval = usb_bulk_msg(dev->udev,
  99.                               usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
  100.                               dev->bulk_in_buffer,
  101.                               min(dev->bulk_in_size, count),
  102.                               &bytes_read, 10000);

  103.         /* if the read was successful, copy the data to userspace */
  104.         if (!retval) {
  105.                 if (copy_to_user(buffer, dev->bulk_in_buffer, bytes_read))
  106.                         retval = -EFAULT;
  107.                 else
  108.                         retval = bytes_read;
  109.         }

  110.         return retval;
  111. }

  112. static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
  113. {
  114.         struct usb_skel *dev;

  115.         dev = (struct usb_skel *)urb->context;

  116.         /* sync/async unlink faults aren't errors */
  117.         if (urb->status &&
  118.             !(urb->status == -ENOENT ||
  119.               urb->status == -ECONNRESET ||
  120.               urb->status == -ESHUTDOWN)) {
  121.                 dbg("%s - nonzero write bulk status received: %d",
  122.                     __FUNCTION__, urb->status);
  123.         }

  124.         /* free up our allocated buffer */
  125.         usb_buffer_free(urb->dev, urb->transfer_buffer_length,
  126.                         urb->transfer_buffer, urb->transfer_dma);
  127. }

  128. static ssize_t skel_write(struct file *file, const char *user_buffer, size_t count, loff_t *ppos)
  129. {
  130.         struct usb_skel *dev;
  131.         int retval = 0;
  132.         struct urb *urb = NULL;
  133.         char *buf = NULL;

  134.         dev = (struct usb_skel *)file->private_data;

  135.         /* verify that we actually have some data to write */
  136.         if (count == 0)
  137.                 goto exit;

  138.         /* create a urb, and a buffer for it, and copy the data to the urb */
  139.         urb = usb_alloc_urb(0, GFP_KERNEL);
  140.         if (!urb) {
  141.                 retval = -ENOMEM;
  142.                 goto error;
  143.         }

  144.         buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
  145.         if (!buf) {
  146.                 retval = -ENOMEM;
  147.                 goto error;
  148.         }

  149.         if (copy_from_user(buf, user_buffer, count)) {
  150.                 retval = -EFAULT;
  151.                 goto error;
  152.         }

  153.         /* initialize the urb properly */
  154.         usb_fill_bulk_urb(urb, dev->udev,
  155.                           usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
  156.                           buf, count, skel_write_bulk_callback, dev);
  157.         urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

  158.         /* send the data out the bulk port */
  159.         retval = usb_submit_urb(urb, GFP_KERNEL);
  160.         if (retval) {
  161.                 err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
  162.                 goto error;
  163.         }

  164.         /* release our reference to this urb, the USB core will eventually free it entirely */
  165.         usb_free_urb(urb);

  166. exit:
  167.         return count;

  168. error:
  169.         usb_buffer_free(dev->udev, count, buf, urb->transfer_dma);
  170.         usb_free_urb(urb);
  171.         return retval;
  172. }

  173. static struct file_operations skel_fops = {
  174.         .owner =        THIS_MODULE,
  175.         .read =                skel_read,
  176.         .write =        skel_write,
  177.         .open =                skel_open,
  178.         .release =        skel_release,
  179. };

  180. /*
  181. * usb class driver info in order to get a minor number from the usb core,
  182. * and to have the device registered with devfs and the driver core
  183. */
  184. static struct usb_class_driver skel_class = {
  185.         .name =                "usb/skel%d",
  186.         .fops =                &skel_fops,
  187.         .mode =                S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH,
  188.         .minor_base =        USB_SKEL_MINOR_BASE,
  189. };

  190. static int skel_probe(struct usb_interface *interface, const struct usb_device_id *id)
  191. {
  192.         struct usb_skel *dev = NULL;
  193.         struct usb_host_interface *iface_desc;
  194.         struct usb_endpoint_descriptor *endpoint;
  195.         size_t buffer_size;
  196.         int i;
  197.         int retval = -ENOMEM;

  198.         printk("i am in skel probe\n");
  199.         /* allocate memory for our device state and initialize it */
  200.         dev = kmalloc(sizeof(*dev), GFP_KERNEL);
  201.         if (dev == NULL) {
  202.                 err("Out of memory");
  203.                 goto error;
  204.         }
  205.         memset(dev, 0x00, sizeof(*dev));
  206.         kref_init(&dev->kref);

  207.         dev->udev = usb_get_dev(interface_to_usbdev(interface));
  208.         dev->interface = interface;

  209.         /* set up the endpoint information */
  210.         /* use only the first bulk-in and bulk-out endpoints */
  211.         iface_desc = interface->cur_altsetting;
  212.         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
  213.                 endpoint = &iface_desc->endpoint[i].desc;

  214.                 if (!dev->bulk_in_endpointAddr &&
  215.                     ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
  216.                                         == USB_DIR_IN) &&
  217.                     ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
  218.                                         == USB_ENDPOINT_XFER_BULK)) {
  219.                         /* we found a bulk in endpoint */
  220.                         buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
  221.                         dev->bulk_in_size = buffer_size;
  222.                         dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
  223.                         dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
  224.                         if (!dev->bulk_in_buffer) {
  225.                                 err("Could not allocate bulk_in_buffer");
  226.                                 goto error;
  227.                         }
  228.                 }

  229.                 if (!dev->bulk_out_endpointAddr &&
  230.                     ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
  231.                                         == USB_DIR_OUT) &&
  232.                     ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
  233.                                         == USB_ENDPOINT_XFER_BULK)) {
  234.                         /* we found a bulk out endpoint */
  235.                         dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;
  236.                 }
  237.         }
  238.         if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {
  239.                 err("Could not find both bulk-in and bulk-out endpoints");
  240.                 goto error;
  241.         }

  242.         /* save our data pointer in this interface device */
  243.         usb_set_intfdata(interface, dev);

  244.         /* we can register the device now, as it is ready */
  245.         retval = usb_register_dev(interface, &skel_class);
  246.         if (retval) {
  247.                 /* something prevented us from registering this driver */
  248.                 err("Not able to get a minor for this device.");
  249.                 usb_set_intfdata(interface, NULL);
  250.                 goto error;
  251.         }

  252.         /* let the user know what node this device is now attached to */
  253.         info("USB Skeleton device now attached to USBSkel-%d", interface->minor);
  254.         return 0;

  255. error:
  256.         if (dev)
  257.                 kref_put(&dev->kref, skel_delete);
  258.         return retval;
  259. }

  260. static void skel_disconnect(struct usb_interface *interface)
  261. {
  262.         struct usb_skel *dev;
  263.         int minor = interface->minor;

  264.         /* prevent skel_open() from racing skel_disconnect() */
  265.         lock_kernel();

  266.         dev = usb_get_intfdata(interface);
  267.         usb_set_intfdata(interface, NULL);

  268.         /* give back our minor */
  269.         usb_deregister_dev(interface, &skel_class);

  270.         unlock_kernel();

  271.         /* decrement our usage count */
  272.         kref_put(&dev->kref, skel_delete);

  273.         info("USB Skeleton #%d now disconnected", minor);
  274. }

  275. static struct usb_driver skel_driver = {
  276.         .owner =        THIS_MODULE,
  277.         .name =                "my_zc3450",
  278.         .probe =        skel_probe,
  279.         .disconnect =        skel_disconnect,
  280.         .id_table =        skel_table,
  281. };

  282. static int __init usb_skel_init(void)
  283. {
  284.         int result;

  285.         /* register this driver with the USB subsystem */
  286.         result = usb_register(&skel_driver);
  287.         if (result)
  288.                 err("usb_register failed. Error number %d", result);

  289.         return result;
  290. }

  291. static void __exit usb_skel_exit(void)
  292. {
  293.         /* deregister this driver with the USB subsystem */
  294.         usb_deregister(&skel_driver);
  295. }

  296. module_init (usb_skel_init);
  297. module_exit (usb_skel_exit);

  298. MODULE_LICENSE("GPL");
复制代码
Makefile
  1. #
  2. # Makefile for USB Core files and filesystem
  3. #
  4. myzc-objs :=  myusb.o
  5. obj-m := myzc.o

  6. KDIR := /usr/local/arm/linux-2.6.14
  7. PWD :=$(shell pwd)

  8. default:
  9.         $(MAKE) -C $(KDIR) M=$(PWD) modules
  10. clean:
  11.         $(MAKE) -C $(KDIR) M=$(PWD) clean
复制代码
编译后的提示为:
  1. [zz@localhost myzc301]$ make
  2. make -C /usr/local/arm/linux-2.6.14 M=/usr/local/arm/usb/myzc301 modules
  3. make[1]: Entering directory `/usr/local/arm/linux-2.6.14'

  4.   WARNING: Symbol version dump /usr/local/arm/linux-2.6.14/Module.symvers
  5.            is missing; modules will have no dependencies and modversions.

  6.   CC [M]  /usr/local/arm/usb/myzc301/myusb_bak.o
  7.   LD [M]  /usr/local/arm/usb/myzc301/myzc.o
  8.   Building modules, stage 2.
  9.   MODPOST
  10. *** Warning: "usb_buffer_alloc" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  11. *** Warning: "usb_buffer_free" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  12. *** Warning: "usb_deregister_dev" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  13. *** Warning: "usb_deregister" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  14. *** Warning: "usb_register_dev" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  15. *** Warning: "usb_submit_urb" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  16. *** Warning: "usb_get_dev" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  17. *** Warning: "usb_bulk_msg" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  18. *** Warning: "usb_put_dev" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  19. *** Warning: "usb_find_interface" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  20. *** Warning: "usb_register" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  21. *** Warning: "usb_free_urb" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  22. *** Warning: "usb_alloc_urb" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
  23.   CC      /usr/local/arm/usb/myzc301/myzc.mod.o
  24.   LD [M]  /usr/local/arm/usb/myzc301/myzc.ko
  25. make[1]: Leaving directory `/usr/local/arm/linux-2.6.14'
复制代码
请问为什么总有类似

*** Warning: "usb_buffer_alloc" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
*** Warning: "usb_buffer_free" [/usr/local/arm/usb/myzc301/myzc.ko] undefined!
这样的提示呢?我该如何解决呢?谢谢了

论坛徽章:
0
2 [报告]
发表于 2011-08-25 17:48 |只看该作者
自己顶一下

论坛徽章:
0
3 [报告]
发表于 2011-08-26 11:58 |只看该作者
问题解决了。
主要原因是在编译模块之前需要先编译内核,将内核中有关usb的部分配置为“*”内建,而不是使用“M”模块标记。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP