知方号

知方号

龙芯开发板移植 IgH EtherCAT Master <龙芯1c101开发板>

前言#

IgH EtherCAT Master 是一个开源的EtherCAT主站驱动程序,用于管理EtherCAT从站设备,支持Linux操作系统,工控上使用的比较多。

dls ethercat是由英国钻石光源开发的用于 EPICS 控制系统 EtherCAT 设备的支持程序,基于 IgH Master 主站程序开发,实现对 EtherCAT 总线设备的读写。

交叉编译环境:Ubuntu

运行开发板:龙芯2K0500金龙开发板

内核版本:Linux LS-GD 5.10.0-rt17.lsgd #1 PREEMPT_RT

相关软件包下载地址#

epics-base - (launchpad.net) / epics-base/epics-base / EPICS Base (anl.gov)

epics-modules/asyn: EPICS module for driver and device support

epics-modules/busy: APS BCDA synApps module: busy

epics-modules/autosave: APS BCDA synApps module: autosave

dls-controls/ethercat: EPICS support to read/write to ethercat based hardware

IgH EtherCAT Master for Linux

PREEMPT RT patch

配置交叉编译环境#

关于这一节,之前的文章已经详细讲过,参考配置交叉编译环境。

如果你使用的是其他开发套件,请按照开发手册安装配置好环境。

编译 IgH EtherCAT Master#

源码一定要下载 stable-1.5 分支的,其他版本我也没有测试!

打补丁#1234567# 先将补丁复制到ethercat驱动源码下cp ethercat-master/etc/makeDocumentation/configurable-error-suppression.patch ethercat-stable-1.5/cd ethercat-stable-1.5/# 打补丁patch -p1 < configurable-error-suppression.patch# 这里需要注意一下patch的输出结果

由于补丁的时间比较早,跟现有的源码不太匹配,有些地方补丁会失败(FAILED)。比如我这里的报错,可能需要再手动修改一下。

1 2 3 4 5 6 7 8 91011121314151617181920232223242526patching file lib/Makefile.amHunk #1 succeeded at 32 (offset -2 lines).patching file lib/common.cpatching file lib/domain.cpatching file lib/liberror-documentation.txtpatching file lib/liberror.cpatching file lib/liberror.hpatching file lib/master.cHunk #1 succeeded at 37 (offset -2 lines)....Hunk #12 FAILED at 419.Hunk #13 FAILED at 448....2 out of 31 hunks FAILED -- saving rejects to file lib/master.c.rejpatching file lib/reg_request.cHunk #1 succeeded at 39 (offset -2 lines)....patching file lib/sdo_request.cHunk #1 succeeded at 39 (offset -2 lines)....patching file lib/slave_config.cHunk #1 succeeded at 39 (offset -1 lines)....patching file lib/voe_handler.cHunk #1 succeeded at 40 (offset -2 lines)....

我们参考lib/master.c.rej,手动修改一下。

1 2 3 4 5 6 7 8 91011121314151617181920232223# lib/master.c.rej--- lib/master.cTue Feb 12 17:31:08 2013 +0100+++ lib/master.cMon Mar 23 15:52:53 2015 +0000@@ -419,7 +431,8 @@ if (EC_IOCTL_ERRNO(ret) == EIO && abort_code) { *abort_code = download.abort_code; }- fprintf(stderr, "Failed to execute SDO download: %s ",+ ecrt_errcode = ECRT_ERRMASTERSDODOWNLOAD;+ ERRPRINTF("Failed to execute SDO download: %s ", strerror(EC_IOCTL_ERRNO(ret))); return -EC_IOCTL_ERRNO(ret); }@@ -448,7 +461,8 @@ if (EC_IOCTL_ERRNO(ret) == EIO && abort_code) { *abort_code = download.abort_code; }- fprintf(stderr, "Failed to execute SDO download: %s ",+ ecrt_errcode = ECRT_ERRMASTERSDODOWNLOADCOMPLETE;+ ERRPRINTF("Failed to execute SDO download: %s ", strerror(EC_IOCTL_ERRNO(ret))); return -EC_IOCTL_ERRNO(ret); }

然后这个补丁还有点问题,我们需要手动修改一下lib/liberror.c。这里源文件和头文件变量定义不一致,编译会报错,以头文件为准。

1234567#include "liberror.h"int ecrt_err_to_stderr = 1;// char *ecrt_errstring[ERRSTRING_LEN];char ecrt_errstring[ERRSTRING_LEN];int ecrt_errcode;准备内核源码#

由于需要将源码编译成相应的系统驱动,所以这里需要使用内核的源码。

如果是标准系统,可以直接安装linux-headers。

12# Ubuntu/Debiansudo apt install linux-headers-$(uname -r)

树莓派系统

1sudo apt install raspberrypi-kernel-headers

而对于开发板系统,我们可以使用随开发板提供的内核源码。

内核的编译步骤请根据开发板的用户手册完成。

最好再给内核打上 PREEMPT_RT 补丁。

1 2 3 4 5 6 7 8 9101112131415161718# 解压内核源码tar -xvf linux-5.10-2k500-src-f45937d-build.20230721100738.tar.gz# linux-5.10-2k500-cbd-srccd linux-5.10-2k500-cbd-src/# 为内核打上实时补丁(可选)patch -p1 < patch-5.10-rt17.patch# 配置交叉编译器./set_env.sh# 编译内核make loongson_2k500_defconfig# make menuconfigmake uImage# 编译模块make modules编译 EtherCAT Master 驱动# 1 2 3 4 5 6 7 8 9101112131415161718192023cd ethercat-stable-1.5/# to create the configure script, if downloaded from the repo./bootstrap# 这里需要注意是否出现报错,需要安装 autoconf、pkg-config 等工具# 执行configure# --host 指定程序运行的主机架构# --with-linux-dir 指定源码目录# 如果是安装的linux-headers,通常在 /usr/src/linux-headers-xxx# 如果直接使用内核源码,则必须通过上述编译步骤!# --prefix 指定安装目录./configure --host=loongarch64-linux-gnu CC=loongarch64-linux-gnu-gcc --enable-generic=yes --enable-8139too=no --with-linux-dir=/path/to/linux-5.10-2k500-cbd-src --prefix=/path/to/__install_dir# 编译make all modules# 或者# make# make ARCH=loongarch CORSS_COMPILE=loongarch64-linux-gnu- modules# 安装生成的文件# make install

如果完全按照上述步骤,应该可以编译成功。

下面整理一下生成的文件。

12345# 复制生成的主程序cp tool/ethercat /path/to/__install_dir/bin/# 复制生成的驱动程序cp device/ec_generic.ko /path/to/__install_dir/modules/cp master/ec_master.ko /path/to/__install_dir/modules/

这是我整理的文件,后面需要将这些文件下载到开发板。

__install_dir├─ bin│ └─ ethercat (主程序)├─ etc (配置)├─ include (头文件)├─ lib (libethercat.so)├─ modules (驱动目录)│ ├─ ec_master.ko│ └─ ec_generic.ko├─ sbin│ └─ ethercatctl└─ share └─ bash-completion/ (bash自动补全)编译 EPICS ethercat 模块#

以下步骤需要先安装好EPICS Base!

编译 asyn# 1 2 3 4 5 6 7 8 910111213141516171819cd asyntouch configure/RELEASE.localvi configure/RELEASE.local# 修改成和EPICS Base一样的架构EPICS_HOST_ARCH=linux-loong64# EPICS Base路径(示例)EPICS_BASE=/home/ubuntu/loongson/base-7.0.8# 放置EPICS模块的路径(示例)SUPPORT=/home/ubuntu/loongson/modules# SSCAN模块路径# SSCAN=$(SUPPORT)/sscan# CALC模块路径# CALC=$(SUPPORT)/calc# 直接编译# make# 交叉编译(示例)make LD=loongarch64-linux-gnu-ld CC=loongarch64-linux-gnu-gcc CCC=loongarch64-linux-gnu-g++编译 autosave# 1 2 3 4 5 6 7 8 9101112131415cd autosavetouch configure/RELEASE.localvi configure/RELEASE.local# 修改成和EPICS Base一样的架构EPICS_HOST_ARCH=linux-loong64# EPICS Base路径(示例)EPICS_BASE=/home/ubuntu/loongson/base-7.0.8# 放置EPICS模块的路径(示例)SUPPORT=/home/ubuntu/loongson/modules# 直接编译# make# 交叉编译(示例)make LD=loongarch64-linux-gnu-ld CC=loongarch64-linux-gnu-gcc CCC=loongarch64-linux-gnu-g++编译 busy# 1 2 3 4 5 6 7 8 9101112131415161718192023cd busytouch configure/RELEASE.localvi configure/RELEASE.local# 修改成和EPICS Base一样的架构EPICS_HOST_ARCH=linux-loong64# EPICS Base路径(示例)EPICS_BASE=/home/ubuntu/loongson/base-7.0.8# 放置EPICS模块的路径(示例)SUPPORT=/home/ubuntu/loongson/modules# ASYN模块路径ASYN=$(SUPPORT)/asyn# AUTOSAVE模块路径AUTOSAVE=$(SUPPORT)/autosave# BUSY模块路径BUSY=$(SUPPORT)/busy# 直接编译# make# 交叉编译(示例)make LD=loongarch64-linux-gnu-ld CC=loongarch64-linux-gnu-gcc CCC=loongarch64-linux-gnu-g++编译 ethercat#

这一步可以说是最麻烦,问题最多的。编译出什么问题都需要去找到相应的Makefile修改。

由于该软件包已经长时间无人维护,建议使用我修改过的版本。

首先需要安装所需的包libxml2-dev。但我们实际上并不需要用这个软件包,我们只需要它的头文件。

软件依赖的动态库(.so)文件,我们则需要从开发板系统中拷贝出来,无法直接用编译电脑的动态库。

1 2 3 4 5 6 7 8 910111213141516171819202322232425262728cd ethercat-master/# 创建 3rd 目录,用于放置所需的头文件和动态库mkdir 3rdmkdir 3rd/includemkdir 3rd/lib# 安装 libxml2-devsudo apt install libxml2-dev# 从系统目录中复制出libxml2的头文件# 因为还需要做一些修改,不能直接使用cp -r /usr/include/libxml2/ ./3rd/include/# 复制刚刚编译生成的 libethercatcp /path/to/__install_dir/lib/libethercat.so* ./3rd/lib/# 从开发板系统复制所需要的动态库# libxml2 依赖 libz 和 liblzmascp root@192.168.1.10:/usr/lib/libxml2.so.2.9.12 ./3rd/lib/scp root@192.168.1.10:/usr/lib/libz.so.1.2.11 ./3rd/lib/scp root@192.168.1.10:/usr/lib/liblzma.so.5.2.5 ./3rd/lib/# 手动创建一下

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。