基于Redboot2.02的ixp465网络驱动简析

合集下载

H3C配置案例大全(内部分享)

H3C配置案例大全(内部分享)

光纤链路排错经验一、组网:用户采用4台S5500作为接入交换机、1台S5500作为核心交换机组网,4台接入交换机分别在三个仓库以及门卫处与核心机房都是通过2根八芯单模光纤走地井连接,在这5个机房再通过跳纤来连接到交换上。

用户要求实现内网的用户主机访问公共服务器资源,并实现全网互通。

组网如下图所示:二、问题描述:PC现无法访问server服务器,进一步发现S5500光纤端口灯不亮,端口信息显示down状态。

在核心交换机端通过自环测试发现该端口以及光模块正常,接入交换机端也同样测试发现正常。

监控网络正常使用,再将网络接口转接到监控主干链路上,发现网络同样无法正常使用。

三、过程分析:想要恢复链路,首先要排查出故障点,根据故障点情况结合实际恢复链路通畅。

在这里主要分析光纤通路,光信号从接入交换机光口出来通过跳线,转接到主干光纤,然后再通过核心跳线转接到核心交换上。

由于该链路不通,首先要排除两端接口以及光模块问题,这里使用自环检测(如果是超远距离传输光纤线缆需要接光衰然后在自环,防止烧坏光模块)。

当检测完成发现无问题,再测试接入端的光纤跳纤:如果是多模光纤可以将一端接到多模光纤模块的tx口,检测对端是否有光;单模光纤如果没有光功率计可以使用光电笔检测(该方法只能检测出中间无断路,并不能检测出线路光衰较大的情况)。

最后再检测主线路部分,检测方式同跳线一样。

光路走向流程如图所示:四、解决方法:从上述的分析可以看出,只要保证了光信号一出一收两条路径都能正常就可以解决用户无法访问服务器的问题。

为了保证光路正常通路,最好的解决方法就是,通过使用光功率计来检测对端发射光在本端的光功率是否在光口可接受范围内。

由于用户组网使用了一些监控设备来接入该主干光缆,并且该光路现正常使用,通过将网络光纤转接到该监控主干光缆,发现网络光路仍然不通;并且两端端口自环检测正常。

由此可以判断出主要问题在两端的跳纤上。

如图所示:在没有光功率计并且客户业务又比较着急恢复的情况,可以先将两端的接入跳纤更换。

IxL-II软件及驱动参数调试说明

IxL-II软件及驱动参数调试说明

目录一、MODBUS与COCKPIT调试软件 (6)1.1 通信方式选择 (6)1.2 Modbus通信协议简介 (6)1.3 Cockpit调试软件与驱动器连接 (9)1.3.1 CockPit调试软件介绍 (9)1.3.2 CockPit软件安装 (9)1.3.3 Cockpit导入参数文件 (14)1.3.4 Cockpit与驱动器建立通信连接 (15)1.4 Cockpit参数配置与调试 (19)1.4.1 Cockpit界面功能及参数设置 (19)1.4.2 Cockpit启动电机自学习功能 (21)1.4.3 Cockpit控制电机运转 (22)1.4.4 Cockpit电机与驱动状态监测 (24)二、参数设定及功能说明 (25)2.1 电机参数配置 (25)2.1.1 电机匹配参数设置 (25)2.1.2 电机旋转方向的切换 (26)2.1.3 电机超程设定 (27)2.1.4 电机转矩限制 (28)2.1.5 电机过载设置 (28)2.1.6 电机过载限流输出功能设置 (29)2.1.7 用Cockpit软件设置与监控电机参数 (29)2.2 电机参数自学习 (31)2.2.1 电机自学习功能介绍 (31)2.2.2 用Cockpit软件进行电机自学习 (32)2.3 位置控制 (33)2.3.1 控制模式的选择 (33)2.3.2 电子齿轮 (34)2.3.3 位置指令来源设定 (36)2.3.4 位置指令脉冲给定控制 (36)2.3.5 位置指令速度给定控制 (37)2.3.6 位置指令内部参数(位置接点)控制 (37)2.3.7 位置指令位置插补控制 (39)2.3.8 位置到位阈值设定 (40)2.3.9 位置环参数调整 (40)2.3.10 用Cockpit软件进行位置控制操作 (42)2.4 速度控制 (44)2.4.1 速度指令设定 (44)2.4.2 速度环参数调整 (48)2.4.3 速度DROOP(下垂)控制功能 (50)2.4.4 用Cockpit软件进行速度控制操作 (51)2.5 力矩控制 (53)2.5.1 转矩指令设定 (53)2.5.2 电流环参数调整 (54)2.5.3 用Cockpit软件进行力矩控制操作 (55)2.6 回零操作 (57)三、保护顺序设计 (64)3.1 伺服控制电源接通时序 (64)3.2 伺服控制电源欠压时序 (65)3.3 伺服报警输出及清除 (65)3.4 伺服使能信号(/S-ON) (66)四状态显示与故障诊断 (68)4.1 LED指示灯说明 (68)4.2 故障代码一览表 (68)4.3 报警原因及处理方法 (69)4.4 报警清除 (71)附录:MODBUS常用通信数据地址 (72)Revise Page 修改页一、MODBUS与COCKPIT调试软件1.1 通信方式选择驱动器采样MODBUS-RTU协议,支持RS485通信方式。

Modbus协议中文版(GB)

Modbus协议中文版(GB)

差错码
异常码
图 5 MODBUS 事务处理(异常响应) F 注释:需要管理超时,以便明确地等待可能不会出现的应答。
串行链路上第一个 MODBUS 执行的长度约束限制了 MODBUS PDU 大小(最大 RS485ADU=256 字节)。
因此,对串行链路通信来说,MODBUS PDU=256-服务器地址(1 字节)-CRC(2 字节)=253 字节。
MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。MODBUS 功能码是 MODBUS 请求/应答 PDU 的元素。本文件的作用是描述 MODBUS 事务处理框架内使用的功能码。
1.2 规范性引用文件
1.RFC791,互联网协议,Sep81 DARPA 2.MODBUS 协议参考指南 Rev J,MODICON,1996 年 6 月,doc#PI_MBUS_300 MODBUS 是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客 户机/服务器通信。 目前,使用下列情况实现 MODBUS: 以太网上的 TCP/IP。 各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行 传输。 MODBUS PLUS,一种高速令牌传递网络。
IETF 因特网工程工作组
I/O 输入/输出设备
IP
互连网协议
MAC 介质访问控制
MB MODBUS 协议
MBAP MODBUS 协议
PDU 协议数据单元
PLC 可编程逻辑控制器
TCP 传输控制协议
GB/T ××××—××××
3 背景概要 MODBUS 协议允许在各种网络体系结构内进行简单通信。
MODBUS 通信

施耐德 Modicon M340 PLC 通讯构架网络

施耐德 Modicon M340 PLC 通讯构架网络

章2
2.1 2.2 2.3
网络和总线上可用的服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 全局数据服务. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 全局数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 IO 扫描服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 IO 扫描服务描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 消息传递服务. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 消息传递服务. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 消息传递服务通讯功能的特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

千兆网口Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析

千兆网口Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析

在连续两个平台的uboot和Linux系统移植过程中,在千兆网口调试这块都遇到了很大的麻烦。

由于寄存器数量庞大,千兆网口MAC和PHY内部结构复杂,MAC和PHY接口种类多,千兆以太网驱动的调试成了系统移植过程中最让人烦心的一个环节。

就像火箭队,每次都让球迷无比揪心,不是输的窝囊,就是伤兵满营,现在新赛季又两连败了,打的比勇士还勇士,后场两个比我还瘦的家伙,怎么防守。

算了,不扯这么多了,今天要说的是网口MAC+PHY的一些原理和代码分析。

(以Freescale的ETSEC和Marvell的88E1111为例。

)1 千兆以太网的物理层千兆以太网的物理层分为物理编码子层PCS(Physical Coding Sublayer)、物理介质连接子层PMA(Physical Medium Attachment)和物理介质相关子层PMD(Physical Medium Dependent)三层,如下图所示:其中PCS子层负责8b10b编码,它可以把从GMII口接收到的8位并行的数据转换成10位并行的数据输出。

因为10比特的数据能有效地减小直流分量,降低误码率,另外采用8b10b编码便于在数据中提取时钟和进行首发同步。

可以把PCS两头看成GMII接口和TBI接口。

PMA子层进一步将PCS子层的编码结果向各种物理媒体传送,主要是负责完成串并转换。

PCS层以125M的速率并行传送10位代码到PMA层,由PMA 层转换为1.25Gbps的串行数据流进行发送,以便实际能得到1Gbps的千兆以太网传送速率。

可以把PMA子层的两头分别看做TBI接口和SGMII接口。

PMD子层将对各种实际的物理媒体完成接口,完成真正的物理连接。

由于1000BASE-X支持多种物理媒介,如光纤和屏蔽双绞线,它们的物理接口显然不会相同。

有的要进行光电转换,有的要完成从不平衡到平衡的转换。

PMD层将对这些具体的连接器作出规定。

2 Freescale 的ETSEC与PHY之间的接口Freescale的MPC8314和P2020都自带了三速以太网控制器ETSEC,可以提供10M,100M,1000M三种速率的接口。

零差云控 eDriver CANopen 通信应用手册说明书

零差云控 eDriver CANopen 通信应用手册说明书
第 2 章 通信网络配置........................................................................................ 4 2.1 CANopen 协议概述 ............................................................................... 4 2.1.1 对象字典...................................................................................... 5 2.1.2 常用的通信对象.......................................................................... 5 2.1.3 通信对象标识符.......................................................................... 6 2.2 网络管理系统 (NMT) ........................................................................... 7 2.2.1 NMT 模块控制(NMT Module Control) ............................. 8 2.2.2 MNT 节点保护(NMT Node Guarding) .............................. 8 2.2.2 NMT Boot-up........................................................................... 10 2.3 服务数据对象 (SDO) .......................................................................... 10 2.3.1 SDO 传输框架........................................................................... 10 2.3.2 SDO 传输报文........................................................................... 11 2.4 过程数据对象 (PDO) .......................................................................... 13 2.4.1 PDO 传输框架........................................................................... 14 2.4.2 PDO 对象................................................................................... 15 2.4.3 PDO 通信参数........................................................................... 15 2.4.4 PDO 映射参数........................................................................... 17 2.5 同步对象 (SYNC) ............................................................................... 19 2.5.1 同步发生器................................................................................ 20 2.5.2 同步对象传输框架.................................................................... 20 2.6 紧急对象服务 (EMCY) ...................................................................... 21

Linux E1000网卡驱动分析

Linux-千兆网卡驱动实现机制浅析作者: Minit, 出处:博客,责任编辑: 罗丽艳,2009-03-29 00:001.引言本分析主要针对e1000网卡,驱动源码为7.3.20-k2。

本文的目的不是为了讲述如何编写驱动程序,主要是分析网卡驱动内部的实现机制。

通过此分析,希望可以理解驱动程序中的各个部分的关系,对网卡发送和接收数据包有直观的了解,同时也希望对设计网卡驱动程序有帮助。

由于网卡驱动程序与硬件和操作系统都有很紧密的联系,故要把某些问题完全弄清楚,需要很多的经验与相关知识,介于自身的水平有限,且自身经验较少,故肯定存在很多问题,希望本文的读者发现了问题不吝与作者联系。

2.网卡驱动的体系结构网卡作为一个PCI设备,其必须遵守相应的PCI规范,即必须为网卡定义相应的标识号,每个PCI外设由一个总线编号、一个设备编号及一个功能编号来标识。

网卡驱动程序则需要定义相应的pci_device_id结构来表示其支持的PCI外设的标识,通过在驱动程序的pci_device_id中查找设备标识号,将驱动程序与设备联系起来。

网卡作为PCI设备,其包括两类空间,一种是配置空间,CPU不能直接访问,访问这个空间,需要借助BIOS功能;另一种是普通的控制寄存器空间,这部分经过映射后,CPU可以直接访问控制。

在硬件加电初始化时,BIOS统一检查所有的PCI设备,并为每个设备分配一个物理地址,该地址通过BIOS获得并写到设备的配置空间内,驱动程序就可以将网卡的普通控制寄存器映射到一段内存空间内,CPU通过访问映射后的虚拟地址来操控网卡的寄存器。

当操作系统初始化时,其为每个PCI设备分配一个pci_dev结构,并将前面分配的物理地址写到pci_dev的resource字段中。

在网卡驱动程序中则可以通过读取pci_dev中的resource字段获得网卡的寄存器配置空间地址,其由函数pci_resource_start()和pci_resource_end()获得该空间的起始位置,通过ioremap()将该段位置映射到主存中,以便CPU访问控制网卡的I/O和内存空间。

浪潮英信服务器 BMC 用户手册说明书

浪潮英信服务器BMC用户手册文档版本V2.8发布日期2022-05-31版权所有© 2021-2022浪潮电子信息产业股份有限公司。

保留一切权利。

未经本公司事先书面许可,任何单位和个人不得以任何形式复制、传播本手册的部分或全部内容。

内容声明您购买的产品、服务或特性等应受浪潮集团商业合同和条款的约束。

本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。

除非合同另有约定,浪潮集团对本文档的所有内容不做任何明示或默示的声明或保证。

文档中的示意图与产品实物可能有差别,请以实物为准。

本文档仅作为使用指导,不对使用我们产品之前、期间或之后发生的任何损害负责,包括但不限于利益损失、信息丢失、业务中断、人身伤害,或其他任何间接损失。

本文档默认读者对服务器产品有足够的认识,获得了足够的培训,在操作、维护过程中不会造成个人伤害或产品损坏。

文档所含内容如有升级或更新,恕不另行通知。

商标说明Inspur浪潮、Inspur、浪潮、英信是浪潮集团有限公司的注册商标。

本手册中提及的其他所有商标或注册商标,由各自的所有人拥有。

技术支持技术服务电话:4008600011地址:中国济南市浪潮路1036号浪潮电子信息产业股份有限公司邮编:250101符号约定在本文中可能出现下列符号,它们所代表的含义如下。

符号说明如不当操作,可能会导致死亡或严重的人身伤害。

符号 说明如不当操作,可能会导致人员损伤。

如不当操作,可能会导致设备损坏或数据丢失。

为确保设备成功安装或配置,而需要特别关注的操作或信息。

对操作内容的描述进行必要的补充和说明。

变更记录 版本时间 变更内容V1.02021-02-07 首版发布。

V2.0 2021-06-23 格式内容整体优化。

V2.1 2021-09-01 1. 增加因机型不同,Web 界面及个别功能或有差异的说明。

2. 3.12.3章节从视频日志变更为屏幕录像。

3. 增加多节点服务器电源信息和风扇管理查看说明。

[计算机软件及应用]攻击网络打印机国外关于攻击网络打印机的手册_在网上能找到英文

攻击网络打印机作者:Adrian Crenshaw译者:riusksk (泉哥:)你说如果入侵打印机需要何种墨水呢,Irongeek(译注:作者的网站)吗?好的,本文这里将向您讲述如何通过打印机以鲜为人知的方式来渗透网络。

以前,除了垃圾箱中的复印件所带来的安全威胁外,并不会有其它太多的安全隐患。

但现在的打印机却可通过网络与嵌入式操作系统、存储和IP协议栈相关联,已经不再像以前一样单一了。

本文将就网络打印机泄漏用户、机主和网络的相关信息的话题展开讨论。

由于本文中关于攻击的内容多于防御,因此看起来有点像黑帽子。

但是我觉得这些信息对于系统管理员和审计者来说更为有用,可以帮助他们在面对网络打印机时更清楚地知道该关注哪一方面的信息。

关于如何锁住网络打印机,你可以访问厂商的官方网站以获取更多的建议。

关于惠普网络打印机的一份指南在本文的底部已经附上下载连接,如果不出意外,本文将引领你在正确的方向上进行思考。

本文测试的打印机主要是基于Hewlett-Packard LaserJet 4100 MFP (Fax/Printer/Copier/Scanner),HP Jetdirect 170x和HP JetDirect 300X (J3263A),但与此同时我也将讲述一些关于Ricoh Savin打印机的内容,以便让你知道,其实并不是只有惠普的网络打印机才存在安全问题的。

本文最初来源于Droop的I nfonomicon TV项目,它如滚雪球一般,没有具体的方向。

但我继续坚持着,并对其进行整理,还有其他朋友给予的附加内容和建议,才使得本文更为完善和更有价值。

关于本文的最新版本可在以下链接找到:/i.php?page=security/networkprinterhacking概念下面讲述几个本文中涉及到的缩写词。

PCL代表打印机控制语言(Printer Control Language),由惠普公司开发,并被广泛使用的一种打印机协议。

Linux I2C设备驱动编写

Linux I2C设备驱动编写(一)在Linux驱动中I2C系统中主要包含以下几个成员:如果一个I2C适配器不支持I2C通道,那么就将master_xfer成员设为NULL。

如果适配器支持SMBUS 协议,那么需要去实现smbus_xfer,如果smbus_xfer指针被设为NULL,那么当使用SMBUS协议的时候将会通过I2C通道进行仿真。

master_xfer指向的函数的返回值应该是已经成功处理的消息数,或者返回负数表示出错了。

functionality指针很简单,告诉询问着这个I2C主控器都支持什么功能。

在内核的drivers/i2c/i2c-stub.c中实现了一个i2c adapter的例子,其中实现的是更为复杂的SMBUS。

SMBus 与I2C的区别通常情况下,I2C和SMBus是兼容的,但是还是有些微妙的区别的。

时钟速度对比:在电气特性上他们也有所不同,SMBus要求的电压范围更低。

I2C driver具体的I2C设备驱动,如相机、传感器、触摸屏、背光控制器常见硬件设备大多都有或都是通过I2C 协议与主机进行数据传输、控制。

结构体如下:如同普通设备的驱动能够驱动多个设备一样,一个I2C driver也可以对应多个I2C client。

以重力传感器AXLL34X为例,其实现的I2C驱动为:这里要说明一下module_i2c_driver宏定义(i2c.h):module_driver():理解上述宏定义后,将module_i2c_driver(adxl34x_driver)展开就可以得到:这一句宏就解决了模块module安装卸载的复杂代码。

这样驱动开发者在实现I2C驱动时只要将i2c_driver结构体填充进来就可以了,无需关心设备的注册与反注册过程。

I2C client即I2C设备。

I2C设备的注册一般在板级代码中,在解析实例前还是先熟悉几个定义:下面还是以adxl34x为例:这样ADXL34X的i2c设备就被注册到了系统中,当名字与i2c_driver中的id_table中的成员匹配时就能够出发probe匹配函数了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 网络设备注册
Redboot不能像Linux那样以模块方式动态注册网络设备驱动,而是通过直接 静态编译入执行程序中, 由链接器按规则或脚本分配内存位置。程序中使用了大 量的控制链接和编译的宏, 规定了函数的链接规则,很多相同的数据结构被编译 进一个独立的内存段,便于使用结构体指针查找。Redboot初始化设备就是查找 这些内存段中的设备数据结构并调用其注册的初始化函数。 设备表入口DEVTAB_ENTRY,通过给指定的设备定义DEVTAB_ENTRY, 来达到对设备的注册。在文件io/common/current/include/devtab.h中定义宏 DEVTAB_ENTRY,默认是个字符设备,与CHAR_DEVTAB_ENTRY相同;如果 要注册一个块设备则使用BLOCK_DEVTAB_ENTRY。 如果注册一个网络设备则使用NETDEVTAB_ENTRY,文件位置为 io/eth/current/include/Netdev.h。
typedef struct cyg_netdevtab_entry{ const char *name; bool (*init)(struct cyg_netdevtab_entry *tab); void *device_instance; //Local data, instance specific unsigned long status;
NETDEVTAB_ENTRY(i82559_netdev0,\//网络设备结构体 “i8259_” CYGDAT_DEVS_ETH_ARM_IXDP465_i82559_ETH0_NAME, i82559_init,\//函数位置:Devs/eth/intel/i82559/current/src/if_i82559.c &i82559_sc0); //eth_drv_sc结构体指针对应void *device_instance ETH_DRV_SC(i82559_sc0, \//声明一个eth_drv_sc结构体 &i82559_eth0_priv_data, \//Driver specific data CYGDAT_DEVS_ETH_ARM_IXDP465_I82559_ETH0_NAME,\//Name for device i82559_start, i82559_stop, i82559_ioctl, i82559_can_send, \//声明相应函数 i82559_recv, i82559_deliver, i82559_poll, i82559_int_vector); \//声明相应函数
系统访问这个网络设备的时候,并不直接使用设备表入口的名称_l,而是通 过两个cyg_netdevtab_entry_t类型的指针来操作 dev.data数据段,分 别是__NETDEVTAB__和__NETDEVTAB_END__,在 redboot/Current/Src/Net/Net_io.c中定义了这两个指针所指的位置,如下: CYG_HAL_TABLE_BEGIN(__NETDEVTAB__, netdev); CYG_HAL_TABLE_END(__NETDEVTAB_END_, netdev);
在hal/common/current/include/hal_tables.h中
#define CYG_HAL_TABLE_BEGIN(_lable, _name) \ __asm__(“.section \”.ecos.table.”__xstring(_name) “.begin\”,\”aw\”\n \ //a,允许段,w,可写段, x,可执行段 “.globl “ __xstring(CYG_LABEL_DEFN(_label)) “\n” \ “.type “ __xstring(CYG_LABEL_DEFN(_label)) “, object\n” \ “.p2align“ __xstring(CYGARC_P2ALIGNMENT) “\n” \//.p2align 10 210字节对齐 __xstring(CYG_LABEL_DEFN(_label)) “:\n” \//标号 “.previous\n” \ ) 在infra /include/Cyg_type.h中 #define CYG_LABEL_DEFN(_label) _label\
基于 Redboot2.02 的 ixp465 网络驱动简析
JARI TOOL 由于网络设备并不是系统启动必须的,Redboot 在引导最小核心系统前不会 去检测它们,而是将其移后到系统启动一个阶段后开始执行初始化函数。当然, 之前可以把主芯片控制器的功能配置好,如 MII 口和 PCI 等。 通常 I/O 控制系统的分层结构如下表所示。I/O 子系统包位于 packages/io 子 目录下,设备驱动程序包位于 packages/devs 子目录下。每个设备类型在两个模 块 下 都 包 含 一 个 子 目 录 。 例 如 以 太 网 的 目 录 包 括 packages/io/eth 和 packages/devs/eth,下文将目录前缀,即前一级目录 packages/省略。 应用层 I/O 子系统 设备驱动层 硬件层 网络堆栈 以太网 I/O 接口 以太网设备控制 以太网端口硬件 诊断控制 串口 I/O 接口 串口设备控制 串口端口硬件 文件系统 文件 I/O 接口 Flash 存储设备控制 Flash 硬件
}CYG_HAL_TABLE_TYPE cyg_netdevtab_entry_t; 在hal/common/current/include/hal_tables.h中 #define CYG_HAL_TABLE_TYPE \ CYGBLD_ATTRIB_ALIGN(CYGARC_ALIGNMENT) 在infra /include/Cyg_type.h中 #define CYGBLD_ATTRIB_ALIGN(__align__) \ __attribute__((aligned(__align__))) 相当于#define CYG_HAL_TABLE_TYPE __attribute__((aligned(4))) #define NETDEVTAB_ENTRY(_l, _name, _init, _instance) \ static bool _init(struct cyg_netdevtab_entry *tab); \ cyg_netdevtab_entry_t _l CYG_HAL_TABLE_ENTRY(netdev)={_name,_init,_instance,} 在hal/common/current/include/hal_tables.h中 #define __string(_x) #_x #define __xstring(_x) __string(_x) #define CYG_HAL_TABLE_ENTRY(_name) \ CYGBLD_ATTRIB_SECTION(“.ecos.table.”__xstring(_name)”.data”); 在infra /include/Cyg_type.h中 #define CYGBLD_ATTRIB_ SECTION(__sect__) \ __attribute__((section(__sect__))) 相当于#define CYG_HAL_TABLE_ENTRY(netdev) \ __attribute__((section(“dev.data”)))
在io/eth/current /include/eth_drv.h中
struct eth_drv_sc{ struct eth_hwr_funs *funs;//是一个函数指针结构体 void *driver_private; const char *dev_name; int state; struct sc_arpcom;/*Ethernet common MAC address*/ } struct eth_hwr_funs{ void (*start)(struct eth_drv_sc *sc, unsigned char *enaddr,int flags); void (*stop)(struct eth_drv_sc *sc); int (*control)(struct eth_drv_sc *sc, unsigned long key,void *data,\ int data_length); int (*can_send)(struct eth_drv_sc *sc);
void (*send)(struct eth_drv_sc *sc, struct eth_drv_sg* sg_list, int sg_len,\ int total_len, unsigned long key); void (*recv)(struct eth_drv_sc *sc, struct eth_drv_sg* sg_list, int sg_len); void (*deliver)(struct eth_drv_sc *sc); void (*poll)(struct eth_drv_sc *sc); int (*int_vector) (struct eth_drv_sc *sc); struct eth__drv_old; } struct eth_drv_funs{void (*init)(struct eth_drv_sc *sc, unsigned char *enaddr); void (*recv)(struct eth_drv_sc *sc, int total_len); void (*tx_done)(struct eth_drv_sc *sc,CYG_ADDRESS key,int status); } 在io/eth/current/src/net/eth_drv.c中 struct eth_drv_funs={eth_drv_init,eth_drv_recv,eth_drv_tx_done}; #define ETH_DRV_SC(sc, priv, name,start,stop,control,can_sen,send,recv,deliver,\ poll,int_vector)\ static void start(struct eth_drv_sc *sc, unsigned char *enaddr, int flags); \ static void stop(struct eth_drv_sc *sc);\ static int control(struct eth_drv_sc *sc, unsigned long key, void *data, \ int data_length);\ static int can_send(struct eth_drv_sc *sc);\ static void send(struct eth_drv_sc *sc, struct eth_drv_sg* sg_list, int sg_len,\ int total, unsigned long key);\ static void recv(struct eth_drv_sc *sc, struct eth_drv_sg* sg_list, int sg_len);\ static void deliver(struct eth_drv_sc *sc);\ static void poll(struct eth_drv_sc *sc);\ static int int_vector(struct eth_drv_sc *sc);\ static struct eth_hwr_funs sc##_funs={ start,stop,control,can_sen,send,recv,deliver,\ poll,int_vector,&eth_drv_funs,(struct eth_drv_funs*)0);\ struct eth_drv_sc sc={ sc##_funs, priv, name}; //主要是将结构体eth_drv_sc变量sc中的各个成员函数声明,并将其下属结构和 // 递归下属结构填入适当的函数指针
相关文档
最新文档