参考文档:
引言:
EtherCAT两大主流开源代码为SOEM(即支持Linux,又支持windows )和IgH EtherCAT Master只支持Linux )。本文以IgH具体移植步骤为引子,简述EtherCAT在嵌入式系统中的移植过程。 [Linux 内核版本:Linux-4.19.94] 该内核已交叉编译过
Note:
IgH移植过程中,兼容Linux-2.x 和Linux-3.X的内核版本,无法兼容高版本内核,故将Igh移植到高版本内核进行编译时,需根据编译错误进行适当修改。
源码编译过程
# EtherCAT 源码存放目录为:/home/zsj/ethercat-1.5.2
# Linux-4.19.94 源码存放目录为:/home/zsj/ linux-4.19.94
$ tar xvf ethercat-1.5.2.tar.bz2 # 生成文件/home/zsj/ethercat-1.5.2
$ cd ethercat-1.5.2
# --prefix是指定你下面make install时的安装目录,--with-linux-dir是指定你的linux内核目录
$ ./configure --prefix=/home/zsj/ethercat-1.5.2/output --with-linux-dir=/home/zsj/linux-4.19.94 --enable-8139too=no --enable-generic=yes CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf
$ make # 编译源码
# 指定交叉编译工具,编译modules
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules # 编译通过会对应生成ethercat-1.5.2/devices/ec_generic.ko和ethercat-1.5.2/master/ec_master.ko
$ sudo make install # 在该目录下生成output目录
根据源码编译错误存进行
-
dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup) => 改为
dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, NET_NAME_UNKNOWN, ether_setup) -
ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket) => 改为
ret = sock_create_kern(&init_net,PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket) -
malloc 函数和 calloc 函数分配内存后需强制类型转换,如:
char *buf;
buf = malloc(sizeof(char *)); => 改为 buf = (char *)malloc(sizeof(char *)); -
缺少结构体数据和库函数声明:跳转到对应文件,进行声明或者直接在缺失的文件下重定义即可
-
“sudo make install” 提示无法找到交叉工具链arm-linux-gnueabihf-ranlib
(因为交叉工具链声明在zsj用户空间,而使用sudo安装时,shell控制台自动跳转到root用户下执行,故不能识别arm-linux-gnueabihf-ranlib交叉工具链)解决办法:su – t跳转到root用户,重新声明arm-linux-gnueabihf-ranlib交叉工具链,在root用户下,make install即可
编译后的库文件打包移植到开发板
# 在/home/zsj/ethercat-1.5.2目录下创建modules文件夹,并复制ec_generic.ko和ec_master.ko到modules下
mkdir -p output/modules
cp devices/ec_generic.ko output/modules/
cp master/ec_master.ko output/modules/
# 将output文件夹打包,传输到开发板(nfs/tftp/scp)
tar -cjf output.tar.bz2 output/
-------------------------------------------------------------------------------------------------------------------------------------
# 开发板上执行
tar -jxvf output.tar.bz2
# 复制ec_master.ko到/lib/modules/内核版本号/
cp output/modules/ec_master.ko /lib/modules/4.19.94/ # 内核版本可以通过uname -r 查看
depmod
ln -fs output/etc/init.d/ethercat /etc/init.d/ # 创建链接,相比于复制节省内存空间
ln -fs output/bin/ethercat /usr/local/bin/
mkdir /etc/sysconfig
ln -fs output/etc/sysconfig/ethercat /etc/sysconfig/
# 配置rules,创建设备号
echo KERNEL==\"EtherCAT[0-9]*\", MODE=\"0664\" > /etc/udev/rules.d/99-EtherCAT.rules
# 获取板子MAC地址
ifconfig
# eth2 Link encap:以太网 硬件地址 00:0c:29:01:69:aa
-------------------------------------------------------------------------------------------------------------------------------------
# 启动EtherCAT
# 配置主站的MAC地址
modprobe ec_master main_devices=1E:ED:19:27:1A:B3
# 启动ethercat
/etc/init.d/ethercat start
# 安装通用网卡驱动
insmod output/modules/ec_generic.ko
# 通过ethercat查看信息
Ethercat --help
EtherCAT Master在Linux应用空间的使用
- 参考EtherCAT源码下的example。
- git clone https://gitee.com/wllw7176/MyEthercat-IGH-1.5.2.git 参考EtherCAT二次开发的源代码