
Bu yazımızda BeagleBone RevA3 üzerinde Android işletim sistemi çalıştıracağız. Aynı zamanda VNC(virtual Network Computing) yardımıyla android ara yüzünü host bilgisayarımız üzerinden gözlemleyebileceğiz. Uygulamamızda Texas Instruments tarafından sağlanan android 2.3.4 sürümünü çalıştıracağız. Beagleboard üzerinde de bu işlemler aynı şekilde olacaktır.
Android, Google tarafından mobil cihazlarda kullanılması için geliştirilmiş bir işletim sistemidir. Linux tabanlı bir işletim sistemidir ve açık kaynak kodludur. Mobil sistemlerde gerek ara yüzü gerek işlevselliği dolayısıyla tercih edilmektedir. Android işletim sistemini 2 kısımda inceleyecek olursak çekirdek ve uygulama geliştirme diyebiliriz. Çekirdek kısmı linux kernelinden oluşur. Çekirdek üzerinde donanımsal aygıtların sürücüleri, boot prosedürleri bulunur. Diğer bir kısmı ise uygulama geliştirme kısmıdır. Bu kısımda java tabanlı uygulamalar çalıştırılabilir. Bugünkü uygulamamızda ilk kısım olan kernel üzerinde duracağız. Kernel derleyerek başlangıçta sistemimizde çalışacak olan çevresel aygıtları ve sürücülerini sisteme tanıtmış olacağız.
Boot İşlemleri
Beagle serisi ile uğraşanların aşina olduğu fakat ne işe yaradığını uzun süre çözemediğimiz meşhur boot dosyalarını bu bölümde anlatmaya çalışacağım.
ARM sistemlerde sistem ilk çalıştırıldığında işlemci ilk olarak bilinen bir ROM hafızaya program counter’ı atar ve bu adres üzerinde minimum saat frekansıyla çalışmaya başlar. Sistemde boot imajını arar ve bulduğu boot imajını işlemeye başlar. Bu bulunan boot imajına X-loader denir. X-loader üzerinde cihaza özel pin,saat ve hafıza ayarları yapılır. Gerçek hızına bu aşamada ulaşır. Bu ayarları yaptıktan sonra, x-loader hafızada bulunan u-boot dosyasını çalıştırır.
U-boot dosyası spesifik platform ayarlarını gerçekleştirir. Boot argümanlarını ayarlar, seri port üzerinden haberleşmeyi sağlar ve kernel kontrolünü çalıştırır. Kernel kontrolü uImage olarak isimlendirilir. Bu aşamada LCD,HDMI gibi çevresel aygıtlar ayarlanır. Linux dosya sistemine erişilir ve başlangıç uygulamaları çalıştırılır. Bu aşamada işletim sistemi canlandırılır da diyebiliriz. Bu şekilde boot aşamaları sonlandırılır ve cihaz çalışmaya başlar.
Peki neden 2 tane boot dosyasına ihtiyacımız var sorusu aklımıza gelebilir. (x-loader ve u-boot) X-loader u-boot için daha düşük seviyede bir dosyadır ve ARM işlemci üzerindeki SRAM içerisinde çalışır. Sistemdeki harici hafıza kaynağını ve diğer gerekli cihazları tanımlar. Daha sonra o hafıza üzerindeki boot dosyasını çalıştırır(u-boot). u-boot dosyası MMC kartımızda FAT bölümünde bulunur. Harici hafıza ünitesi olarak bahsettiğimiz kısım MMC kartımızdır. Kernel üzerinden cihazımızda ait .config dosyaları ile bu dosyaları oluşturabiliriz. Bugünkü uygulamamızda bu dosyaları BeagleBone için oluşturacak ve işletim sistemini çalıştıracağız.
Hazır Android İşletim Sisteminin Çalıştırılması
İlk olarak TI tarafından hazır olarak verilmiş olan kernel dosyalarını kullanarak işletim sistemimizi çalıştıralım. VNC ile ara yüzünü görelim. Daha sonra bu dosyaların nasıl oluşturulduğuna değinelim. Texas instruments’in Android ile ilgili oluşturmuş olduğu siteden önceden hazır oluşturulmuş olan imajı çekiyoruz.
Daha sonra indirdiğimiz .tar.gz dosyasını dizine çıkartıyoruz. Klasörün içini incelediğimizde Boot_Images kısmında hazır boot dosyalarını bulabiliriz. Filesystem kısmında ise işletim sistemi dosyalarımız bulunacaktır. Texas instruments kullanıcılar bu dosyaları MMC kart üzerine atarken sıkıntı yaşamasınlar diye bunun için bir script paylaşmış. Ve bu script dosyasını çalıştırarak sadece MMC kartımızın yolunu göstererek yükleme yapmak mümkün.
#!/bin/bash EXPECTED_ARGS=1 if [ $# == $EXPECTED_ARGS ] then echo "Assuming Default Locations for Prebuilt Images" $0 $1 Boot_Images/MLO Boot_Images/u-boot.img Boot_Images/uImage Boot_Images/uEnv.txt Filesystem/rootfs* Media_Clips START_HERE exit fi if [[ -z $1 || -z $2 || -z $3 || -z $4 ]] then echo "mkmmc-android Usage:" echo " mkmmc-android <device> <MLO> <u-boot.img> <uImage> <uEnv.txt> <rootfs tar.bz2 > <Optional Media_Clips> <Optional START_HERE folder>" echo " Example: mkmmc-android /dev/sdc MLO u-boot.img uImage uEnv.txt rootfs.tar.bz2 Media_Clips START_HERE" exit fi if ! [[ -e $2 ]] then echo "Incorrect MLO location!" exit fi if ! [[ -e $3 ]] then echo "Incorrect u-boot.img location!" exit fi if ! [[ -e $4 ]] then echo "Incorrect uImage location!" exit fi if ! [[ -e $5 ]] then echo "Incorrect uEnv.txt location!" exit fi if ! [[ -e $6 ]] then echo "Incorrect rootfs location!" exit fi echo "All data on "$1" now will be destroyed! Continue? [y/n]" read ans if ! [ $ans == 'y' ] then exit fi echo "[Unmounting all existing partitions on the device ]" umount $1* echo "[Partitioning $1...]" DRIVE=$1 dd if=/dev/zero of=$DRIVE bs=1024 count=1024 &>/dev/null SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` echo DISK SIZE - $SIZE bytes CYLINDERS=`echo $SIZE/255/63/512 | bc` echo CYLINDERS - $CYLINDERS { echo ,9,0x0C,* echo ,$(expr $CYLINDERS / 2),,- echo ,,0x0C,- } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE &> /dev/null echo "[Making filesystems...]" mkfs.vfat -F 32 -n boot "$1"1 &> /dev/null mkfs.ext3 -L rootfs "$1"2 &> /dev/null mkfs.vfat -F 32 -n data "$1"3 &> /dev/null echo "[Copying files...]" mount "$1"1 /mnt cp $2 /mnt/MLO cp $3 /mnt/u-boot.img cp $4 /mnt/uImage cp $5 /mnt/uEnv.txt if [ "$8" ] then echo "[Copying START_HERE folder to boot partition]" cp -r $8 /mnt/START_HERE fi umount "$1"1 mount "$1"2 /mnt tar jxvf $6 -C /mnt &> /dev/null chmod 755 /mnt umount "$1"2 if [ "$7" ] then echo "[Copying all clips to data partition]" mount "$1"3 /mnt cp -r $7/* /mnt/ umount "$1"3 fi echo "[Done]"
Script, önce mmc kartı üç bölüm halinde biçimlendiriyor. Bu bölümler Fat ve Ext dosya sistemi olarak belirleniyor. Fat bölümünde boot dosyalarımız bulunurken Ext bölümünde işletim sistemi dosyalarımız ve android uygulama dosyaları bulunacak şekilde data ve rootfs olarak dosyaları kopyalıyor. Terminal üzerinden işlemlerimizi gerçekleştiriyoruz. Öncelikle indirdiğimiz dosyayı dizine çıkartacak, ardından bilgisayara taktığımız mmc kartın yolunu scripti çalıştırarak yazacağız. X kısmında MMC kartın yolunu göstermemiz gerekiyor.(a,b,c)
$ tar -xzvf BeagleBone.tar.gz $ cd BeagleBone $ sudo ./mkmmc-android.sh /dev/sdX
Hazır kullanım için android sürümümüz MMC kartımıza yüklendi bu aşamadan sonra MMC kartı beaglebone üzerine takıp işletim sistemimizi çalıştıracağız. Bağlantıları yaparken VNC kullanabilmek için ethernet bağlantısını da yapmamız gerekiyor.
VNC(Virtual Network Computing)
VNC ağ üzerinden başka bir bilgisayarı kontrol etmeye yarayan bir yapı olarak tanımlanabilir. Grafik ara yüzü olması sebebiyle bağlandığınız bilgisayarın ekranını da yine bu yolla görebilmenize olanak sağlıyor. Bu uygulamamızda beagleBone üzerindeki android işletim sistemine bu yolla bağlanıp ekranını kendi bilgisayarımız üzerinden gözlemleyeceğiz. Bağlantı için cross ethernet bağlantısı kullanacağız. İlk kısımda bilgisayar ile beaglebone arasında bir ağ bağlantısı kurmamız gerekecektir.
Ağ bağlantısını kurabilmek ve birbirlerini tanıtabilmek için iki taraflı ayar yapmamız gerekiyor. Öncelikle bilgisayar tarafında bir kablolu ağ oluşturup kendimize statik ip alacağız. Burada dikkat etmemiz gereken önemli yerler var. Aynı ağda olduklarını belirtmek için ikisininde aynı maske aralığında ip alması gerekiyor. Gateway olarak, yani çıkış ip si olarak bilgisayarımızdan beaglebone a vereceğimiz statik ip yi yazmamız gerekiyor. Aşağıdaki resimlerde daha net olacaktır.
Host Bilgisayar kısmı:
Android Tarafı:
Android işletim sistemini çalıştırdığımızda terminal üzerinden boot işlemlerini gözlemleyebilmemiz mümkün. Bunun için terminalden screen komutu yardımıyla bu işlemleri yapabiliriz. 115200 8N1 ayarlarına getirerek seri portu dinleyebiliriz.
sudo apt-get install screen screen /dev/ttyUSB0 115200
Boot işlemlerinden sonra android terminali ekrana düşecektir. Bu sefer android kısmında ip ayarlarını yapmamız gerekiyor. Android ip sini bilgisayarın gateway çıkışı olan 192.168.1.1 yapacağız. Maske yine 255.255.255.0 olacak şekilde sistemimizi ayarlayacağız. netcfg komutu ile o an sistemdeki bağlantı noktalarını görebiliriz. ifconfig komutu ile ip atamasını gerçekleştiriyoruz. ping komutu yardımıyla ise bağlantı olup olmadığını test edebiliriz.
netcfg ifconfig eth0 192.168.1.1 netcfg ping 192.168.1.5
Bağlantıyı sağladıktan sonra android tarafında vnc sağlayıcıyı çalıştırıyoruz. Ve android konsolunda nereden bu server üzerine bağlanabileceğimiz bilgisi bize sağlanacaktır. Aşağıdaki resimden 5901. port üzerinden bu servisin sağlandığını görebiliriz.
[codesyntax lang=”teraterm” container=”div”]
androidvncserver
[/codesyntax]
Bilgisayar tarafı:
Vncviewer programı yardımıyla beaglebone’a ait ip ile bağlandıkları portu yazarak vnc server ile bağlantı kurabiliyoruz. VNC çok hızlı çalışmıyor fakat böyle bir hizmeti sunması açısından işe yarar. Görüntülü çalışmalar için önermeyeceğim bir kullanım. DVI-D cape ya da touchscreen daha kullanışlı olacaktır.
[codesyntax lang=”teraterm” container=”div”]
vncviewer 192.168.1.1:5901
[/codesyntax]
Kernel Derleme
Kernel derleme işlemleri beagleboard ile farklılık göstermiyor. Fatih Inanç’ın paylaşmış olduğu kernel derlemenin aynısı beaglebone için geçerli olacaktır. O yüzden tekrar anlatmayacağım.
Referans: http://www.mcu-turkey.com/?p=23779