【原创】RK3588/RK3568/RK3562平台 IgH EthercAT主站编译安装

本文记录EtherCAT主站典型编译配置流程,基于RK3562创龙SDK描述,3568、3588编译仅SDK路径和上的差别,其他流程一致,整体流程也可用于其他平台。

igh主站编译安装说明

  1. 文件说明:

igh编译安装说明.md:安装说明

etherlab.tar.xz:ethercat主站源码,包含rk stmmac 4.19和5.10驱动

  1. 源码包说明:

etherlab官方主站从2013年1.5.2版本起~2021年没有维护,但该时间段内有一个非官方的分支一直维护,功能比较全面。虽然2021年开始官方重新维护,当前版本1.6,但功能性能、支持的os、从站启动速度等方面不如非官方维护版本。

所以本次stmamc 内核驱动基于非官方版本开发,是一个完整的git仓库,内含本次开发完整的修改提交记录,若需要使用etherlab官方主站自行拷贝stmamc 驱动代码到官方代码内编译构建即可。

内核方面,preempt-RT、xenomai、普通liunx均可。

  1. 文档目录说明(根据实际情况修改)
  • 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网卡配置

  1. 配置禁止网卡自动加载

经过以上步骤,当前板子中存在两个stmmac网卡驱动,一个是内核源码编译的,一个是ethercat主站编译的,为防止两个网卡自动加载,导致ethercat服务网卡加载失败,新建自动加载黑名单文件/etc/modprobe.d/dwmac_rockchip.conf,内容如下:

blacklist dwmac_rockchip
blacklist ec_dwmac_rockchip
  1. 设置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

六、其他

  1. 卸载ethercat驱动命令:rmmod ec_dwmac_rockchip ec_stmmac_platform ec_stmmac ec_master

  2. 加载内核自带驱动命令:modprobe dwmac_rockchip

  3. 卸载内核自带驱动命令:rmmod dwmac_rockchip stmmac_platform stmmac

posted @ 2024-10-19 21:56  沐多  阅读(100)  评论(0编辑  收藏  举报