Openwrt-Uboot

上电UBOOT启动过程

  1. sdk\airoha\an75xx\tclinux_phoenix\bootloader\Uboot\u-boot-2014.04-rc1\arch\arm\cpu\armv8\start.S中调用bl _main跳转到
  2. sdk\airoha\an75xx\tclinux_phoenix\bootloader\Uboot\u-boot-2014.04-rc1\arch\arm\lib\crt0.S _main
    _main的执行顺序是:
  • 设置调用board_init_f()的初始环境。这个环境只提供一个栈和一个存储GD(全局数据)结构的位置,两者都位于一些易于获取的RAM(SRAM,锁定缓存…)中。在这种情况下,变量的全局数据,无论是否初始化(BSS),都是不可用的;只有常量初始化的数据是可用的。
  • 调用board_init_f()。这个函数准备硬件以便从系统RAM(DRAM,DDR…)中执行。由于系统RAM可能还不可用,board_init_f()必须使用当前的GD来存储任何必须传递到后续阶段的数据。这些数据包括重定位目的地、未来的栈以及未来的GD位置。

(以下仅适用于非SPL构建)

  • 设置中间环境,其中栈和GD是由board_init_f()在系统RAM中分配的,但BSS和已初始化的非const数据仍然不可用。
  • 调用relocate_code()。这个函数将U-Boot从其当前位置重定位到board_init_f()计算出的重定位目的地RAM中。
  • 设置调用board_init_r()的最终环境。这个环境有BSS(初始化为0)、已初始化的非const数据(初始化为预期值)和系统RAM中的栈。GD保留了board_init_f()设置的值。一些CPU在这一点上还有一些关于内存的工作要做,所以调用c_runtime_cpu_setup。
  • 分支到board_init_r()

按键打断Uboot:
在这里插入图片描述
输入账号密码登录:uboot串口登录:telecomadmin/nE7jA%5m
打印bootcmd命令:
在这里插入图片描述
flash imgread 命令源码:common/ecnt/cmd_flash.c
bootm 命令源码:common/cmd_bootm.c
命令解析:flash imgread c0000 2048;bootm
使用flash 的 imgread命令,读取c0000地址的2048长度内容

common\board_r.c 中的initr_net()调用
net\eth.c中的eth_initialize()继续调用
board\ecnt\an7581_evb\an7581_evb.c中的board_eth_init()继续调用
drivers\misc\ecnt\net\ecnt_eth.c中的ecnt_eth_initialize()

gpio.c

文件作用:

  • sky_init()初始化:
		sky_init_gpios();      //初始化gpio并打开led_power灯
		sky_set_board_args(g_sky_vid);      //设置board_args参数;打印 sky_set_board_args:env board_args ...
		sky_set_serdes_ethernet(g_sky_vid);  //设置serdes_ethernet;打印 sky_set_serdes_ethernet:env serdes_ethernet diff ...
		sky_set_serdes_usb1(g_sky_vid);       //设置serdes_usb1参数;打印 sky_set_serdes_usb1
		sky_set_serdes_usb2(g_sky_vid);       //设置serdes_usb1参数;打印 sky_set_serdes_usb2
		sky_set_fw_port(g_sky_vid);
		sky_set_en8811phy_addr(g_sky_vid);
  • 组播升级函数multiupgrade_blink() 供time.c调用

time.c

提供time_init()作为bord_init_r的初始化,其中irq_register()注册中断,中断相应函数是gpio.c中的中的组播升级函数multiupgrade_blink()

ecnt_eth.c

  • gpio.c中的组播升级函数multiupgrade_blink()最终是调用/ecnt_eht.c中tc3162_eth_send()函数发送数据包。
  • ecnt_eth_initialize()函数被调用初始化以太网设备。创建以太网设备,设备的初始化函数设置为ecnt_eth_init:进行一系列初始化工作,包括DMA初始化qdma_init,skbuffer初始化skb_init,调用ecnt_eth_check_serdes_pon()检查在哪里初始化lan口,调用drivers\net\phy\phy.c中phy_connect()函数连接以太网设备和phy设备;
  • ecnt_eth_recv()->qdma_bm_receive_packets()和ecnt_eth_send()->qdma_bm_transmit_packet()函数,发送和接受以太网数据包;
  • tc3162_eth_send()调用ecnt_eth_check_serdes()检查串口,qdma_bm_transmit_packet()发送数据包。
  • qdma_init() DMA相关初始化过程。

其中ecnt_eth_init()函数注册:mac中断mac_interrupt()函数->qdma_bm_receive_packets()->ip_rcv_packet()继续调用:
multiupgrade.c\multiupgrade_process(skb, mac)进行组播升级。

以太网设备与phy绑定流程

  1. ecnt_eth_init()函数调用drivers\net\pht\phy.c中
    phy_connect()函数进行以太网设备和phy设备绑定;
  2. 继续调用phy_find_by_mask()找到可用phy设备或创建phydev;
  3. 继续调用get_pht_device_by_mask()继续调用search_for_existing_phy,搜索已有phy设备,没有则调用create_phy_by_mask()构造phy设备,其中,搜索设备从mii_dev* bus->phymap[addr]中找到设备,设备来自phy_init()构造的phy_device;
  4. 继续调用phy_device_create()进行phy设备创建并执行phy_probe()初始化。
  5. 回到第二步,执行phy_connect_dev()进行以太网设备和phy设备关联,即phy_device->dev = eth_device

组播升级调用流程:

  1. time.c中time_init()函数调用->irq_register()函数注册中断,设置回调函数timer_interrupt;
  2. 中断timer_interrupt()调用->组播升级函数gpio.c中multiupgrade_blink()继续调用->
  3. multiupgrade.c中ip_send_upgrade_success()函数继续调用->
    ecnt_eth.c中tc3162_eth_send()函数发送组播数据包。

multiupgrade.c组播升级

  • 变量finishMultiUpgrade、参数ip_send_upgrade_success()函数被gpio.c的组播升级函数multiupgrade_blink()调用。
    组播升级流程:
  1. ecnt_eth.c文件中ecnt_eth_init()函数注册mac中断mac_interrupt()函数->qdma_bm_receive_packets()->ip_rcv_packet()继续调用:
  2. multiupgrade.c中multiupgrade_process(skb, mac)设置led初始化,继续调用MultiUpgradeHandle(skb)->MultiWriteImage()写入Image->
  3. 分别调用multiupgrade_update_tcboot()、multiupgrade_update_tclinux()等进行写入升级 ->
  4. multiupgrade_update_image(from, to, datalen)->flash_write()进行实际写入

tcswitch.c

eth_phy_init()函数被ecnt_eth.c中ecnt_eth_init()调用,初始化以太网物理设备。
mtEMiiRegWrite()函数

skbuffer.c

  • skb_init()函数被ecnt_eth.c中ecnt_eth_init()调用,初始化buffer。

ecnt_hsgmii_phy.c

主要函数:serdes_phy_init() 没用上

ecnt_eth_phy.c

serdes_phy_init()(4853行)对串口phy初始化,被ecnt_eth.c中ecnt_eth_init()调用。

flash\flashhal.c、spi_nand_flash.c

board_init_r()调用flash\flashhal.c 中的 flash_init()继续调用->
spi_nand_flash.c中的nandflash_init()->SPI_NAND_Flash_Init()
调用nand_probe_init()设置nand_probe=spi_nand_probe,执行nand_probe()函数。

image\ecnt_mtd.c

ecnt_parse_cmdline_partitions()被board_init_r()调用,解析命令行。
board_init_r()->
image\ecnt_mtd.c 中 ecnt_parse_cmdline_partitions()->>__ecnt_parse_cmdline_partitions()->>ecnt_mtdpart_setup();ecnt_set_kernel_rootfs_part()

bootargs\ecnt_bootargs.c

生成sdtopenwrt\sdk\airoha\an75xx\airoha_feeds\target\linux\airoha\an7581\mi.conf文件给kernel传参

bootargs\enct_bootargs.c

调用bootargs_init( )函数生成sdtopenwrt\sdk\airoha\an75xx\airoha_feeds\target\linux\airoha\an7581mi.conf文件传参给kernel

image\ecnt_mdt.c

ecnt_mdt.c中 ecnt_parse_cmdline_partitions()被board_init_r调用。
ecnt_mdt.c调用ecnt_image.c中函数

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值