iGH EtherCAT初始化流程分析(一)

最近开始学习EtherCAT总线协议,以开源iGH EtherCAT主站协议栈为基础。由于没做过大型Linux程序开发,学习起来很慢,目前的方法是追踪调试信息,以摸清程序架构。

1.执行/etc/init.d/ethercat start

[91557.546292] EtherCAT: Master driver 1.5.2 33b922ec1871+
[91557.546575] EtherCAT 0: Registering RTDM device EtherCAT.
[91557.546602] EtherCAT: 1 master waiting for devices.
[91557.619343] ec_r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded
[91557.619770] ec_r8169 0000:05:00.0: irq 30 for MSI/MSI-X
[91557.619813] EtherCAT: Accepting 00:00:00:00:00:00 as main device for master 0.
[91557.619829] ec_r8169 0000:05:00.0 ecm0 (uninitialized): RTL8168e/8111e at 0xffffc9000000e000, 00:00:00:00:00:00, XID 0c200000 IRQ 30
[91557.619839] ec_r8169 0000:05:00.0 ecm0 (uninitialized): jumbo features [frames: 9200 bytes, tx checksumming: ko]
[91557.780709] EtherCAT 0: Starting EtherCAT-IDLE thread.

程序入口 为module.c
主要功能为生成/dev/EtherCAT0这个设备,module.c相当于设备驱动

/** Module initialization.
 *
 * Initializes \a master_count masters.
 * \return 0 on success, else < 0
 */
int __init ec_init_module(void)

进入ec_init_module时打印:
Master driver 1.5.2 33b922ec1871+
ec_master_init过程中调用ec_rtdm_dev_init(rtdm.c)打印:
Registering RTDM device EtherCAT.
初始化完成后输出
1 master waiting for devices.

在ec_master_init的最后阶段运行了ec_rtdm_dev_init(),对rtdm设备进行初始化。
ec_master_init完成后,系统生成/dev/EtherCAT0字符设备,内核的驱动守护进程udev会加载该设备的驱动ec_master.ko以及依赖模块ec_r8169.ko。
驱动加载完成后,调用ecdev_offer(module.c)完成网卡的挂载,打印:
Accepting 00:00:00:00:00:00 as main device for master 0.
网卡驱动初始化过程中调用ecdev_open,打开EtherCAT设备,并进入IDLE phase。

2.插上网线
输出调试信息

[101761.955927] EtherCAT 0: Link state of ecm0 changed to UP.
[101761.959969] EtherCAT 0: 6 slave(s) responding on main device.
[101761.959976] EtherCAT 0: Slave states on main device: PREOP.
[101761.960135] EtherCAT 0: Scanning bus.
[101763.451924] EtherCAT 0: Bus scanning completed in 1492 ms.
[101763.451934] EtherCAT 0: Using slave 0 as DC reference clock.

由网卡驱动调用ecdev_set_link() (device.c)
这段操作由内核负责完成ec_master模块和网卡驱动模块的调用,具体由udev来管理,目前未深入研究。

1.基于Igh-master1.5.2的多种Ethercat IO 模块及伺服电机的操作例子 2.基于Ethercat-Ighmaster二次开发库简化你的开发流程 所有源码及文档托管在码云平台,附件中有代码仓库地址 3.含有IghMaster1.5.2最新版本代码,编译脚本及安装到 最新的代码托管在: https://gitee.com/wllw7176/MyEthercat-IGH-1.5.2.git EtherCAT 1.5.2 编译及使用说明 1.交叉编译源码 源码中有内核模块编译,指令定模块目录 根据实际情况修改build_ethercat-1.5.2.sh中以下几个变量: output_dir='output' #编译输出目录 module_install_dir='module_install' #内核模块安装目录 kernel_source_dir='/mnt/fs_ext/imx6/linux-3.0.35' #内核源码目录 lib_modules_kernel_promt='3.0.35-2666-gbdde708' #内核版本号 host=arm-fsl-linux-gnueabi #交叉编译链前缀 注意要先编译内核,然后编译Ethrecat因为Ethercat依赖于内核通用网卡模块 以root用户运行./build_ethercat-1.5.2.sh #编译具体根据提示选择y/n就可以了 ---------------------------------------------------------------------------------------------------------------------------------------------- 手动安装Ethercat到ARM开发板: 2.内核模块安装 2.1 将output文件下通lib_modules_kernel_promt='3.0.35-2666-gbdde708'(build_ethercat-1.5.2.sh 中定义)放入开发板/lib/modules下 2.2 开发板中执行"depmod"命令 3. output里面的其它文件放入开发板对应位置 4. 设置参数 修改/etc/sysconfig/ethercat MASTER0_DEVICE="e4:f3:f5:c6:41:b6" #与ethercat绑定的Mac地址 DEVICE_MODULES="generic" #通用网卡就填generic,其余支持网卡换成模块名字就行 5.添加udev规则 echo KERNEL==\"EtherCAT[0-9]*\", MODE=\"0664\" > /etc/udev/rules.d/99-EtherCAT.rules 6. 启动服务 /etc/init.d/ethercat restart 出现以下信息表明移植成功 Shutting down EtherCAT master 1.5.2 done Starting EtherCAT master 1.5.2 ec_generic: Binding socket to interface 3 (eth0). done 7. 应用层测试 root@linaro-ubuntu-desktop:~# ethercat Please specify a command! Usage: ethercat [OPTIONS] [ARGUMENTS] Commands (can be abbreviated): alias Write alias addresses. config Show slave configurations. cstruct Generate slave PDO information in C language. data Output binary domain process data. debug Set the master's debug level. domains Show configured domains. download Write an SDO entry to a slave. eoe Display Ethernet over EtherCAT statictics. foe_read Read a file from a slave via FoE. foe_write Store a file on a slave via FoE. graph Output the bus topology as a graph. master Show master and Ethernet device information. pdos List Sync managers, PDO assignment and mapping. reg_read Output a slave's register contents. reg_write Write data to a slave's registers. rescan Rescan the bus. sdos List SDO dictionaries. sii_read Output a slave's SII contents. sii_write Write SII contents to a slave. slaves Display slaves on the bus. soe_read Read an SoE IDN from a slave. soe_write Write an SoE IDN to a slave. states Request application-layer states. upload Read an SDO entry from a slave. version Show version information. xml Generate slave information XML. Global options: --master -m Comma separated list of masters to select, ranges are allowed. Examples: '1,3', '5-7,9', '-3'. Default: '-' (all). --force -f Force a command. --quiet -q Output less information. --verbose -v Output more information. --help -h Show this help. Numerical values can be specified either with decimal (no prefix), octal (prefix '0') or hexadecimal (prefix '0x') base. Call 'ethercat --help' for command-specific help. 以上内容为基本的使用,进一步使用要结合ethercat说明文档和电机说明。 ---------------------------------------------------------------------------------------------------------------------------------------------- 自动安装Ethercat到ARM开发板: 将output目录复制到开发板然后运行output目录下install_to_arm.sh脚本 执行6,7步骤测试自动安装是否成功 ---------------------------------------------------------------------------------------------------------------------------------------------- 问题汇总: (1)Starting EtherCAT master 1.5.2 EtherCAT ERROR: MAC address may not be empty. FATAL: Error inserting ec_master (/lib/modules/3.0.35-2666-gbdde708-gbdbf2583/mnt/hgfs/win_linux_share/linux/download/ethercat-1.5.2/module_install/master/ec_master.ko): Invalid argument failed Mac地址为空,将对应的mac地址MASTER0_DEVICE="e4:f3:f5:c6:41:b6" (2)编译Ethercat 一定要保证所用编译器与内核与硬件平台一致,否则会出现内核模块不能使用或者其它未知问题 (3)内核源码要先编译通过,否则Ethercat模块将不能编译通过,因为Ethercat模块依赖于内核本身驱动模块。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值