继续分析,u-boot怎么实现从网页加载固件实现web升级呢!是嵌入式了uip小型web服务器,可以参看manfeel的博文,在u-boot上移植uip的过程:
https://blog.csdn.net/manfeel/article/details/13096075
现分析u-boot_mod中的httpd的代码:
u-boot上电初始化之后,进入board_init_r
,如果想要通过web加载内核镜像,则需要初始化网络设备,在初始化完成后进入main_loop
循环中:
#if defined(CONFIG_CMD_NET)
all_led_on();
eth_initialize(gd->bd);
all_led_off();
#endif
/* main_loop() can return to retry autoboot, if so just run it again */
for (;;)
main_loop();
在main_loop
,没有u-boot命令执行,则加载网络循环NetLoopHttpd();
:
#if defined(CONFIG_CMD_HTTPD)
puts(" Starting web server for update...\n\n");
NetLoopHttpd();
#else
puts("\n");
#endif
NetLoopHttpd()
函数,对网络进行初始化,加入uip web服务器,连接终端:
/* *************************************
*
* HTTP web server for web failsafe mode
*
***************************************/
int NetLoopHttpd(void){
bd_t *bd = gd->bd;
unsigned short int ip[2];
unsigned char ethinit_attempt = 0;
struct uip_eth_addr eaddr;
#ifdef CONFIG_NET_MULTI
NetRestarted = 0;
NetDevExists = 0;
#endif
/* XXX problem with bss workaround */
//初始化网络参数
NetArpWaitPacketMAC = NULL;
NetArpWaitTxPacket = NULL;
NetArpWaitPacketIP = 0;
NetArpWaitReplyIP = 0;
NetArpWaitTxPacket = NULL;
NetTxPacket = NULL;
if(!NetTxPacket){
int i;
// Setup packet buffers, aligned correctly.
NetTxPacket = &PktBuf[0] + (PKTALIGN - 1);
NetTxPacket -= (ulong)NetTxPacket % PKTALIGN;
for(i = 0; i < PKTBUFSRX; i++){
NetRxPackets[i] = NetTxPacket + (i + 1) * PKTSIZE_ALIGN;
}
}
if(!NetArpWaitTxPacket){
NetArpWaitTxPacket = &NetArpWaitPacketBuf[0] + (PKTALIGN - 1);
NetArpWaitTxPacket -= (ulong)NetArpWaitTxPacket % PKTALIGN;
NetArpWaitTxPacketSize = 0;
}
// restart label
restart:
eth_halt();
#ifdef CONFIG_NET_MULTI
eth_set_current();
#endif
// eth_init初始化网络设备
while(ethinit_attempt < 10){
if(eth_init(bd)){
ethinit_attempt = 0