c - USB驱动编译错误

标签 c linux compilation usb drivers

我目前正在尝试编译 Linux USB UART 驱动程序,该驱动程序在此处提供: http://www.exar.com/connectivity/uart-and-bridging-solutions/usb-uarts/xr21v1410

该驱动程序由 2 个头文件和 1 个大型 C 文件组成。这些是 Makefile 的内容:

obj-m := vizzini.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

EXTRA_CFLAGS    := -DDEBUG=0

all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD)

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions vtty

这是我运行 make 时编译器抛出的错误:

[sj755@localhost xr21v141x-lnx-2.6.35-pak]$ make
make -C /lib/modules/3.4.9-2.fc16.x86_64/build M=/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak
make[1]: Entering directory `/usr/src/kernels/3.4.9-2.fc16.x86_64'
  LD      /home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/built-in.o
  CC [M]  /home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.o
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1643:9: warning: initialization from incompatible pointer type [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1643:9: warning: (near initialization for ‘vizzini_device.ioctl’) [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1646:9: warning: initialization from incompatible pointer type [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1646:9: warning: (near initialization for ‘vizzini_device.tiocmget’) [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1647:9: warning: initialization from incompatible pointer type [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1647:9: warning: (near initialization for ‘vizzini_device.tiocmset’) [enabled by default]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c: In function ‘vizzini_init’:
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1663:9: error: implicit declaration of function ‘usb_serial_register’ [-Werror=implicit-function-declaration]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1677:9: error: implicit declaration of function ‘usb_serial_deregister’ [-Werror=implicit-function-declaration]
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c: In function ‘__check_debug’:
/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.c:1698:83: warning: return from incompatible pointer type [enabled by default]
cc1: some warnings being treated as errors
make[2]: *** [/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak/vizzini.o] Error 1
make[1]: *** [_module_/home/sj755/Downloads/xr21v141x-lnx-2.6.35-pak] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.4.9-2.fc16.x86_64'
make: *** [all] Error 2

这些是主 c 源文件中包含的 header :

#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/errno.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
#include <linux/serial.h>
#include <linux/slab.h>
#include <asm/unaligned.h>
#include <asm/uaccess.h>

#include <linux/usb/cdc.h>
#ifndef CDC_DATA_INTERFACE_TYPE
#define CDC_DATA_INTERFACE_TYPE 0x0a
#endif
#ifndef USB_RT_ACM
#define USB_RT_ACM      (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
#define ACM_CTRL_DTR            0x01
#define ACM_CTRL_RTS            0x02
#define ACM_CTRL_DCD            0x01
#define ACM_CTRL_DSR            0x02
#define ACM_CTRL_BRK            0x04
#define ACM_CTRL_RI             0x08
#define ACM_CTRL_FRAMING        0x10
#define ACM_CTRL_PARITY         0x20
#define ACM_CTRL_OVERRUN        0x40
#endif

#include "linux/version.h"

#include "vizzini.h"

运行Linux内核3.4.9-2.fc16.x86_64

如果您能帮助解决这些错误,我将不胜感激。

编辑

似乎 usb_serial_registerusb_serial_deregister 从未在我的内核 API 中定义。但是,usb_serial_register_driversusb_serial_deregister_drivers 是。以下是定义:

int usb_serial_register(struct usb_serial_driver *driver);
void usb_serial_deregister(struct usb_serial_driver *device);
int usb_serial_register_drivers(struct usb_driver *udriver,
                                struct usb_serial_driver * const serial_drivers[]);
void usb_serial_deregister_drivers(struct usb_driver *udriver,
                                   struct usb_serial_driver * const serial_drivers[]);

最佳答案

内核中的 API(可用的头文件、其内容、函数原型(prototype)(或者如果它们首先存在)...)固定(请参阅您的文档中的 Documentation/stable_api_nonsense.txt如果您好奇的话,可以选择最近的 Linux 源代码),因此驱动程序通常只能针对相当狭窄的内核范围进行编译。检查源代码是否(大致)与内核同时存在。

您还应该检查内核中是否已包含该驱动程序,无论是作为官方驱动程序还是在暂存区域中。环顾四周Linux USB检查替代驱动程序和其他新闻。如果没有其他帮助,您应该看看 LWN的内核页面(在那里搜索您在当前源代码中找不到的函数以及有关替换的讨论),可能是在使用 cscope 之类的东西创建源代码(内核和驱动程序)的索引之后。请务必与负责该领域的人员联系,以便他们知道您正在摸索,也许可以提供一些指导。

关于c - USB驱动编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408930/

相关文章:

c - ext3代码理解

c - 从 C 中的函数返回合并的数组

linux - 通过 bash 脚本列出机器上的所有组

C++ 守护程序日志功能不写入文件(段错误?)

node.js - 带有 node-sass 和 autoprefixer 的 npm

java - Java 可以不用 JVM 编译源代码吗?

c - windows下c下socket编程测试从本地主机接收

c - 表达式必须是可修改的值 (C)

linux - 带有括号的 Bash for 循环在 linux 中工作,而不是在 Git Bash 中工作

linux - 如何创建没有外部依赖的wxWidgets应用程序?