By : Lutfi Rozaqi
U-Boot
U-Boot
U-Boot adalah bootloader yang berbasis dari PPCBoot and
ARMBoot.
U-Boot merupakan bootloader untuk target sistem yang
fleksibe disebabkan dapat melakukan :
booting kernel menggunakan BOOTP/DHCP, TFTP, dan NFS
booting kernel menggunakan RAM Disk
booting kernel dari CompactFlash
$ cp System.map ${PRJROOT}/images/u-boot.System.map-0.2.0
$ cp u-boot.bin ${PRJROOT}/images/u-boot.bin-0.2.0
$ cp u-boot.srec ${PRJROOT}/images/u-boot.srec-0.2.0
Bila anda ingin debug U-Boot, copy juga ELF binary dengan perintah :
$ cp u-boot ${PRJROOT}/images/u-boot-0.2.0
Lalu install host tool yang dihasilkan oleh build U-Boot dengan perintah :
$ cp tools/mkimage ${PREFIX}/bin
3. MENGGUNAKAN ENVIRONMENT
VARIABLE DARI U-BOOT
Setelah U-Boot bekerja, anda dapat mengkonfigurasinya dengan men-setting
environment variable yang tepat. Untuk melihat value dari environment variable
gunakan perintah printenv. Berikut contoh variabel environment :
=> printenv
bootdelay=5
baudrate=115200
loads_echo=1
serial#= ...
ethaddr=00:D0:93:00:05:E3
netmask=255.255.255.0
ipaddr=192.168.172.10
serverip=192.168.172.50
clocks_in_mhz=1
stdin=serial
stdout=serial
stderr=serial
Environment size: 791/16380 bytes
Berikut adalah contoh perintah untuk add beberapa environment variable ke control
module :
=> setenv rootpath /home/karim/ctrl-rootfs
=> setenv kernel_addr 40100000
=> setenv nfscmd setenv bootargs root=/dev/nfs rw
nfsroot=\$(serverip):\$(rootpath)
ip=\$(ipaddr):\$(serverip):\$(gatewayip):\$(netmask)
:\$(hostname) ::off panic=1\;bootm \$(kernel_addr)
=> setenv bootcmd run nfscmd
Dalam contoh ini, U-Boot di-setting untuk boot kernel pada alamat 0x40100000 dan
mount target sistem rootfilesystem menggunakan NFS. Berikut bagaimana contoh
bagaimana nfscmd seteleh dibaca oleh U-Boot :
=> printenv nfscmd
nfs2cmd=setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$
(rootpath)ip=$(ipaddr):$(serverip)
:$(gatewayip):$(netmask):$(hostname)::off panic=1;bootm $
(kernel_addr)
Agar setting-an variabel environment tetap ada, maka environment variable harus disave pada flash. Berikut perintah yang digunakan dan contoh hasil proses perintah :
=> saveenv
Saving Enviroment to Flash...
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
Apabila ingin menghapus variabel, gunakan command setenv pada variabel tanpa
menyediakan value. Berikut contohnya :
=> setenv RAMDisk_addr 40500000
=> printenv RAMDisk_addr
RAMDisk_addr=40500000
=> setenv RAMDisk_addr
=> printenv RAMDisk_addr
## Error: "RAMDisk_addr" not defined
OTHER_BOOT_SCRIPT
Script adalah fitur dari U-Boot yang sangat berguna dan anda harus menggunakannya
ketika anda ingin menjalankan beberapa task di U-Boot secara otomatis.
RAM disk image dapat diproses dengan cara yang sama, berikut contohnya :
$ mkimage -n 'RAM disk' \
> -A ppc -O linux -T ramdisk -C gzip \
> -d initrd.bin initrd.boot
Image Name:
RAM disk
Created:
Wed Feb 5 14:20:35 2003
Image Type:
PowerPC Linux RAMDisk Image (gzip compressed)
Data Size:
470488 Bytes = 459.46 kB = 0.45 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Kita juga dapat membuat multi-type image yang menggabungkan kernel image dan
RAM disk. Dalam hal ini, file-file yang dimasukkan harus di-list secara bersamaan
menggunakan colon separator, berikut contohnya :
$ mkimage -n '2.4.18 Ctrl and Initrd' \
> -A ppc -O linux -T multi -C gzip -a 00000000 -e 00000000 \
> -d vmlinux-2.4.18.gz:initrd.bin \
> vmlinux-2.4.18-initrd.img
Image Name:
2.4.18 Ctrl and Initrd
Created:
Wed Feb 5 14:23:29 2003
Image Type:
PowerPC Linux Multi-File Image (gzip compressed)
Data Size:
1001292 Bytes = 977.82 kB = 0.95 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0:
530790 Bytes = 518 kB = 0 MB
Image 1:
470488 Bytes = 459 kB = 0 MB
Setelah menyiapkan image dengan mkimage, image siap digunakan oleh U-Boot dan
dapat di-download ke target.
Command bootp menghasilkan request yang disahut oleh server DHCP. Menggunakan
sahutan dari server DHCP, U-Boot mengkontak server TFTP dan memperoleh file image
vmlinux-2.4.18.img yang diletakkan pada alamat 0x00100000 di RAM. Anda dapat
memeriksa informasi header image menggunakkan command iminfo, berikut
contohnya :
=> imi 00100000
## Checking Image at 00100000 ...
Image Name:
2.4.18 Control Module
Created:
2003-02-05 19:19:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
530790 Bytes = 518.3 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Seperti yang terterea pada contoh di atas, informasi yang dicetak oleh iminfo pada target
sama dengan yang dicetak mkinfo pada host. String ok menyatakan bahwa image telah
di-download dan kita dapat mem-boot-nya , berikut contohnya :
=> bootm 00100000
## Booting image at 00100000 ...
Image Name:
2.4.18 Control Module
Created:
2003-02-05 19:19:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
530790 Bytes = 518.3 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
Linux version 2.4.18 (karim@Teotihuacan) (gcc version 2.95.3 20010315
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/nfs rw nfsroot= ...
Decrementer Frequency: 5000000
Calibrating delay loop... 79.66 BogoMIPS
...
VFS: Cannot open root device "" or 02:00
Please append a correct "root=" boot option
Kernel panic: VFS: Unable to mount root fs on 02:00
<0>Rebooting in 180 seconds..
...
Dalam hal ini kernel panic terjadi disebabkan karena tidak dapat menemukan root
filesystem. Untuk menyelesaikan masalah ini, kita harus menggunakan variabel
environment untuk membuat boot script untuk memberikan boot option yang tepat ke
kernel. Berikut contohnya :
=> setenv bootpnfs bootp\; setenv kernel_addr 00100000\;
run nfscmd
=> printenv bootpnfs
bootpnfs=bootp; setenv kernel_addr 00100000; run nfscmd
=> setenv bootcmd run bootpnfs
=> printenv bootcmd
bootcmd=run bootpnfs
Apabila anda menggunakan command boot sekarang, U-Boot akan boot seluruhnya dari
network. U-Boot akan download kernel melalui TFTP dan mount root filesystem pada
NFS. Apabila anda ingin save variabel environment yang baru di-set, gunakan
command saveenv sebelum reboot sistem, blia tidak melakukannya maka anda harus
set ulang variabel yang sama pada reboot selanjutnya.
Di samping tftpboot, anda juga dapat menggunakan command loadb untuk download image ke
target, berikut contohnya :
=loadb 00100000
## Ready for binary (kermit) download ...
>
Pada step ini, U-Boot tertunda dan anda harus menggunakan terminal emulator ke host untuk
mengirim image file ke target. Dalam hal ini, U-Boot diharapkan untuk download data tergantung
oleh kermit binary protocol, dan anda harus mengguanklan kermit untuk download binary image ke
U-Boot. Setelah proses transfer selesai, U-Boot akan menghasilkan :
## Total Size
## Start Addr
Selain itu, daripada anda harus download image dulu ke RAM menggunakkan tftpboot
ataun loadb lalu meng-copy ke flash, anda dapat download image secara langsung
menggunakan loads. Dalam hal ini, host mengirim image ke target dalam format SRecord. Tetapi dibandingkan kedua metode di atas, men-download S-Record file sangat
lambat. Untuk download file S-Record, anda membutuhkan cu terminal emulator untuk
transfer ke target, karena terminal emulator lain tidak cocok dengan U-Boot ketika
download file jenis ini. Berikut contoh command yang digunakan ketika terkoneksi
melalui cu :
=> loads 40100000
## Ready for S-Record download ...
~>vmlinux-2.4.18.srec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
...
...176 33177 33178 33179 33180 33181
[file transfer complete]
[connected]
##
##
##
##
First
Last
Total
Start
8.
Langkah pertama dalam booting dari RAM adalah download RAM Disk dari host dan install
RAM Disk pada target flash. Banyak command yang sama dengan yang telah diperlihatakan
pada bab sebelumnya. Berikut contohnya :
=> tftpboot 00100000 /home/karim/initrd.boot
ARP broadcast 1
TFTP from server 192.168.172.50; our IP address is 192.168.172.10
Filename '/home/karim/initrd.boot'.
Load address: 0x100000
Loading: ################################################### ...
done
Bytes transferred = 470552 (72e18 hex)
=> imi 00100000
## Checking Image at 00100000 ...
Image Name:
RAM disk
Created:
2003-02-05 19:20:35 UTC
Image Type:
PowerPC Linux RAMDisk Image (gzip compressed)
Data Size:
470488 Bytes = 459.5 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Disebabkan pada contoh kernel telah terinstalasi, boot dapat dilakukan pada kernel yang
tersedia di flash dangan RAM Disk yang baru diinstalasi :
=> bootm 40100000 40200000
## Booting image at 40100000 ...
Image Name:
2.4.18 Control Module
Created:
2003-02-05 19:19:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
530790 Bytes = 518.3 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
Setelah itu, masukkan CF card di PCMCIA port menggunakan CF-to-PCMCIA adapter, dan
berikut output U-Boot pada saat startup:
U-Boot 0.2.0 (Jan 27 2003 - 20:20:21)
CPU:
XPC860xxZPnnD3 at 80 MHz: 4 kB I-Cache 4 kB D-Cache FEC
present
Board: TQM860LDB0A3-T80.201
DRAM: 16 MB
FLASH: 8 MB
In:
serial
Out:
serial
Err:
serial
Net:
SCC ETHERNET, FEC ETHERNET
PCMCIA: 3.3V card found: SunDisk SDP 5/3 0.6
Fixed Disk Card
IDE interface
[silicon] [unique] [single] [sleep] [standby] [idle] [low
power]
Bus 0: OK
Device 0: Model: SanDisk SDCFB-32 Firm: vde 1.10 Ser#: 163194D0310
Type: Removable Hard Disk
Capacity: 30.6 MB = 0.0 GB (62720 x 512)
Hit any key to stop autoboot: 5
Untuk mengambil kernel image dari partisi pada media CF digunakan command
diskboot. Berikut contohnya :
=> diskboot 00400000 0:1
Loading from IDE
Type: U-Boot
Image Name:
Created:
Image Type:
Data Size:
Load Address:
Entry Point:
=> imi 00400000
Setelah kernel diambil, anda dapat menggunakan command bootm untuk boot kernel tersebut.
Boot juga dapat diotomtisasi dengan men-setting variabel environment autostart ke yes, sehingga
diskboot akan secara otomatis boot kernel yang diambil. Berikut contohnya :
=> setenv autostart yes
=> disk 00400000 0:1
Loading from IDE device 0, partition 1: Name: hda1
Type: U-Boot
Image Name:
2.4.18 Control Module
Created:
2003-02-05 19:19:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
530790 Bytes = 518.3 kB
Load Address: 00000000
Entry Point: 00000000
Automatic boot of image at addr 0x00400000 ...
## Booting image at 00400000 ...
Image Name:
2.4.18 Control Module
Created:
2003-02-05 19:19:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
530790 Bytes = 518.3 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
Linux version 2.4.18 (karim@Teotihuacan) (gcc version 2.95.3 ...
On node 0 totalpages: 4096
...
Sekarang, unprotect flash region (daerah flash) dimana U-Boot ditempatkan sehingga
anda dapat menghapusnya (dalam contoh ini, U-boot menempati dareah (region) dari
0x40000000 hingga 0x4003FFFF):
=> protect off 40000000 4003FFFF
Un-Protected 5 sectors
Hapus image bootloader yang ada sebelumnya :
=> erase 40000000 4003FFFF
Erase Flash from 0x40000000 to 0x4003ffff
... done
Erased 5 sectors
Copy bootloader versi baru ke tempatnya :
=> cp.b 00100000 40000000 $(filesize)
Copy to Flash... Done
Hapus variable environment filesize :
=> setenv filesize
Pada step ini image bootloader versi baru telah diinstall dan siap digunakan. Tetapi anda masih
tetap menggunakan U-Boot versi lama pada saat sebelum anda memberi command reset untuk
restart sistem. Hal ini bertujuan agar apabila terjadi problem pada saat update anda dapat
membenahi problem tersebut. Setelah semua step diatas dilakukan, anda dapat restart system :
=> reset
U-Boot 0.2.0 (Jan 27 2003 - 20:20:21)
CPU:
XPC860xxZPnnD3 at 80 MHz: 4 kB I-Cache 4 kB D-Cache FEC present
Board: TQM860LDB0A3-T80.201
DRAM: 16 MB
FLASH: 8 MB
In:
serial
Out:
serial
Err:
serial
Net:
SCC ETHERNET, FEC ETHERNET
PCMCIA:
No Card found
Hit any key to stop autoboot: 5
TERIMA KASIH