BeagleBoard

beagleboard

Bu bölümde, cihaz üzerinde herhangi bir alt seviye yazılım yok iken, cihazın nasıl açıldığına göz atacağız.

BeagleBoard seri port (UART Recovery) veya SD kart üzerinden (MMC Recovery) açılabilir. Biz burada ikinci yöntemi kullanacağız.

Cihazı açabilmek için bir önyükleyici (bootloader) çiftine, Linux çekirdeğine ve dosya sistemine ihtiyacımız olacak. Cihaza enerji verildiğinde, ilk olarak, işlemci yongasına üretim aşamasında kodlanan önyükleyici (ROM Bootloader) çalışmaktadır. Bu ilk önyükleyiciyi, işlev olarak, bilgisayarlarımızdaki BIOS yazılımına benzetebiliriz. Sonrasında, bu önyükleyici tarafından MLO (MMC Loader) isimli küçük bir önyükleyici yüklenmekte, MLO ile de, çekirdeği yüklemekten sorumlu ikinci önyükleyici olan U-Boot yüklenmektedir.

Şimdi sırasıyla önyükleyici çiftini, çekirdeği ve dosya sistemini nasıl oluşturabileceğimize kısaca bakalım.

Elde edeceğimiz nihai dosyaları bir dizinde toplamak, sonrasında SD karta yazma işleminde, işimizi kolaylaştıracaktır. Bu dizinin yol ifadesini DEV_DIR isimli bir çevre değişkeninde tutalım.

export DEV_DIR=<Dizin Yol İfadesi>

Not: Biz derleme sürecinde CodeSourcery geliştirme araçlarını kullanacağız. Bu aşamada çapraz derleyicinizin yol ifadesinin PATH çevre değişkeninde tanımlı olduğundan emin olunuz.

Ayrıca başka bir derleyici kullanıyorsanız, önyükleyici ve çekirdek derleme aşamalarında, derleyicinize ait öneki (prefix) kullanmalısınız. CodeSourcery için derleyici öneki arm-none-linux-gnueabi- şeklindedir.

Önyükleyici Çiftinin Derlenmesi

U-Boot

U-Boot çekirdeği yüklemekten sorumlu daha gelişmiş bir önyükleyicidir. U-Boot ayrıca kendisini yüklemek için kullanacağımız MLO konunu da barındırmaktadır.

Aşağıdaki gibi indirip, cihaz için derleyebilirsiniz.

git clone git://git.denx.de/u-boot.git
cd u-boot
make CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_defconfig
make CROSS_COMPILE=arm-none-linux-gnueabi-
cp MLO u-boot.img ${DEV_DIR}

İşletim Sistemi Çekirdeği

BeagleBoard için çekirdek kodunu aşağıdaki gibi indirip sonrasında derleyebilirsiniz. Burada 2.6.32 versiyonunu derleyeceğiz.

Not: TI firması, C6Run projesini 3.X.X versiyonlu çekirdekler için desteklememektedir. 3.X.X versiyonlu çekirdekler için de projeyi derlemek mümkün olmasın karşın çok fazla sorunla karşılaşılmaktadır, ayrıca 2.6.36 versiyonunundan önceki bir versiyonu seçmenizi öneririz. 2.6.36 ve sonrası için C6Run kaynak kodunda bazı değişiklikler yapmak gerekmektedir.

git clone git://github.com/RobertCNelson/stable-kernel.git
./patch.sh
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
cd linux-stable/
git checkout v2.6.32
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
cp arch/arm/boot/uImage ${DEV_DIR}

arch/arm/boot/ altında U-Boot tarafından yüklenebilecek uImage çekirdek imajı oluşacaktır.

Uyarı: uImage dosyasını oluşturabilmek için sisteminizden mkimage uygulaması bulunmalıdır, aksi halde derleme sürecinin sonunda aşağıdaki gibi bir hata ile karşılaşılacaktır.

"mkimage" command not found - U-Boot images will not be built

mkimage uygulaması Debian tabanlı dağıtımlarda u-boot-tools paketinden çıkmaktadır.

Dosya Sistemi

Basit bir dosya sistemini BusyBox kullanarak oluşturabileceğiniz gibi hazır bir dosya sistemi de kullanabilirsiniz. Biz burada dosya sistemini kendimiz oluşturacağız.

Not: Hazır bir dosya sistemi kullanmak istiyorsanız, Angstrom dağıtımın dosya sistemini kullanabilirsiniz. Bu dosya sistemini, aşağıdaki bağlantıyı kullanarak, internet üzerinden de kolaylıkla oluşturabilirsiniz.

http://narcissus.angstrom-distribution.org/

Bu durumda çapraz derleyicinizin kullandığı standart C kütüphanesi ile dosya sistemi bünyesindekinin uyumluluğunu kontrol etmelisiniz.

Dosya sistemini oluşturmak için temel olarak BusyBox kodunu derleyecek, asgari açılış betiklerini, aygıt düğümlerini oluşturacak ve çapraz derleyicinin kullandığı standart C kütüphenesini dosya sistemine kopyalayacağız.

BusyBox kodunu aşağıdaki gibi indirip derleyebilirsiniz.

export ROOTFS=<Dosya Sisteminin Saklanacağı Dizin Yolu>
mkdir -p $ROOTFS
wget -c http://www.busybox.net/downloads/busybox-1.23.0.tar.bz2
tar xf busybox-1.23.0.tar.bz2
cd busybox-1.23.0
make defconfig
make CROSS_COMPILE=arm-none-linux-gnueabi-
make CROSS_COMPILE=arm-none-linux-gnueabi- CONFIG_PREFIX=${ROOTFS} install

Bu aşamadan sonra ROOTFS çevre değişkeniyle gösterilen dizinde asgari dizin yapısı oluşacaktır.

Geliştirme araçlarının içindeki lib dizinini hedef dosya sisteminde / altına kopyalayalım.

cp -a <Geliştirme Araçları Ana Dizini>/arm-none-linux-gnueabi/libc/lib ${ROOTFS}

Açılış ve sonrasında ihtiyaç duyulacak olan temel dizinleri aşağıdaki gibi oluşturabiliriz.

mkdir -p ${ROOTFS}/etc/init.d
mkdir -p ${ROOTFS}/dev
mkdir -p ${ROOTFS}/tmp
mkdir -p ${ROOTFS}/proc
mkdir -p ${ROOTFS}/home/root

Bu aşamada gerekli açılış betiklerini oluşturalım. inittab ve rcS olmak üzere iki adet betiğe ihtiyacımız olacak. BusyBox içinden çıkan örnek inittab dosyasını hedef dosya sistemimize koplayalayıp üzerinde değişiklik yapabiliriz.

cp examples/inittab ${ROOTFS}/etc

Cihaza seri terminal üzerinden ulaşabilmek için, inittab dosyasına aşağıdaki satır eklenmeli veya açıklama şeklinde olan benzer satır aynı forma dönüştürülmelidir.

::respawn:/sbin/getty -L ttyS0 115200 vt100

/etc/init.d altında ise içeriği aşağıdaki gibi olan rcS betiği oluşturulmalı ve gerekli izinleri verilmelidir.

#!/bin/sh
mount -t proc proc /proc
mount -t devpts devpts /dev/pts

rcS için aşağıdaki gibi gerekli izinleri verebiliriz.

chmod 755 etc/init.d/rcS

Son olarak, /dev altındaki gerekli aygıt düğümleri ve pts dizinini aşağıdaki gibi oluşturabiliriz.

mknod -m 666 ${ROOTFS}/dev/tty c 5 0
mknod -m 666 ${ROOTFS}/dev/console c 5 1
mknod -m 666 ${ROOTFS}/dev/tty1 c 4 1
mknod -m 666 ${ROOTFS}/dev/tty2 c 4 2
mknod -m 666 ${ROOTFS}/dev/tty3 c 4 3
mknod -m 666 ${ROOTFS}/dev/tty4 c 4 4
mknod -m 666 ${ROOTFS}/dev/random c 1 8
mknod -m 666 ${ROOTFS}/dev/urandom c 1 9
mknod -m 666 ${ROOTFS}/dev/ptmx c 5 2
mknod -m 666 ${ROOTFS}/dev/zero c 1 5
mknod -m 666 ${ROOTFS}/dev/null c 1 3
mkdir -p ${ROOTFS}/dev/pts

Bu aşamada dosya sistemimizi hazırlamış olduk, daha sonra SD kart üzerine yazmak için dosya sistemimizi arşiv halinde saklayabiliriz.

tar czvf rootfs.tgz -C ${ROOTFS} .
cp rootfs.tgz ${DEV_DIR}

SD Kartın Hazırlanması

SD kart üzerinde, biri FAT32 diğeri ise ext3 şeklinde biçimlendirilecek iki adet bölüme (partition) ihtiyacımız olacak. FAT32 bölümüne önyükleyicileri ve çekirdeği, ext3 bölümüne ise dosya sistemini taşıyacağız. SD kart üzerindeki bölümlendirme ve biçimlendirme işlerini, komut satırından elle yapmak yerine, Angstrom dosya sistemi bünyesindeki mkcard.txt betiğini kullanabiliriz. Betiği aşağıdaki gibi indirebilirsiniz.

wget -c http://downloads.angstrom-distribution.org/demo/beagleboard/mkcard.txt

Betiğe SD kartımıza ilişkin aygıt düğümünü (device node) geçirmeliyiz, sistemimiz için örnek aşağıdaki gibidir:

./mkcard.txt /dev/mmcblk0

Not: SD kartınıza ilişkin aygıt düğümünü fdisk -l ile sisteminizdeki bölümleri inceleyerek bulabilirsiniz. fdisk komutunu root haklarıyla çalıştırmalısınız.

Not: Betiğe daha yakından baktığımızda, sırasıyla SD kartın boyutunun hesaplandığını, sfdisk ile iki adet bölümün oluşturulduğunu, sonrasında bu bölümlerin mkfs.vfat ve mke2fs ile biçimlendirildiğini görmekteyiz. FAT bölümünün bootable olduğuna dikkat ediniz.

Bu aşamadan sonra, önyükleyici çiftiyle çekirdeği FAT bölümüne kopyalayabilir ve önceden hazırladığımız dosya sistemi arşivini ext3 bölümüne açabiliriz.

cp ${DEV_DIR}/MLO /media/boot
cp ${DEV_DIR}/u-boot.img /media/boot
cp ${DEV_DIR}/uImage /media/boot
tar xf ${DEV_DIR}/rootfs.tgz -C /media/Angstrom

results matching ""

    No results matching ""