u-boot分析三

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

继续分析,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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值