我有一个 Freescale iMX6 SMARC 模块和载板。它来自制造商,带有 Ubuntu Linaro 12.04 LTS(内核 3.0.35)。我需要很多串行端口,所以我买了 Syba 8 端口 PCIe 卡和 Exar XR17V358 芯片组来配合使用。当我尝试从 Exar 网站安装驱动程序时,出现错误:
make -C /lib/modules/'uname -r'/build SUBDIRS=/home/linaro/Desktop/exar modules
make: *** /lib/modules/3.0.35/build: No such file of directory. Stop
make: *** [build] Error 2
我假设内核头文件没有安装,这就是它无法工作的原因。不幸的是,似乎默认的 apt 存储库中没有 Linux 头文件。
sudo apt-get install linux-headers-3.0.35
回到:
E: Unable to locate package linux-headers-3.0.35
E: Couldn't find any package by regex 'linux-headers-3.0.35'
经过一番搜索,我发现这是一个常见问题。我找到了一个包含头文件和说明的 tarball 链接,用于运行 linaro 的另一个 iMX6 板。
wget http://commondatastorage.googleapis.com/boundarydevices.com/linux-headers-3.0.35-02829-gac24896_4.1.0.tar.gz
tar zxvf linux-headers-3.0.35-02829-gac24896_4.1.0.tar.gz -C /usr
下载成功,但是当我尝试再次构建 exar 驱动程序时,输出与上面相同。
Linux-headers 未正确安装。
dpkg -l | grep linux-headers
没有返回任何结果。
尝试安装 linux-headers-generic,但无济于事。
Package linux-headers-generic is not available, but is referred to by
another package. This may mean that the package is missing, has been
obsoleted, or is only available from another source.
还有人在 Linaro 上安装 Exar PCIe 驱动程序吗?
有什么建议吗?
答案1
您需要安装 Linux 标头。Ubuntu 12.04 从未有过 3.0 内核。
在终端中运行
sudo apt-get install linux-generic
这将安装内核映像和头文件 3.2。
如果你不能这样做,那么你需要安装Ubuntu您拥有的内核的标头。
答案2
我能够让它工作。以下是我操作的方法:
首先,我从制造商处获取了内核源代码,并将其下载到 Ubuntu 12.04 VM 的桌面上名为 kernel 的文件夹中
其次,我从 exar 下载了驱动程序源(https://www.exar.com/common/content/document.ashx?id=20121) 并将其放在虚拟机中桌面上我称之为 exar 的文件夹中。
接下来,我在 VM 中使用 gcc-arm-linux-gnueabihf 进行交叉编译
sudo apt-get install gcc-arm-linux-gnueabihf
制作交叉编译的配置文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx6_rev_sa01_defconfig
构建内核(可选步骤,可以从 iMX6 映像复制内核)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage
交叉编译驱动程序
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C /home/ubuntu/Desktop/kernel/ M=/home/ubuntu/Desktop/exar/ modules
然后我将 exar 目录复制到目标上并完成安装
tar -xzvf exar.tgz
cd exar
cp xr17v35x.ko /lib/modules/3.0.35/kernel/drivers/misc/.
cd /lib/modules/3.0.35/kernel/drivers/misc/.
insmod xr17v35x.ko
最后,我验证了驱动程序已经注册并且端口已经列出。
lsmod
ls -l /dev/ttyXR*
端口 /dev/ttyXR0 到 XR7 可用且可以运行。
重启后,驱动程序似乎不再存在。作为补丁,我在 /etc/rc3.d/S50SerialPortSetup 中添加了一个串行设置脚本
#! /bin/sh
cd /lib/modules/3.0.35/kernel/drivers/misc/.
insmod xr17v35x.ko
我还执行了一些 stty 命令来初始化我的特定应用程序的端口。