TI-Davinci Series를 다시 사용할줄을 몰랐으며, 이 오래된 모델을 대학원 교육용으로 팔기위해서 간단히 설정정리하고자 한다.
- Board Information (RAM Info)
U-Boot# bdinfo arch_number = 0x00000BBC env_t = 0x00000000 boot_params = 0x80000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x40000000 DRAM bank = 0x00000001 -> start = 0xC0000000 -> size = 0x40000000 ethaddr = d0:ff:50:af:35:52 ip_addr = 192.168.1.78 baudrate = 115200 bps
- NAND info
U-Boot# nand info Device 0: nand0, sector size 128 KiB
- Uboot default env info
U-Boot# pri bootdelay=3 baudrate=115200 autoload=yes verify=yes bootfile=uImage ramdisk_file=ramdisk.gz loadaddr=0x81000000 script_addr=0x80900000 loadbootscript=fatload mmc 0 ${script_addr} boot.scr bootscript= echo Running bootscript from MMC/SD to set the ENV...; source ${script_addr} ethaddr=d0:ff:50:af:35:52 ethact=cpsw ipaddr=192.168.219.201 serverip=192.168.219.112 bootcmd=nand read 0x81000000 0x00280000 0x300000;bootm 0x81000000 bootargs=console=ttyO0,115200n8 earlyprintk noinitrd rootwait=1 rw ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs notifyk.vpssm3_sva=0xBF900000 mem=364M@0x80000000 mem=320M@0x9FC00000 mem=1023M@0xC0000000 vmalloc=500M ip=none vram=50M ti814xfb.vram=0:24M,1:16M,2:6M
DM368 IPNC :>pri bootdelay=4 baudrate=115200 bootfile="uImage" setboot=setenv bootargs $(bootargs) broadcast=192.168.0.255 gateway=192.168.0.1 ethaddr=00:0C:0C:A0:04:22 verify=no filesize=2100000 fileaddr=82000000 netmask=255.255.255.0 ipaddr=192.168.0.207 serverip=192.168.0.210 bootcmd=nboot 0x80700000 0 0x500000;bootm 0x80700000 bootargs=mem=48M console=ttyS1,115200n8 noinitrd ip=192.168.1.168:192.168.1.210:192.168.1.1:255.255.255.0:::off rw ubi.mtd=3,2048 rootfstype=ubifs root=ubi0:rootfs cmemk.phys_start=0x83000000 cmemk.phys_end=0x88000000 cmemk.phys_start_1=0x00001000 cmemk.phys_end_1=0x00008000 cmemk.pools_1=1x28672 cmemk.allowOverlap=1 cmemk.useHeapIfPoolUnavailable=1 nohz=off highres=off clocksource=acpi_pm lpj=1077248 eth=00:0C:0C:A0:04:22 stdin=serial stdout=serial stderr=serial ver=U-Boot 1.3.4 (Jun 5 2013 - 12:45:48) DM368-IPNC-5.1.0 Environment size: 843/131068 bytes
CPSW관련
http://processors.wiki.ti.com/index.php/AM335x_CPSW_(Ethernet)_Driver's_Guide
- Uboot Config
즉 Command를 추가가능하다. 또한 Config 설정에서 각각의 프롬프트 이름을 비롯하여 default env 설정부분을 Uboot Source에서 직접 변경가능하다.
아래는 기본적인 테스트이며, 최종으로 본인의 default env 설정확정되면, Uboot Source에서 default env 관련 부분을 수정하도록 하자.
1.1. Uboot 에서 Kernel 부팅시 문제사항 정리
- U-BOOT에서 uncompressing 한 후 바로 멈춤경우
Bytes transferred = 2720236 (2981ec hex) ## Booting kernel from Legacy Image at 81000000 ... Image Name: Linux-2.6.37 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2720172 Bytes = 2.6 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ... Uncompressing Linux... done, booting the kernel.
- 기본Boot 문제해결방법 (이외방법은 아래 사이트 참조)
bootargs 설정문제 해결하기위해서 uboot에 rootwait를 추가.
printenv bootargs bootargs=console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait
세부사항은 kernel argument 참조
https://linux-sunxi.org/Kernel_arguments
- 일반적인 Boot 문제사항들 (아래사이트 확인)
http://processors.wiki.ti.com/index.php/Kernel_-_Common_Problems_Booting_Linux
bootmem 에러나서 관련내용
http://jake.dothome.co.kr/bootmem/
- U-BOOT NAND 문제사항
https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/t/244611
http://naito.tistory.com/entry/jffs2scaneraseblock-Magic-bitmask-0x1985-not-found-at-0x0000fcac-0x0b45-instead
- NXP에서 제공하고 U-Boot Quick Reference
http://www.nxp.com/files/32bit/doc/quick_ref_guide/MEDIA5200UBPG/MEDIA5200UBPG.pdf
1.2. Uboot 기본환경변수로 테스트
Uboot가 booting 한 후 Uboot의 bootdelay 설정시간이후에 Uboot의 bootcmd는 자동실행되어 Uboot의 bootargs를 kernel에 전달하여 Kernel Boot를 진행한다.
- DM368 설정 (bootcmd)
DM368 IPNC :> setenv verify no // CRC에러 DM368 IPNC :> setenv bootcmd 'nboot 0x80700000 0 0x500000;bootm 0x80700000'
- DM8147 설정(bootargs)
U-Boot# setenv bootargs_ubifsrw "console=ttyO0,115200n8 earlyprintk noinitrd rootwait=1 rw ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs notifyk.vpssm3_sva=0xBF900000 mem=364M@0x80000000 mem=320M@0x9FC00000 mem=1023M@0xC0000000 vmalloc=500M ip=none vram=50M ti814xfb.vram=0:24M,1:16M,2:6M" U-Boot# setenv bootargs_ubifsro "console=ttyO0,115200n8 earlyprintk noinitrd rootwait=1 ro ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs notifyk.vpssm3_sva=0xBF900000 mem=364M@0x80000000 mem=320M@0x9FC00000 mem=1023M@0xC0000000 vmalloc=500M ip=none vram=50M ti814xfb.vram=0:24M,1:16M,2:6M" U-Boot# setenv bootargs "${bootargs_ubifsro}" U-Boot# setenv bootargs "${bootargs_ubifsro} ${serverip}"
bootcmd 인 경우 좀 특별한데 명령어들을 자동으로 실행해주는 환경변수이므로 보다 주의해서 작성하자.
Uboot는 기본적인 Shell 처럼 간단한 Uboot Script도 작성가능하므로 이를 최대이용
- 기본적으로 다른 환경변수는 표시는다음과 같이 한다. ${ name }
- Command 구분자 ';' 세미콜론을 사용한다.
- bootcmd에는 run 명령어로 다른 환경변수를 실행가능하다.
- bootcmd에는 기본명령어인 setenv 비롯하여 uboot command가 실행가능
- 이외 외부 script 및 if 문도 사용가능
* 주의사항 setenv or set 할 경우 "" or '' 권하며, 하지 않아도 설정은 되지만 간혹 제대로 설정이 되지 스페이스문제로 설정이 안되는 경우가 발생한다.
1.3. Uboot Network/Video 기본설정
bootargs 설정을 NFS로 변경하기 위해서 아래와 같이 각각 변경을 해주고 최후에 bootargs의 root를 network로 설정
NFS설정을 위해 아래와 같이 Uboot에 Network 기본설정 아래와 같이 해준다.
- Network 환경설정 및 확인
U-Boot# set serverip 192.168.1.100 U-Boot# set ipaddr 192.168.1.39 U-Boot# set gatewayip 192.168.1.1 U-Boot# set netmask 255.255.255.0 U-Boot# set hostname "jhlee-VirtualBox" U-Boot# set nfspath "/home/jhlee/dm8148/targetfs"
DM368 IPNC :> setenv ethaddr 00:0C:0C:A0:04:22 DM368 IPNC :> setenv ipaddr 192.168.1.20 DM368 IPNC :> setenv gateway 192.168.1.1 DM368 IPNC :> setenv serverip 192.168.1.100 DM368 IPNC :> setenv netmask 255.255.255.0
- Host에서 Hostname 확인
jhlee@jhlee-VirtualBox:~/dm8148$ hostname jhlee-VirtualBox
* 주의사항
- set은 setenv와 동일 (가끔씩 set이 동작이 안될때는 setenv로 변경)
- hostname 가급적 server이름을 설정해야겠지만, 아무거나 설정해도 무방하다.
- nfs mount test는 server에서 반드시 TEST 해보자.
- DM814x Video 설정 (2G M설정)
- mem =xxx : linux memory 설정
- vpssm3
set videoset "notifyk.vpssm3_sva=0xBF900000 mem=364M@0x80000000 mem=320M@0x9FC00000 mem=1023M@0xC0000000 vmalloc=500M vram=50M ti814xfb.vram=0:24M,1:16M,2:6M"
- 기본설정확인 (Start 0x80000000 : Size : 512M or 1024M or 2048M)
- 현재 2GM사용하지만, 512M와 1024M 만 지원 (1024 Memory Map 선택)
- 0xC0000000 이후 부터 Linux로 모두 할당
- Memory를 연속적으로 설정하지 않았기때문에, 이부분 설정을 따로 해야할 것 같다.
http://lxr.linux.no/linux/mm/Kconfig
1.4 Uboot의 bootargs 와 bootcmd
- UBIFS 와 NFS Boot Mode (bootargs의 분할)
- bootargs를 여러개 옵션으로 분할
U-Boot# set bootarg_consol "console=ttyO0,115200n8" U-Boot# set bootarg_debug "earlyprintk rootwait=1" U-Boot# set bootarg_etc "noinitrd" U-Boot# set bootarg_ubifsro "ro ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs" U-Boot# set bootarg_ubifsrw "rw ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs" U-Boot# set bootarg_nfs "rw root=/dev/nfs nfsroot=${serverip}:${nfspath},nolock" U-Boot# set bootarg_net "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off" U-Boot# set bootarg_netnone "ip=none"
- bootargs를 조합하여 설정진행
U-Boot# setenv args_nfs 'setenv bootargs ${bootarg_consol} ${bootarg_debug} ${bootarg_etc} ${bootarg_nfs} ${bootarg_net} ${videoset}' U-Boot# setenv args_ubiro 'setenv bootargs ${bootarg_consol} ${bootarg_debug} ${bootarg_etc} ${bootarg_ubifsro} ${bootarg_netnone} ${videoset}' U-Boot# setenv args_ubirw 'setenv bootargs ${bootarg_consol} ${bootarg_debug} ${bootarg_etc} ${bootarg_ubifsrw} ${bootarg_netnone} ${videoset}'
- bootargs를 UBIFS로 직접설정
DM368 IPNC :> setenv bootargs mem=48M console=ttyS1,115200n8 noinitrd ip=192.168.1.168:192.168.1.210:192.168.1.1:255.255.255.0:::off rw ubi.mtd=3,2048 rootfstype=ubifs root=ubi0:rootfs cmemk.phys_start=0x83000000 cmemk.phys_end=0x88000000 cmemk.phys_start_1=0x00001000 cmemk.phys_end_1=0x00008000 cmemk.pools_1=1x28672 cmemk.allowOverlap=1 cmemk.useHeapIfPoolUnavailable=1 nohz=off highres=off clocksource=acpi_pm lpj=1077248 eth=00:0C:0C:A0:04:22
- bootargs를 NFS로 직접설정
- nfsrootdebug: nfs debug 가능
- rootdelay=4: filesystem mount 시점을 조절가능
- earlyprintk: KERNEL 의 CONFIG_EARLY_PRINTK=y 설정후 가능
- quiet: 에러 이외의 메세지를 보고 싶지 않다면 사용
DM368 IPNC :> setenv bootargs 'console=ttyS1,115200n8 rw mem=48M root=/dev/nfs nfsrootdebug rootdelay=4 nfsroot=192.168.1.100:/home/jhlee/dm368/mt5/Source/ipnc_rdk/target/filesys_dm368,nolock mem=48M cmemk.phys_start="0x83000000" cmemk.phys_end="0x88000000" cmemk.phys_start_1="0x00001000" cmemk.phys_end_1="0x00008000" cmemk.pools_1="1x28672" cmemk.allowOverlap=1 eth=00:0C:0C:A0:04:22 ip=192.168.1.168 nohz=off highres=off clocksource=acpi_pm lpj=1077248 earlyprintk'
NFS Boot Mode
https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
Kernel Argument (bootargs)
https://www.kernel.org/doc/Documentation/kernel-parameters.txt
- bootcmd의 분할과 bootargs 설정
- dhcp : dhcp client로 동작 tftp로 uImage가져온다.
- autoload: dhcp에서 자동으로 tftp로 uImage 가져오는 작업을 막는다.
- loadaddr: tftp 할 경우 loadaddr주소
- tftp or tftpboot: tftp로 data를 가져온다.
아래와 같이 다양한 bootcmd를 지원가능하도록 분할하여 쉽게 구성하도록하자
U-Boot# set autoload no U-Boot# set loadaddr 0x81000000 U-Boot# set bootcmd_nfs1 'dhcp;run args_nfs; tftp uImage-dm814x-evm.bin;bootm' U-Boot# set bootcmd_nfs2 'dhcp;run args_nfs; tftp 0x81000000 uImage;bootm' U-Boot# set bootcmd_nfs3 "dhcp;run args_nfs; tftpboot uImage-dm814x-evm.bin;bootm" U-Boot# set bootcmd_nfs 'run args_nfs; tftp uImage;bootm' U-Boot# set bootcmd_ubi "run args_ubirw;nand read 0x81000000 0x00280000 0x300000;bootm 0x81000000" U-Boot# set bootcmd_ubi_me 'run args_ubirw; tftp uImage;bootm'
- bootcmd의 NFS/UBI_ME/UBI 설정
U-Boot# set bootcmd "run bootcmd_nfs" U-Boot# set bootcmd "run bootcmd_ubi_me" U-Boot# set bootcmd "run bootcmd_ubi"
- U-BOOT의 환경변수 설명 (반드시 확인)
http://www.denx.de/wiki/view/DULG/UBootEnvVariables
- U-BOOT NFS 환경설정
http://www.denx.de/wiki/publish/DULG/to-delete/LinuxNfsRoot.html
2. Board 의 정보파악 후 검증
- Memory info
이 정보가 잘못되었다면, datasheet를 이용하여 파악하자. (Memory Map)
- NAND info
제대로 동작한다면, Kernel에서 mtd에서 알려준다.
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xcc (Micron ) Creating 5 MTD partitions on "omap2-nand.0": 0x000000000000-0x000000020000 : "U-Boot-min" 0x000000020000-0x000000260000 : "U-Boot" 0x000000260000-0x000000280000 : "U-Boot Env" 0x000000280000-0x0000006c0000 : "Kernel" 0x0000006c0000-0x000020000000 : "File System" Kernel command line: console=ttyO0,115200n8 earlyprintk noinitrd rootwait=1 rw ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs notifyk.vpssm3_sva=0xBF900000 mem=364M@0x80000000 mem=320M@0x9FC00000 mem=1023M@0xC0000000 vmalloc=500M ip=none vram=50M ti814xfb.vram=0:24M,1:16M,2:6M nand page size : 2048
- 기본검증방법
본인은 1G Memory이며, 0x8000 0000 : DDR START ADDR
0x4000 0000 : 1 G
0x81000000 부터 U-BOOT Application을 사용가능하다고, U-BOOT msg에서 파악.
0xA0000000 Size : 0x20000000 : 256M
위의 nand address를 파악해서 이제 검증시작하자.
https://processors.wiki.ti.com/index.php/Booting_Linux_kernel_using_U-Boot
2.1 Uboot의 Memory TEST
Uboot에서 사용해보니, 너무느리며, 비효율적이다. 만약 시간이 많다면, 사용하고, 시간이 없다면, tftpboot kernel을 이용하여 DRAM을 검증하자.
그리고, NFS System도 같이 이용한다면 더욱 좋을 것 같다.
- Uboot의 memory test
U-Boot# mtest 0x81000000 U-Boot# mtest 0x81000000 0x82000000
2.2 Uboot의 NAND TEST
NAND의 Test의 목적은 bad block문제로 인하여 nand boot가 제대로 안되는 것인지 파악하고, NAND의 read/write가 제대로 동작이 되는지를 확인하는 것이다.
일단 nand info를 통해 nand 기본정보를 파악하고, bad block이 scrub 이 되었는지 확인해보자.
nand bad를 해보면 bad block 정보를 읽어 표시해준다.
nand createbbt 명령어가 없을 경우 최근 version uboot는 이 명령어가 사라져 버리고 자동으로 scan해서 만들어 버리는 것 같다.
Uboot version마다 다를수 있으므로, 주의하자
2.3 NAND Image 기본검증
일단 tftpboot를 통해서 kernel의 Image 검증한 후 각각의 NAND Read/Write를 하여 문제없는지 확인하자.
- TFTPBOOT TEST
DM368 IPNC :> tftpboot 0x80007FC0 dm368ipnc/uImage_ipnc_dm368 DM368 IPNC :> bootm 0x80007FC0;
- How To update KERNEL & Filesystem
DM368 IPNC :> tftpboot 0x80700000 dm368ipnc/uImage_ipnc_dm368 DM368 IPNC :> tftpboot 0x82000000 dm368ipnc/ipnc_dm368_ubifs DM368 IPNC :> nand erase 0x500000 0x400000 // NAND ERASE 4MB DM368 IPNC :> nand write 0x80700000 0x500000 0x400000 // KERNEL WRITE 4MB DM368 IPNC :> nand erase 0x900000 0x2800000 //NAND ERASE 4MB DM368 IPNC :> nand write 0x82000000 0x900000 0x2800000 //FS WRITE 40MB
- NAND Image 검증
DM368 IPNC :> tftpboot 0x80700000 dm368ipnc/uImage_ipnc_dm368 DM368 IPNC :> nand read 0x82000000 0x500000 0x400000 // KERNEL READ 4MB DM368 IPNC :> cmp 0x80700000 0x82000000 0x38a420 // check tftpboot
상위와 동일함
U-Boot# tftp 0x81000000 uImage
Bytes transferred = 2215324 (21cd9c hex)
U-Boot# nand read 0xA0000000 0x280000 0x21cd9c
// 553831 = 2215324/4 bytes
U-Boot# cmp 0x81000000 0xA0000000 553831
U-Boot# cmp.l 0x81000000 0xA0000000 553831
word at 0x8121cd9c (0x605f9029) != word at 0x8221cd9c (0xffffffff)
Total of 553831 words were the same