一.背景
LS1021ATWR开发板运行官方的openwrt系统
二.日志分析
2.1 linux相关日志
root@OpenWrt:/# reboot 重启
root@OpenWrt:/# [ 2324.325719] device eth0 left promiscuous mode 网卡eth0离开混杂模式
[ 2324.330172] br-lan: port 1(eth0) entered disabled state 网卡eth0进入禁用状态
[ 2324.346789] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready 网卡eth0没有准备好(eth0已被设置成禁用状态,那当然就没准备好咯,个人理解,后期要验证正确性)
[ 2328.827364] kvm: exiting hardware virtualization 退出kvm的硬件虚拟化
[ 2328.832026] sd 0:0:0:0: [sda] Synchronizing SCSI cache 同步scsi缓存,也就是在重启之前保存数据,以免数据丢失
[ 2328.839657] imx2-wdt 2ad0000.watchdog: Device shutdown: Expect reboot! 设备关闭,看门狗期待重启
[ 2328.886907] reboot: Restarting system 重启系统
2.2 uboot相关日志
U-Boot 2016.092.0+g199df35 (Nov 20 2016 - 12:55:53 +0800)
CPU: Freescale LayerScape LS1021E, Version: 2.0, (0x87081120) CPU为飞思卡尔的layerscape LS1021E芯片,不是LS1021A吗? print_cpuinfo(),arch/arm/cpu/armv7/ls1021xa/cpu.c,CONFIG_DISPLAY_CPUINFO,涉及到系统版本寄存器SVR(system version register),从寄存器中读取了various personality字段,字段中的值为0x11,表示LS1021A 芯片,E表示带有安全模块的LS1021A芯片
Clock Configuration:
CPU0(ARMV7):1000 MHz, CPU0的频率被配置为1000MHz,那么CPU1怎么没被配置,难道并没有使用它?需要确认 ,print_cpuinfo()
Bus:300 MHz, DDR:800 MHz (1600 MT/s data rate), 总线频率为300MHz,DDR频率为800MHz,1600 MT/s表示每秒1600兆次数据传输,反映单位时间内的传输速度,T表示Times,为什么是1600,因为HT是双向传输,所以除以2就是单向传输的速率,也就是频率800MHz,HT表示端到端总线技术,即HyperTransport print_cpuinfo()
Reset Configuration Word (RCW): 重置配置字,是芯片复位之后在程序执行过程中需要使用到的硬件配置信息,包括系统时钟、DDR时钟、serdes配置、启动方式、GPIO复用配置等,RCW存储在flash或sd卡的何处呢?这个需要查看芯片手册中的Starting Address,print_cpuinfo(),以下是RCW状态寄存器的信息,一共有16个这样的寄存器,一个寄存器4个字节,那么16个这样的寄存器就是4*16*8 = 512 bit
00000000: 0608000a 00000000 00000000 00000000
00000010: 30000000 00007900 e0025a00 21046000
00000020: 00000000 00000000 00000000 18000000
00000030: 00080000 481b7340 00000000 00000000
Model: LS1021A TWR Board 型号为LS1021A TWR Board ,这个值是从device tree中获得,show_board_info(),获取的标记为model;
Board: LS1021ATWR 板子为LS1021ATWR checkboard(),board/freescale/ls1021/atwr/ls1021atwr.c
CPLD: V3.0 复杂可编程逻辑器件(Complex Programmable Logic Device),cpld_show(),board/freescale/ls1021/atwr/ls1021atwr.c
PCBA: V2.0 指已经在PCB空板上贴片好所有元器件的板子(PCB Assembly), cpld_show()
VBank: 0 vbank是一个寄存器名字,属于CPLD上的寄存器,用来表明选择的是flash的哪个bank,此处选择的是bank0,寄存器的bit[0]来表示bank的范围,因此此bit只有两个值,0表示从bank0(upper bank)启动,1表示从bank1(lower bank)启动, cpld_show()
I2C: ready I2C准备妥当(Inter-Integrated Circuit) ,init_func_i2c(),common/board_f.c,初始化i2c,该函数被填充到init_sequence_f数组中
DRAM: 1 GiB 内存为1GiB(Dynamic Random Access Memory) dram_init(),board/freescale/ls1021atwr/ls1021atwr.c,“DRAM:“由announce_dram_init()输出, show_dram_config()输出内存大小,common/board_f.c
Using SERDES1 Protocol: 48 (0x30) 使用SERDES1协议,是一种时分多路复用(TDM:Time Division Multiplexing)、点对点(P2P:Point to Point)的串行通信技术,(Serializer/Deserializer串行器解串器),serdes_init(),arch/arm/cpu/armv7/fsl_lsl_serdes.c,0x30从LS1021ARM.pdf中可以得知其表明支持的网络协议为:PCIe1(x1)、SATA1、SGMII1、SGMII2
Firmware 'Microcode version 0.0.1 for LS1021a r1.0' for 1021 V1.0 固件,u_qe_upload_firmware(),drivers/qe/qe.c 上传微代码到指令RAM的指定地址,详情查看docs/README.qe_firmware中针对QE微代码上传的信息;
QE: uploading microcode 'Microcode for LS1021a r1.0' version 0.0.1 上传微代码?什么意思?需要确认(QUICC Engine),qe_upload_microcode(),drivers/qe/qe.c,属于qe_upload_firmware中的worker函数,实际做的就是上传微代码;
Flash: 128 MiB flash大小为128MiB,这个远程开发板上还插着一个320GiB的硬盘
MMC: FSL_SDHC: 0 插着一个容量为16GiB的sd卡,实际容量14.5 GiB
EEPROM: NXID v16777216 具有一个eeprom ,mac_read_from_eeprom(),board/freescale/common/sys_eeprom.c,此函数在init_sequence_r数组中
In: serial 串口输入 console_init_r(),common/board_r.c->stdio_print_current_devices(),common/console.c,
Out: serial 串口输出
Err: serial 错误也由串口输出
SEC0: RNG instantiated RNG实例化了,SEC0是安全相关的硬件模块(SEC:security,RNG:Random Number Generators,随机数生成器),misc_init_r(),board/freescale/ls1021atwr/ls1021atwr.c->sec_init(),board/freescale/ls1021atwr/ls1021atwr.c
Target spinup took 0 ms. ahci_host_init(),drivers/ata/ahci.c,驱动提供scsi接口给sata
AHCI 0001.0300 1 slots 1 ports ? Gbps 0x1 impl SATA mode 1个sata插槽,1个接口,多少Gbps,1次impl,SATA 模式,ahci_print_info(),drivers/ata/ahci.c,(AHCI:Advanced Host Controller Interface)
flags: 64bit ncq pm clo only pmp fbss pio slum part ccc 当前硬盘具有什么样的能力
Found 1 device(s). 找到一个硬盘,scsi_scan(),drivers/scsi/scsi.c
SCSI: Net: eTSEC1 is in sgmii mode. “SCSI:”由Initr_scsi()输出,drivers/scsi/scsi.c;”Net:” 由initr_net输出,common/board_r.c->eth_initialize(),net/eth_legacy.c
eTSEC2 is in sgmii mode. eth_initialize(),net/eth-legacy.c ->board_eth_init(),board/freescale/ls1021atwr/ls1021atwr.c
PCIe0: pcie@3400000 Root Complex: x1 gen1 ls_pcie_probe(),drivers/pci/pcie_layerscape.c,这里共分两个地方打印,第一次打印”PCIe0: pcie@3400000 Root Complex”,第二次打印”:x1 gen1”,表示一路PCIe,第一代速度
PCIe1: pcie@3500000 disabled ls_pcie_probe(),PCIe1被禁止
e1000: 00:15:17:80:ae:56 pci_eth_init(),include/netdev.h->e1000_initialize(),drivers/net/e1000.c->e1000_init_one
eTSEC1, eTSEC2, eTSEC3, e1000#0 [PRIME] eth_initialize(),net/eth_legacy.c,”e1000#0”是在e1000_name()中生成的,drivers/net/e1000.c
Hit any key to stop autoboot: 0 run_main_loop(),common/board_r.c->main_loop(),common/main.c->bootdelay_process(),common/autoboot.c->menu_show()->bootmenu_show()->bootmenu_choice_entry()->bootmenu_autoboot_loop(),cmd/bootmenu.c,run_main_loop()函数被放在init_sequence_r数组中
Now switch to boot from flash bank 1. flash_bank_cmd(),board/freescale/ls1021atwr/ls1021atwr.c->convert_flash_bank(),board_freescale/ls1021atwr/ls1021atwr.c
Reset board to enabl