Ubuntu make 失败,没有这样的文件或目录 /lib/modules/3.4.0/build

Ubuntu make 失败,没有这样的文件或目录 /lib/modules/3.4.0/build

我正在尝试在 ChrUbuntu 上为 3.xx 内核构建 CP210x 驱动程序。

构建说明:Ubuntu:

  1. make(您的 cp210x 驱动程序)
  2. cp cp210x.ko /lib/modules/<kernel-version>/kernel/drivers/usb/serial
  3. insmod /lib/modules/<kernel-version/kernel/drivers/usb/serial/usbserial.ko
  4. insmod cp210x.ko

我从那时开始apt-get install build-essential

root@ChrUbuntu:~/Documents/# make
make -C /lib/modules/3.4.0/build M=/home/me/Documents/Linux_3.x.x_VCP_Driver_Source modules
make: *** /lib/modules/3.4.0/build: No such file or directory.  Stop.
make: *** [all] Error 2

但我对这个错误感到困惑,因为该位置显然存在:

root@ChrUbuntu:/lib/modules/3.4.0# ls -la
total 820
lrwxrwxrwx  1 root root    105 Feb  8 17:01 build -> /build/x86-mario/tmp/portage/sys-kernel/chromeos-kernel-3.4-r996/work/chromeos-kernel-3.4/build/x86-mario

我该如何解决这个问题?

答案1

弄清楚编译这个内核模块的步骤。这版本在网站上,silabs.com显然太旧了,无法与较新的内核(3.4+)一起使用。

我能够使用VCP 驱动程序源中提供的cp210x.c内容编译我在 kernel.org 上为我的特定版本内核找到的文件的更新版本。Makefile

为您的内核版本构建 cp210x

为你的内核设定基线

首先记下您的内核的主要和次要编号(即 3.4、3.5 等)。

$ uname -r
3.5.0-19-generic

顺便说一句,我使用的是 Ubuntu 12.10:

$ lsb_release -r
Release:    12.10

安装适合您的内核版本的内核头文件和构建工具:

sudo apt-get install linux-headers-$(uname -r) build-essential

从 silabs.com 获取 VCP 捆绑包

现在为自己准备一个小工作区来完成这一切:

mkdir -p $HOME/cp210x && cd $HOME/cp210x

下载VCP驱动源:

wget  http://www.silabs.com/Support%20Documents/Software/Linux_3.x.x_VCP_Driver_Source.zip
unzip Linux_3.x.x_VCP_Driver_Source.zip
cd Linux_3.x.x_VCP_Driver_Source
mv cp210x.c cp210x.c_orig

获取 kernel.org cp210x.c

现在下载适合您的内核的 cp210x.c 版本:

$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/drivers/usb/serial/cp210x.c?h=linux-3.5.y -O cp210x.c

笔记:你可以在这里浏览不同版本的内核

编译

现在我们使用以下命令进行编译make

$ make
make -C /lib/modules/3.5.0-19-generic/build M=/home/manny/cp210x/Linux_3.x.x_VCP_Driver_Source modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic'
  CC [M]  /home/manny/cp210x/Linux_3.x.x_VCP_Driver_Source/cp210x.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/manny/cp210x/Linux_3.x.x_VCP_Driver_Source/cp210x.mod.o
  LD [M]  /home/manny/cp210x/Linux_3.x.x_VCP_Driver_Source/cp210x.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'

部署

现在将任何预先存在的cp210x.ko内核移开:

sudo mv /lib/modules/`uname -r`/kernel/drivers/usb/serial/cp210x.ko /lib/modules/`uname -r`/kernel/drivers/usb/serial/cp210x.ko.orig

现在将新构建的内核模块复制cp210x.ko到它的位置:

sudo cp cp210x.ko /lib/modules/`uname -r`/kernel/drivers/usb/serial/cp210x.ko

加载

现在确保之前的cp210x.ko内核模块没有加载:

$ lsmod | grep cp210x
$

如果是,则卸载它:

sudo rmmod cp210x

现在让我们加载新cp210x.ko模块:

sudo modprobe cp210x

测试

确认其加载正确:

$ lsmod |grep cp210x
cp210x                 21822  0 
usbserial              42355  1 cp210x

还要检查dmesg是否有任何问题:

$ dmesg | tail
...
...
[979772.614394] usbcore: registered new interface driver usbserial
[979772.614410] usbcore: registered new interface driver usbserial_generic
[979772.614456] USB Serial support registered for generic
[979772.614461] usbserial: USB Serial Driver core
[979772.614810] usbcore: registered new interface driver cp210x
[979772.614822] USB Serial support registered for cp210x

编译usbserial内核模块

OPusbserial.ko 还询问了如何完成编译模块,因为应用程序需要它才能使用 cp210x 内核模块。以下是这些说明。

首先记下您正在使用的内核版本:

uname -r
3.5.0-19-generic

所以我们使用3.5.0,接下来安装内核源:

sudo apt-get install linux-source-3.5.0

现在让我们自己创建一个工作区:

mkdir -p $HOME/src && cd $HOME/src

将内核源代码解压到我们的工作区:

tar jxvf /usr/src/linux-source-3.5.0.tar.bz2

现在让我们编译usbserial.ko

$ cd linux-source-3.5.0/drivers/usb/serial
$ make -C /usr/src/linux-headers-`uname -r`  M=`pwd` modules
make: Entering directory `/usr/src/linux-headers-3.5.0-19-generic'
  CC [M]  /root/src/linux-source-3.5.0/drivers/usb/serial/usb-serial.o
  ...
  ...
  LD [M]  /root/src/linux-source-3.5.0/drivers/usb/serial/usbserial.o
  ...
  ...
  CC      /root/src/linux-source-3.5.0/drivers/usb/serial/usbserial.mod.o
  LD [M]  /root/src/linux-source-3.5.0/drivers/usb/serial/usbserial.ko
  ...
  ...
make: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'

检查是否usbserial.ko已构建:

ls -l |grep usbserial
-rw-r--r-- 1 root root  74822 May 15 09:20 usbserial.ko
-rw-r--r-- 1 root root   4120 May 15 09:20 usbserial.mod.c
-rw-r--r-- 1 root root   8840 May 15 09:20 usbserial.mod.o
-rw-r--r-- 1 root root  74724 May 15 09:20 usbserial.o

现在让我们安装、加载并测试它:

# move old driver out of the way
$ mv /lib/modules/`uname -r`/kernel/drivers/usb/serial/usbserial.ko /lib/modules/`uname -r`/kernel/drivers/usb/serial/usbserial.ko.orig

# copy newly built one in
$ cp usbserial.ko /lib/modules/`uname -r`/kernel/drivers/usb/serial/.

# confirm `usbserial.ko` isn't loaded
$ lsmod | grep usbserial
$

# load it
$ modprobe usbserial

# confirm
$ lsmod |grep usbserial
usbserial              42355  0 

# check dmesg log
$ dmesg | tail -4
[1195955.210920] usbcore: registered new interface driver usbserial
[1195955.210970] usbcore: registered new interface driver usbserial_generic
[1195955.211002] USB Serial support registered for generic
[1195955.211069] usbserial: USB Serial Driver core

参考

答案2

作为评论,这个优秀且非常详细的食谱几乎可以在我的 ARM chromebook 上运行。但我不得不改变这一行:

$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/drivers/usb/serial/cp210x.c?h=linux-3.5.y -O cp210x.c

对此:

$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/drivers/usb/serial/cp210x.c?h=linux-3.4.y -O cp210x.c

也就是说,我必须将“linux-3.5.y”更改为“linux-3.4.y”; 3.5.y 不起作用。

答案3

我在 ubuntu 12.04 中遇到了同样的问题,现在使用这个有大量文档记录的驱动程序。此外还有配置脚本、udev 规则等。

https://github.com/RishiGupta12/serial-communication-manager/tree/master/drivers/cp210x-silicon-labs

相关内容