您好、团队成员:
简介:
我 的板有两个以太网接口(eth0和 Eth1) 、就像 AM437的开发板那样、那么 我可以使用原始驱动程序。 start-up.cfg 配置 eth0、但当软件启动完成时、我需要重新配置一个或两个接口的 IP 地址。 它取决于从另一个器件的 SPI 通道接收到的配置消息。
事情几乎运转良好 、但在我看来、移除 IP 和 添加新 IP 更改的过程 有点模糊。 它看起来像是我的源代码的外观:
startup.cfg:
var osType ="tirtos";
VAR socType ="AM437X";
/加载 EMAC 封装
VAR EMAC = XDC.loadPackage ('ti.drv.emac');
emac.Settings.socType = socType;
//加载 Nimu 封装
VAR Nimu = XDC.loadPackage ('ti.transport.NDK.Nimu');
Nimu.Settings.socType = socType;
VAR Global = xdc.useModule('ti.ndk.config.Global');
VAR ICMP = xdc.useModule('ti.ndk.config.Icmp');
VAR IP = xdc.useModule('ti.ndk.config.Ip');
VAR UDP = xdc.useModule('ti.ndk.config.Udp');
ip.domainname ="ced2.net";
//静态 IP 配置的设置
ip.ResolveIP = false;
ip.CallByIP = false;
Ip.autoIp = false;
//如果不使用 IP 进行初始化。
ip.address ="192.168.10.10";
ip.mask ="255.255.255.0;
ip.gatewayIpAddr ="192.168.10.1";
//如果使用2个 IP 进行初始化(双 MAC 模式操作)
//在此处配置第二个以太网接口,并以编程方式配置第一个接口。
//对于双 MAC 模式操作,请在此处配置第二个以太网接口,然后
//使用 Global. stackInitHook 添加执行 IP 配置的挂钩
//以编程方式设置第一个接口。
ip.ifIdx = 1;
//对于双 MAC 模式操作,添加挂钩 Global. stackInitHook 以执行
//第一个接口的 IP 配置(可编程)。
//Global. stackInitHook ="&stackInitHook";
global.stackInitHook =空;
BIOS 初始化:
空以太网:Init()
{
EMAC_HwAttrs_V4 hwAttrs;
//芯片配置 MII/RMII 选择
CpswPortMacModeSelect (0、Ethernet_MAC_TYPE_RGMII);
CpswPortMacModeSelect (1、Ethernet_MAC_TYPE_RGMII);
EMAC_socGetInitCfg (0、hwAttrs);
//注意:由 Nimu 调用的 emac_open (cpsw_Nimu_eth.c 中的 Nimu_start)是
//实际上是 EMAC_open_v4 (emac_drv_v4.c)。 EMAC_open_v4调用 EMAC_setupCpswInitConfig 和
//强制收发器进行自动协商。
//设置配置模式标志(macModeFlags)而不是千兆位
hwAttrs.macModeFlags = EMAC_CPSW_CONFIG_MODEFLG_FULLDUPLEX;
hwAttrs.numPorts = 2;
hwAttrs.port[0].phy_addr = EMAC_CPSW_PORT0_PHY_ADDR;
hwAttrs.port[1].phy_addr = EMAC_CPSW_Port1_PHY_ADDR;
EMAC_socSetInitCfg (0、hwAttrs);
//填充 NIMU 器件表以初始化2个器件(以太网接口)。
NIMUDeviceTable[0].init =&CpswEmacInit;
NIMUDeviceTable[1].init =&CpswEmacInit;
NIMUDeviceTable[2].init = NULL;
}//初始化
删除/添加 IP:
在比例中、索引"0"为"eth0"、索引"1"为"Eth1"。 ´s 更改 IP 地址:
首先:删除所有 IP
执行结果= CfgGetEntry (0、CFGTAG _IPNet、1、1、&phCfgEntry);
仅返回 startup.cfg 上定义的一个接口
然后
结果= CfgRemoveEntry (0、phCfgEntry);
问题:CfgGetEntry 的第一个参数是"0"。 为什么??? 我无法找到此范围的定义位置及其用途。 我知道、如果我更改值、服务将无法正常工作。 我尝试从 Texas Library 变量定义加载 CfgGetEntry 、但 它不起作用。
删除后、我尝试为两个接口添加新 IP。 我的观点在这个 fase 中:
对于 BIOS 、eth0为索引0、Eth1为索引1。 要删除 CfgRemoveEntry ,eth0为索引0,Eth1为索引1。 当我尝试对 CfgAddEntry 使用相同的索引时(0,CFGTAG _IPNet,... 事情会很奇怪。 当我拔下以太网电缆 eth0时、Eth1 UDP 套接字停止、反之亦然。 在我看来、我的 eth0新 IP 地址是属于 Eth1的、 反之亦然。
如果我使用 CfgAddEntry (0、CFGTAG _IPNet、2、0、sizeof (CI_IPNet)、 (unsigned char *)&nA、0) (索引2)新 IP 归结为 eth0,如果我使用 CfgAddEntry (0、CFGTAG _IPNet、1、0、sizeof (CI_IPNet), (unsigned char *)&nA、0)(索引1) 新 IP 正确归属于 Eth01。
问:为什么这些指数是用于删除和添加操作的差数?
问题:当电路板启动并且从交换机上拔下以太网电缆时 、移除和添加操作将无法正常工作。 在我看来、更改 IP 地址进程行为会发生变化、例如当我使用索引0和1来添加新 IP (连接到链路 dow/up BIOS 状态的内容)时。
如果电路板从插入两根电缆开始、则一切工作正常、始终使用索引 2和1。 如果拔下 电源线并插上两根或分开的电缆,则系统行为和插座 工作正常。 为什么??????
感谢你的任何帮助
半