目录
本文记录EtherCAT主站典型编译配置流程,基于RK3562创龙SDK描述,3568、3588编译仅SDK路径和上的差别,其他流程一致,整体流程也可用于其他平台。
igh主站编译安装说明
- 文件说明:
igh编译安装说明.md:安装说明
etherlab.tar.xz:ethercat主站源码,包含rk stmmac 4.19和5.10驱动
- 源码包说明:
etherlab官方主站从2013年1.5.2版本起~2021年没有维护,但该时间段内有一个非官方的分支一直维护,功能比较全面。虽然2021年开始官方重新维护,当前版本1.6,但功能性能、支持的os、从站启动速度等方面不如非官方维护版本。
所以本次stmamc 内核驱动基于非官方版本开发,是一个完整的git仓库,内含本次开发完整的修改提交记录,若需要使用etherlab官方主站自行拷贝stmamc 驱动代码到官方代码内编译构建即可。
内核方面,preempt-RT、xenomai、普通liunx均可。
- 文档目录说明(根据实际情况修改)
- rk3562内核源码目录:
/home/wsg1100/TL3562-EVM/rk3562_linux_sdk_release_v1.1.0
- 主站源码目录:
/home/wsg1100/PetaLinux/PetaLinux/etherlab
- 示例安装路径为:
/media/wsg1100/rk3562_rootfs_install/
,根据实际情况进行修改,或直接指定为将SD启动卡挂载根目录,直接安装到启动卡。 - 交叉编译工具路径为
/home/wsg1100/TL3562-EVM/rk3562_linux_sdk_release_v1.1.0/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/
SDK_DIR="/home/wsg1100/TL3562-EVM/rk3562_linux_sdk_release_v1.1.0"
KERNEL_SRC="$SDK_DIR/kernel"
XENOMAI_SRC="$SDK_DIR/xenomai"
ETHERLAB_SRC="$SDK_DIR/etherlab"
INSTALL_OUTDIR="/home/wsg1100/rk3562_rootfs_install/"
一、配置内核自带网卡驱动编译为模块
将内核自带网卡驱动编译为模块,才能替换EtherCAT主站驱动网卡,重新编译SDK烧录,步骤如下;
1. 内核配置
终端输入以下内容,配置交叉编译环境变量
TOOLS_PATH=$SDK_DIR/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/
CROSS_PATH=$TOOLS_PATH/bin
export PATH=$TOOLS_PATH:$CROSS_PATH:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
配置内核,找到内核自带驱动,修改为编译成模块:
cd $KERNEL_SRC
make menuconfig
Symbol: STMMAC_ETH [=m]
Type : tristate
Prompt: STMicroelectronics 10/100/1000/EQOS Ethernet driver
Location: -> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Ethernet driver support (ETHERNET [=y])
-> STMicroelectronics devices (NET_VENDOR_STMICRO [=y])
使能PREEMPT-RT:
配置保存后,将修改后的.config
文件覆盖默认配置文件,重新编译SDK并烧录。
编译内核
cp .config arch/arm64/configs/rockchip_linux_defconfig
cd $SDK_DIR
./build.sh kernel
将编译后的resource.img
zboot.img
boot.img
根据相关文档烧录到板子。
编译内核模块
cd $KERNEL_SRC
# 创建目录
mkdir -p ${INSTALL_OUTDIR}
# 编译内核模块
make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH=${KMODULES_OUTDIR} modules -j$(nproc --all)
# 安装内核模块
make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH=${KMODULES_OUTDIR} modules_install INSTALL_MOD_STRIP=1
二、交叉编译EtherCAT主站
1. 普通linux或preempt-rt
1.1 配置
主站源码解压后,然后切换到主站目录下,执行以下命令生成autoconf配置脚本。
cd ${ETHERLAB_SRC}
./bootstrap
生成configure
配置脚本后进行配置。
./configure --host=aarch64-none-linux-gnu --with-linux-dir=${KERNEL_SRC} --prefix=/usr/local --enable-dwmac-rk --disable-8139too --enable-kernel --enable-rtmutex --disable-hrtimer --disable-eoe --disable-generic
参数说明,分为3方面:
-
编译环境
- --host: 指定交叉编译工具
- --with-linux-dir: Linux内核源码目录,使用绝对路径
- --prefix: 指定实际板子安装目录,这里指定为
/usr/local
。
-
主站功能配置
- --enable-kernel: 编译内核模块默认启用该选项
- --enable-rtmutex: 使用rtmutex,否则使用sem(sem没有onwer不具备优先级倒置)
- --disable-eoe:禁用主站EoE功能(有需要自行开启)
-
网卡驱动选择
- --enable-dwmac-rk: 编译stmmac-rk网卡驱动
- --disable-8139too: 禁止编译8139too网卡驱动,否则会报错
- --disable-generic: 禁用generic驱动
1.2 编译
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc) modules #编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc) #编译应用工具和ethercat库
1.3 安装到TF卡根目录
安装Ethercat用户配置工具和库到TF卡根目录下:
#安装ethercat工具和库指定安装目录
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- install DESTDIR=${INSTALL_OUTDIR}
安装Ethercat内核模块,安装到TF根目录。
#安装内核模块到指定安装目录
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- INSTALL_MOD_PATH=${INSTALL_OUTDIR} modules_install INSTALL_MOD_STRIP=1
注意:INSTALL_MOD_PATH
最好选择内核交叉编译时安装内核模块的路径,**好处是安装过程会自动处理模块依赖,拷贝到板子后无需处理模块符号依赖。
2. xenomai
2.1 交叉编译xenomai库
cd ${XENOMAI_SRC}
./scripts/bootstrap
#配置
./configure --host=aarch64-none-linux-gnu --enable-smp --enable-async-cancel --enable-assert --enable-pshared --enable-tls
#编译
make -j$(nproc)
#安装到根目录
sudo make -j$(nproc) DESTDIR=${INSTALL_OUTDIR} install
2.2 配置
主站源码解压后,然后切换到主站目录下,执行以下命令生成autoconf配置脚本。
cd ${ETHERLAB_SRC}
./bootstrap
生成configure
配置脚本后进行配置。
./configure --host=aarch64-none-linux-gnu --with-linux-dir=${KERNEL_SRC} --prefix=/ --with-xenomai-dir="${INSTALL_OUTDIR}/usr/xenomai/" --enable-rtdm --enable-dwmac-rk --disable-8139too --enable-kernel --enable-rtmutex --disable-hrtimer --disable-eoe --disable-generic
xenomai参数说明,分为3方面:
-
编译环境
- --host: 指定交叉编译工具
- --with-linux-dir: Linux内核源码目录,使用绝对路径
- --prefix: 指定实际板子安装目录,这里指定为
/usr/local
。 - --with-xenomai-dir: xenomai应用安装库路径,用来来编译链接xenomai环境的igh库。
-
主站功能配置
- --enable-kernel: 编译内核模块默认启用该选项
- --enable-rtmutex: 使用rtmutex否则使用sem,(sem没有onwer不具备优先级倒置)
- --disable-eoe:禁用主站EoE功能(有需要自行开启)
- --enable-rtdm: 启用xenomai RTDM设备,若不启用,xenomai应用程序操作主站是通过非实时路径,无法保证实时性
-
网卡驱动选择
- --enable-dwmac-rk: 编译stmmac-rk网卡驱动
- --disable-8139too: 禁止编译8139too网卡驱动,否则会报错
- --disable-generic: 禁用generic驱动
2.3 编译
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc) modules #编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc) #编译应用工具和ethercat库
2.4 安装到TF卡根目录
安装Ethercat用户配置工具和库到TF卡根目录下:
#安装ethercat工具和库指定安装目录
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- install DESTDIR=${INSTALL_OUTDIR}
安装Ethercat内核模块,安装到TF根目录。
#安装内核模块到指定安装目录
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- INSTALL_MOD_PATH=${INSTALL_OUTDIR} modules_install INSTALL_MOD_STRIP=1
注意:INSTALL_MOD_PATH
最好选择内核交叉编译时安装内核模块的路径,**好处是安装过程会自动处理模块依赖,拷贝到板子后无需处理模块符号依赖。
四、安装目录打包拷贝到板子
若安装目录${INSTALL_OUTDIR}
不是直接挂载的TF启动卡,需要将${INSTALL_OUTDIR}
目录压缩打包到板子,解压到板子根文件系统。
三、igh用户库文件说明
上面已经将igh安装到文件系统/usr/local/
(由主站配置的--prefix
决定),各文件如下:
tree /usr/local/
.
├── bin
│ ├── ethercat #ethercat 工具,用于主站状态查看、从站寄存器读写、调试等
│ └── ethercat_mbg #ethercat 邮箱网关工具
├── etc
│ ├── ethercat.conf #网卡配置文件!!!!!
│ ├── init.d
│ │ └── ethercat #init.d 启动脚本,早期Linux和嵌入式系统使用该方式
│ └── sysconfig
│ └── ethercat #网卡配置文件,systemd使用,大部分linux发行版使用该方式
├── include
│ ├── ecrt.h
│ └── ectty.h
├── lib
│ ├── libethercat.a #igh静态库
│ ├── libethercat.la
│ ├── libethercat.so -> libethercat.so.1.1.0 #igh 动态库,主要供ethercat工具、编译使用
│ ├── libethercat.so.1 -> libethercat.so.1.1.0
│ ├── libethercat.so.1.1.0
│ └── systemd
│ └── system
│ └── ethercat.service #systemd 服务
└── sbin
└── ethercatctl #systemd服务执行脚本/usr/local/sbin/ethercatctl
四、igh网卡配置
- 配置禁止网卡自动加载
经过以上步骤,当前板子中存在两个stmmac网卡驱动,一个是内核源码编译的,一个是ethercat主站编译的,为防止两个网卡自动加载,导致ethercat服务网卡加载失败,新建自动加载黑名单文件/etc/modprobe.d/dwmac_rockchip.conf
,内容如下:
blacklist dwmac_rockchip
blacklist ec_dwmac_rockchip
- 设置EtherCAT主站驱动
按如下,ECAT网卡配置文件位于/usr/local/etc/ethercat.conf
,修改如下:
#指定网卡,由于硬件不同MAC不同,所以这里统一使用"FF:FF:FF:FF:FF:FF"做默认匹配
MASTER0_DEVICE="FF:FF:FF:FF:FF:FF"
#指定网卡驱动
DEVICE_MODULES="dwmac_rockchip"
若使用双主站,按如下方式配置:
#指定网卡,由于硬件不同MAC不同,所以这里统一使用"FF:FF:FF:FF:FF:FF"做默认匹配,要使用实际的MAC也行,那每块板子都需要手动配置
MASTER0_DEVICE="FF:FF:FF:FF:FF:FF"
MASTER1_DEVICE="FF:FF:FF:FF:FF:FF"
#指定网卡驱动
DEVICE_MODULES="dwmac_rockchip"
五、启动及开机自启动
1. 启动ethercat主站测试
完成以上步骤后,启动主站:
sudo ethercatctl start #或者
sudo systemctl start ethercat.service
若有如下打印,说明环境设置成功。
pi@NanoPi-R6C:/usr/local/sbin$ dmesg | grep EtherCAT
[ 1415.034410] EtherCAT 0: Unregistered RTDM device EtherCAT0.
[ 1415.034669] EtherCAT: Master module cleaned up.
[ 1426.442436] EtherCAT: Master driver 1.5.2 unknown
[ 1426.442989] EtherCAT 0: Registered RTDM device EtherCAT0.
[ 1426.442996] EtherCAT: 1 master waiting for devices.
.....
[ 1489.916575] EtherCAT: Accepting 72:79:EC:56:32:E6 as main device for master 0.
....
[ 1490.121255] EtherCAT 0: Starting EtherCAT-IDLE thread.
2. 设置自动启动
这里以systemd为例,执行如下命令配置开机启动Etehrcat主站
sudo systemctl enable ethercat.service
linaro@RK356x-Tronlong:~$ sudo ethercat master
Master0
Phase: Idle
Active: no
Slaves: 1
Ethernet devices:
Main: 7e:cc:c3:17:55:22 (attached)
Link: UP
Tx frames: 379317
Tx bytes: 22786646
Rx frames: 379316
Rx bytes: 22786586
Tx errors: 0
Tx frame rate [1/s]: 285 285 285
Tx rate [KByte/s]: 16.7 16.7 16.7
Rx frame rate [1/s]: 285 285 285
Rx rate [KByte/s]: 16.7 16.7 16.7
Common:
Tx frames: 379317
Tx bytes: 22786646
Rx frames: 379316
Rx bytes: 22786586
Lost frames: 0
Tx frame rate [1/s]: 285 285 285
Tx rate [KByte/s]: 16.7 16.7 16.7
Rx frame rate [1/s]: 285 285 285
Rx rate [KByte/s]: 16.7 16.7 16.7
Loss rate [1/s]: 0 0 0
Frame loss [%]: 0.0 0.0 0.0
Distributed clocks:
Reference clock: Slave 0
DC reference time: 0
Application time: 0
2000-01-01 00:00:00.000000000
六、其他
-
卸载ethercat驱动命令:
rmmod ec_dwmac_rockchip ec_stmmac_platform ec_stmmac ec_master
-
加载内核自带驱动命令:
modprobe dwmac_rockchip
-
卸载内核自带驱动命令:
rmmod dwmac_rockchip stmmac_platform stmmac