[U-Boot] U-Boot 소스 코드 파악

SMJ·2025년 8월 24일

BSP development

목록 보기
3/18
post-thumbnail

사용하는 보드는 Cortex-A 기반 SoC보드

1.2.1 Booting message

U-Boot 2020.07 (Mar 21 2023 - 06:04:28 +0000)  // U-boot version과 빌드 시각
//보드 스펙 sheet 사양이 나옴
MMC:   sdhci@40190000: 0   // MMC/SD 카드 컨트롤러 초기화 결과
Loading Environment from MMC... OK  //U-boot 환경변수를  SD카드에서 읽어옴
In:    serial@40700000   //표준 입력 출력 에러 장치를 UART로 설정
Out:   serial@40700000
Err:   serial@40700000
Net:   eth0: ethernet@40120000 [PRIME], eth1: ethernet@40130000
Hit any key to stop autoboot:  0 //자동 부팅 카운트다운

1.2.2 printenv

arch=arm
baudrate=115200
bmp_addr_r=0x8D200000
board=ma35d1
board_name=ma35d1
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binary=if fdt addr ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr ${fdtcontroladdr};fi;load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootaa64.efi; if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_net_usb_start=usb start
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_syslinux_conf=extlinux/extlinux.conf
boot_targets=mmc0 mmc1 ubifs0 legacy_mmc0 nand0 mtd0
bootcmd=run distro_bootcmd
bootcmd_legacy_mmc0=run mmcboot
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_mtd0=run spinandboot
bootcmd_nand0=run nandboot
bootcmd_ubifs0=devnum=0; run ubifs_boot
bootdelay=1
bootfile=Image
bootubipart=rootfs
bootubivol=rootfs
cpu=armv8
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
efi_dtb_prefixes=/ /dtb/ /dtb/current/
eth1addr=00:11:22:33:44:66
ethact=ethernet@40120000
ethaddr=00:11:22:33:44:55
ethprime=eth0
fdt_addr_r=0x85000000
fdtcontroladdr=864eead0
kernel_addr_r=0x80080000
kernelmem=248M
load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
loadaddr=0x81000000
mmc_block=mmcblk1p1
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi
mmcboot=if mmc dev 0; then echo "Booting form mmc ... ..."; setenv bootargs root=/dev/${mmc_block} rootfstype=ext4 rw rootwait console=ttyS0,115200n8 rdinit=/sbin/init mem=${kernelmem}; mmc read ${kernel_addr_r} 0x1800 0x8000; mmc read ${fdt_addr_r} 0x1600 0x80; booti ${kernel_addr_r} - ${fdt_addr_r}; fi;
nand_ubiblock=4
nandboot=if test ${mtdids} = 'nand0=nand0' ; then echo "Booting from nand ... ..."; setenv bootargs noinitrd ubi.mtd=${nand_ubiblock} root=ubi0:rootfs rootfstype=ubifs rw rootwait=1 console=ttyS0,115200n8 rdinit=/sbin/init mem=${kernelmem}; nand read ${kernel_addr_r} kernel; nand read ${fdt_addr_r} device-tree; booti ${kernel_addr_r} - ${fdt_addr_r} ; fi
pxefile_addr_r=0x85020000
ramdisk_addr_r=0x85030000
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; for prefix in ${efi_dtb_prefixes}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootaa64.efi; then echo Found EFI removable media binary efi/boot/bootaa64.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
    scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr=0x85010000
soc=nuvoton
spinand_ubiblock=9
spinandboot=if test ${mtdids} = 'spi-nand0=spi-nand0' ; then echo "Booting from spinand ... ..."; mtd list; setenv bootargs noinitrd ubi.mtd=${spinand_ubiblock} root=ubi0:rootfs rootfstype=ubifs rw rootwait=1 console=ttyS0,115200n8 rdinit=/sbin/init mem=${kernelmem}; mtd read kernel ${kernel_addr_r}; mtd read device-tree ${fdt_addr_r}; booti ${kernel_addr_r} - ${fdt_addr_r}; fi
stderr=serial@40700000
stdin=serial@40700000
stdout=serial@40700000
ubifs_boot=env exists bootubipart || env set bootubipart UBI; env exists bootubivol || env set bootubivol boot; if ubi part ${bootubipart} && ubifsmount ubi${devnum}:${bootubivol}; then devtype=ubi; run scan_dev_for_boot; fi
usb_boot=usb start; if usb dev ${devnum}; then devtype=usb; run scan_dev_for_boot_part; fi
vendor=nuvoton 
Environment size: 4547/65532 bytes

1.2.3 run bootcmd

switch to partitions #0, OK
mmc0(part 0) is current device   //booting 대상 첫번째를 (mmc0)SD카드로 설정
Scanning mmc 0:1...
MMC Device 1 not found
no mmc device at slot 1
Partition rootfs not found!   //rootFs 파티션 못찾음
switch to partitions #0, OK   //mmc0의 첫 번째 파티션으로 귀환
mmc0(part 0) is current device
Booting form mmc ... ...
#kernel image는 6144번부터 32768 블록 읽음
MMC read: dev # 0, block # 6144, count 32768 ... 32768 blocks read: OK    
//DTB를 5632번부터 128 블록 읽음
MMC read: dev # 0, block # 5632, count 128 ... 128 blocks read: OK
    ## Flattened Device Tree blob at 85000000
       Booting using the fdt blob at 0x85000000
       Loading Device Tree to 00000000864df000, end 00000000864ebf5c ... OK
Starting kernel

1. U-Boot DDR 설정 파악

<U-Boot 코드 파악>
int dram_init(void)
{
	return fdtdec_setup_mem_size_base();
}
    
// 직접 초기화 안하고 Device Tree로부터 정보 읽음
// Device Tree 안의 Memory 노드에서 시작주소(Base)와 크기(Size)를 읽음
    

<DDR 메모리 주소 크기 확인>
{   
	aliases {
		spi0 = &qspi0;
	};
    
	memory {
    	device_type = "memory";
		reg = <0x00000000 0x80000000 0 0x07000000>; /* 112M */
    		//시작 주소 0x80000000 -> 사이즈 0x07000000 (112MB)
	};
};
// DRAM Memory 사이즈 확인
<DDR 내 로드 주소 확인>
printenv loadaddr
loadaddr=0x81000000
    
printenv kernel_addr_r
kernel_addr_r=0x80080000
    
printenv fdt_addr_r
fdt_addr_r=0x85000000
    
printenv ramdisk_addr_r
ramdisk_addr_r=0x85030000
    
printenv bootcmd
bootcmd=run distro_bootcmd
profile
Embedded Junior Developer

0개의 댓글