继续分析,u-boot怎么实现从网页加载固件实现web升级呢!是嵌入式了uip小型web服务器,可以参看manfeel的博文,在u-boot上移植uip的过程:
https://blog.youkuaiyun.com/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;
break;
} el

本文深入探讨了U-Boot如何通过集成uIP小型Web服务器实现网络固件升级。在U-Boot初始化后,它进入循环,等待网络设备初始化并启动HTTP服务。通过一系列函数调用,如`httpd_init`和`uip_server_init`,配置端口80并启动服务器。当接收到数据时,固件通过TFTP传输并经过验证,最终使用U-Boot命令进行擦除和写入操作完成升级。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



