U-Boot中PING命令处理流程之一

上一节中,我们分析了NetLoop函数部分,这一节,分析一下NetLoop函数调用的PingStart()函数。

static void PingStart(void)
{
#if defined(CONFIG_NET_MULTI)//这个我们不用理
 printf ("Using %s device\n", eth_get_name());
#endif 
 NetSetTimeout (10 * CFG_HZ, PingTimeout);
 NetSetHandler (PingHandler);

 PingSend();
}

第一、CFG_HZ

在fs2410.h中,我们队CFG_HZ的定义如下:

#define CFG_HZ   1562500,看看smdk2410开发板的作者是怎么注释的

//the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need  it to wrap 100 times

//(total 1562500) to get 1 sec.

fs2410.h就是仿smdk2410.h改写的,所以这个值没变,

这个时间应该就是cpu查询CS8900的时间间隔,通过定时的查询检查是否收到数据包。

第二、NetSetTimeout 函数

下面让我们来看看NetSetTimeout 这个函数:

void
NetSetTimeout(ulong iv, thand_f * f)
{
 if (iv == 0) {
  timeHandler = (thand_f *)0;
 } else {
  timeHandler = f;
  timeStart = get_timer(0);
  timeDelta = iv;
 }
}

在NetSetTimeout函数中,因为CFG_HZ不为0,所以执行else分支。

timeHandler 的定义如下(定义在net.c中):

static thand_f *timeHandler;  // Current timeout handler  

而thand_f的定义如下(定义在net.h中)

      typedef void thand_f(void);//thand_f是一个无参数无返回的函数,typedef的作用是定义一种类型,例如上面的static thand_f *timeHandler就相当于static void (*thand_f)(void)即定义了一个函数型指针,所谓函数型指针就是指向函数入口地址的指针。

      NetSetTimeout函数的参数2也是一个指向函数的指针,这个函数将指向PingTimeout函数,timeHandler=f其实是调用了PingTimeout函数。这个函数内容如下:

static void
PingTimeout (void)
{
 eth_halt();
 NetState = NETLOOP_FAIL; 
}

显然PingTimeout 使CS8900停止工作,并将NetState赋值为NETLOOP_FAIL表示没有收到应答

随后将当前时间赋给timeStart,并或的时间的间隔值

这个函数:NetSetHandler (PingHandler);调用了PingHandler函数。PingHandler函数将ping的ip地址和返回的ip数据报的ip地址进行对标,如果相同则执行该语句NetState = NETLOOP_SUCCESS;

 

三、pingSend函数

这个函数不在分析,函数的功能是组建ARP请求报文并发送

这些文章仅为自己的理解,算是抛砖引玉吧,希望同各位网友多多交流,共同进步

你可能感兴趣的:(U-Boot中PING命令处理流程之一)