一. 简介
前面几篇文章学习了 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工具是否可用。