一. 简介
前面几篇文章学习了 CAN设备节点的创建,以及如何使能 CAN驱动。
本文学习向开发板上移植ip工具。
二. 向开发板上移植ip工具:交叉编译 ip工具
注意:在移植 ip 命令的时候必须先对根文件系统做个备份!防止操作失误导致系统启动失败!切
记!!!
备份文件系统 rootfs(rootfs在 /home/wangtian/linux/nfs_File目录下):
sudo tar -cvf rootfs_2024_0324.tar.gz rootfs/
在 /home/wangtian/linux/nfs_File目录下就会生成 rootfs_2024_0324.tar.gz
1. 移植ip工具的原因
开发板加载的文件系统(即之前我使用 busybox工具制作的rootfs)中, 其实有 ip命令(即 ip工具),只是 ip命令不能操作 CAN接口。
开发板上电后,进入文件系统目录下:
运行设置 can0 的波特率的命令 "ip link set can0 type can bitrate 500000" :
可以确定,开发板上的 ip命令不能操作can0。
所以说,busybox 自带的 ip 命令并不支持对 can 的操作,因此,我们需要重新移植 ip 命令。
2. 移植ip工具
我们需要重新移植 ip 命令,也就是 iproute2。
iproute2 源码下载地址为: https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/ 。
这 里我们下载 4.4.0 版本的,笔者试过最新的版本,但是编译一直有问题。 4.4.0 版本的 iproute2 正点原子已经提供 ,路径为: 1 、例程源码 ->7 、第三方库源码 -> iproute2-4.4.0.tar.gz 。
(1) 拷贝ip工具源码包
将 iproute2-4.4.0.tar.gz 发送到 ubuntu 中并解压,命令如下:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/tools$ cp /mnt/hgfs/Ubuntu_Shares/iproute2-4.4.0.tar.gz ./
解压缩 iproute2-4.4.0.tar.gz :
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/tools$ tar -xvf iproute2-4.4.0.tar.gz
(2) 其次,更改Makefile中编译器
解压完成以后会得到一个名为“iproute2-4.4.0”的目录,进入此目录中,打开 Makefile 并修改。在 Makefile 中找到下面这行:
CC = gcc
改为 arm-linux-gnueabihf-gcc,也就是开发板上的编译器:
CC = arm-linux-gnueabihf-gcc
(3) 编译 ip源码
Makefile 修改完成以后,直接使用 “make” 命令编译,这里编译时出错了,提示错误信息如下:
.......................
In file included from ip.c:25:0:
../include/namespace.h:36:1: 错误: 对‘setns’的静态声明出现在非静态声明之后{^
In file included from /opt/arm_tools/gcc_linaro/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/sched.h:41:0,from ../include/namespace.h:4,from ip.c:25:
/opt/arm_tools/gcc_linaro/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/bits/sched.h:91:12: 附注: ‘setns’的上一个声明在此extern int setns (int __fd, int __nstype) __THROW;^
make[1]: *** [<内置>:ip.o] 错误 1
make[1]: 离开目录“/home/wangtian/zhengdian_Linux/tools/iproute2-4.4.0/ip”
make: *** [Makefile:50:all] 错误 2
打开 namespace.h文件, 屏蔽了如下代码:
#ifndef HAVE_SETNS
static inline int setns(int fd, int nstype)
{
#ifdef __NR_setnsreturn syscall(__NR_setns, fd, nstype);
#elseerrno = ENOSYS;return -1;
#endif
}
#endif /* HAVE_SETNS */
再次运行 "make"命令进行编译,又提示 :无法找到 bison工具。于是,使用命令安装bison:
sudo apt-get install bison
重新 执行"make" 命令,提示无法找到 flex命令:
flex -oemp_ematch.lex.c emp_ematch.l
make[1]:flex:命令未找到
make[1]: *** [Makefile:169:emp_ematch.lex.c] 错误 127
make[1]: 离开目录“/home/wangtian/zhengdian_Linux/tools/iproute2-4.4.0/tc”
make: *** [Makefile:50:all] 错误 2
解决办法:安装 flex命令:
sudo apt-get install flex
这时候可以编译成功,成功后 就会在 iproute2 源码的 ip 目录下得到一个名为 “ ip ” 的命令,如下所示:
以下操作请严格按照教程步骤来!否则可能会导致系统无法启动!
接下来就是移植 ip工具,将 ip工具拷贝到开发板文件系统相关目录下,测试 ip工具是否可用。