我一直在关注名为“LFD103”的课程《Linux 内核开发初学者指南》。在本节中“编写你的第一个内核补丁”,我们对“uvcvideo”驱动程序进行更改并重新编译它。但我就是无法让它发挥作用。我按照教程提到的那样添加了 pr_info() 函数。
static int uvc_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
struct uvc_device *dev;
const struct uvc_device_info *info =
(const struct uvc_device_info *)id->driver_info;
int function;
int ret;
pr_info("I changed uvcvideo driver in the Linux Kernel\n");
if (id->idVendor && id->idProduct)
uvc_trace(UVC_TRACE_PROBE, "Probing known UVC device %s "
"(%04x:%04x)\n", udev->devpath, id->idVendor,
id->idProduct);
else
uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
udev->devpath);
之后我们进行配置CONFIG_USB_VIDEO_CLASS=y
。
make -j3 all
返回这个:
内核版本:6.2.7
我究竟做错了什么?我试图通过互联网研究和咨询其他来源来解决这个问题,但不幸的是,我的努力没有成功。我也尝试过使用uvc_probe
andUVC_DBG_PROBE
但它导致了更多错误。如果有人能帮助我,那就太好了。
答案1
如果您正在使用当前的主线内核,那么 LFD103 课程有点过时,或者更确切地说,没有那么清晰。你必须仅有的添加该pr_info
行,忽略该行周围的行;因此,对于今天的内核,结果最终是
static int uvc_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
struct uvc_device *dev;
const struct uvc_device_info *info =
(const struct uvc_device_info *)id->driver_info;
int function;
int ret;
pr_info("I changed uvcvideo driver in the Linux Kernel\n");
/* Allocate memory for the device and initialize it. */
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (dev == NULL)
return -ENOMEM;
这些uvc_trace
行已被修改并且位于函数的更下方;他们现在使用uvc_dbg
:
if (id->idVendor && id->idProduct)
uvc_dbg(dev, PROBE, "Probing known UVC device %s (%04x:%04x)\n",
udev->devpath, id->idVendor, id->idProduct);
else
uvc_dbg(dev, PROBE, "Probing generic UVC device %s\n",
udev->devpath);