RK3588+xenomai3+ethercat搭建

说明:

使用的RK3588的分支版本是linux-6.1-stan-rkr6
内核版本是6.1.99
把瑞芯微的SDK更新到linux-6.1-stan-rkr6这个版本即可。

编译xenomai3的内核

看我的上一篇随笔就行
RK3588增加Xenomai3实时补丁

修改ethercat

下载源码:

git clone https://gitlab.com/etherlab.org/ethercat.git
# 使用这个tags的版本
git checkout 1.6.7 -b kehu

用通用驱动ec_generic.ko虽然也可以但是1ms周期的抖动延时有20us左右,那就用专用的驱动让抖动延时更低一些,ethercat的源码把stmmac的驱动移植下就可以了。可以直接使用preempt_rt的RK已经适配过ethercat源码的stmmac的部分,把devices/stmm/文件夹复制过来然后./bootstrap把Makefile的文件给配置出来,编译的时候要使用--enable-stmmac-pci参数。

rtdm是实时性的接口,也是xenomai的接口,编译的时候发现rtdm是在ec_master里面。

修改的原理:链接

编译驱动

交叉编译

SDK_DIR=/home/yangx/linux2/yangx/RK3588/IAC-RK3588-MB-kernel-6.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
KERNEL_SRC=/home/yangx/linux2/yangx/RK3588/IAC-RK3588-MB-kernel-6.1/kernel/
xenomaiinstalldir=/home/yangx/linux2/yangx/RK3588/IAC-RK3588-MB-kernel-6.1/xenomai/build/usr/xenomai/
xenomaidir=/home/yangx/linux2/yangx/RK3588/IAC-RK3588-MB-kernel-6.1/xenomai/
./bootstrap
./configure --prefix=/home/yangx/linux2/yangx/RK3588/IAC-RK3588-MB-kernel-6.1/ethercat/build/ --host=aarch64-none-linux-gnu --enable-kernel --with-linux-dir=${KERNEL_SRC} --enable-8139too=no --enable-stmmac-pci=yes --enable-generic=no --enable-wildcards=yes  --enable-rtdm --with-xenomai-dir=${xenomaiinstalldir}
mkdir -p build
make ARCH=arm64 modules
# 交叉编译这个库文件时一直提示缺少头文件,我就索性在3588里面编译
export C_INCLUDE_PATH=${xenomaidir}/include/:$C_INCLUDE_PATH
export C_INCLUDE_PATH=${xenomaiinstalldir}/include:$C_INCLUDE_PATH
export C_INCLUDE_PATH=${xenomaiinstalldir}/include:${xenomaiinstalldir}/include/cobalt/:$C_INCLUDE_PATH
export LIBRARY_PATH=${xenomaiinstalldir}/lib/:$LIBRARY_PATH
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- install DESTDIR=/home/yangx/linux2/yangx/RK3588/IAC-RK3588-MB-kernel-6.1/ethercat_igh/build/
# 安装的时候有个systemctl的配置文件需要注意下
make install systemdsystemunitdir=(编译后你需要存放的目录,和configure命令上的prefix下跟的参数需要一致)

RK3588本机编译

apt install autoconf automake
# 把源码直接放到根目录下
./bootstrap
./configure --with-linux-dir=/usr/src/linux-headers-6.1-rockchip  --enable-rtdm=yes  --disable-8139too --enable-generic --disable-e1000e --disable-igb --enable-kernel  --disable-hrtimer --disable-eoe   --with-xenomai-dir=/usr/xenomai --prefix=/opt/etherlab --enable-ec_master --enable-ec_slave
make
make modules
make install
# 或者
make install DESTDIR=`pwd`/build/

编译出来的文件结构:
alt text
本机编译的时候会把服务什么的配置好,但是不想用的话,可以直接

insmod phylink.ko
insmod pcs_xpcs.ko
# 把网口的MAC地址填上,加载上这个ko,就会有/dev/EtherCAT0 节点。
insmod ec_master.ko   main_devices=32:d4:b5:f9:e3:d5
insmod ec_stmmac.ko

insmod ec_stmmac.ko 后的日志:

[  587.218264] rk_gmac-dwmac fe1b0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
[  587.218282] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[  606.986538] ec_master: loading out-of-tree module taints kernel.
[  606.988109] EtherCAT: Master driver 1.6.0-rc1 unknown
[  606.988309] EtherCAT: 1 master waiting for devices.
[  615.636814] ec_generic: EtherCAT master generic Ethernet device module 1.6.0-rc1 unknown
[  615.636837] EtherCAT: Accepting 32:D4:B5:F9:E3:D5 as main device for master 0.
[  615.636854] ec_generic: Binding socket to interface 2 (eth0).
[  615.643519] EtherCAT 0: Starting EtherCAT-IDLE thread.
[  615.643688] EtherCAT 0: Link state of ecm0 changed to UP.
[  615.645179] EtherCAT 0: 3 slave(s) responding on main device.
[  615.645185] EtherCAT 0: Slave states on main device: INIT.
[  615.645586] EtherCAT 0: Scanning bus.
[  615.956631] EtherCAT 0: Bus scanning completed in 311 ms.
[  615.956634] EtherCAT 0: Using slave 0 as DC reference clock.
[  615.972223] EtherCAT 0: Slave states on main device: PREOP.

配置systemctl的服务:
参考:链接

mkdir /etc/sysconfig
cp /opt/etherlab/etc/sysconfig/ethercat /etc/sysconfig/
cp /opt/etherlab/etc/init.d/ethercat /etc/init.d/
# 把模块放到系统目录
cp devices/ec_generic.ko /lib/modules/$(uname -r)
cp master/ec_master.ko /lib/modules/(uname -r)
depmod -a
# 配置启动的网口MAC  MASTER0_DEVICE=" "
vi /etc/sysconfig/ethercat
# 里面也有驱动类型的配置,配置之后可以自动加载ec_stmmac.ko,但是还是手动加载吧。
# 启动主站  服务启动需要modules的依赖文件
/etc/init.d/ethercat start
/etc/init.d/ethercat status
/etc/init.d/ethercat stop
# 实际上是一个脚本,启动另一个脚本,ethercatctl的脚本,这个脚本实际上就是配置ethercat这个二进制文件参数的,通过这个二进制文件写入网口的MAC地址。

常用的ethercat命令:

# 查看主站状态
ethercat status
# 查看从站状态
ethercat slaves
# 查看从站的寄存器
ethercat cstruct

实际测试

测试程序:

export LD_LIBRARY_PATH=/usr/xenomai/lib/:/opt/etherlab/lib/:$LD_LIBRARY_PATH
cd 
./a
taskset 0x4 ./a

Ethercat模块是EL1008,EL2008,网线直连RK3588和ethercat模块,1ms周期,10us的抖动延时。
如图示:
img

posted @ 2025-09-11 11:50  杨旭0324  阅读(136)  评论(0)    收藏  举报