Fatih Droid PDF Reader AR&GE Projesi

Yeni bir yazı hazırlarken…

Blog sayfamız için yeni bir yazı hazırlarken nelere dikkat etmemiz gerekir?

Devamını Oku »

Sponsorlar

Arşivler

BeagleBone Üzerinde Android Kurulumu

 

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.

androidvncserver

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.

 

vncviewer 192.168.1.1:5901

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

 

 

 

 

 

 

5 comments to BeagleBone Üzerinde Android Kurulumu

  • lokman GÖKDERE

    Merhaba Tuna Hocam

    Bu yazınızi harkulade faydalı buldum. Ben uygulamya çalışmadan önce anlamya çalıştım zaten pek karışık değil android boot dosyasını beagle üzerinde çalıştırıp sanal ağdan bilgisayar üzerinde görüntülüyoruz bunu virtualbox taki sanal işletim sistemine benzetsek ne kadar doğru olur bilmiyorum ama sanal ağ konusundan temel bilgim var özetleyecek olursam ben bu uygulamayı gerçekleştirdiğimde aşağıdaki gibi sonsatırda kalıyor. Ben bunun nedeni şöyle tahmin ediyorum bağlantıları yaparken modemim tek portlu olduğu için port çoklayıcmda olmadığı için eth0 ağı ile iletişime geçemiyor benim bu tespitim doğrumudur şimdiden teşekkür ederim.

    [ 4.739593] Freeing init memory: 236K
    [ 4.761047] init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_score_adj instead.
    [ 5.505828] init: cannot open ‘/initlogo.rle’
    [ 5.543487] init: cannot find ‘/system/etc/install-recovery.sh’, disabling ‘flash_recovery’
    [ 5.558319] android_usb: already disabled
    [ 5.563323] adb_bind_config
    [ 6.248229] adb_open
    [ 6.363128] Disabling lock debugging due to kernel taint
    root@android:/ # [ 7.306762] init: untracked pid 61 exited
    [ 19.733642] warning: `zygote’ uses 32-bit capabilities (legacy support in use)
    [ 27.954986] request_suspend_state: wakeup (3->0) at 27951850628 (2000-01-01 00:00:26.506188100 UTC)
    [ 29.080688]
    [ 29.080718] CPSW phy found : id is : 0x7c0f1
    [ 29.087585] PHY 0:01 not found
    [ 29.094177] ADDRCONF(NETDEV_UP): eth0: link is not ready
    [ 29.271148] acc_open
    [ 29.279449] acc_release
    [ 32.074493] PHY: 0:00 – Link is Up – 100/Full
    [ 32.084411] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

    Lokman GÖKDERE

  • Niyazi SARAL

    Ellerinize sağlık arkadaşlar gerçekten BeagleBone için gereğini yapıyorsunuz. Paylaştığınız bilgilerin çoğalması umudu ile…

  • Merhabalar android kurulumunda bir eksik detay hakkında bilgi almak istiyorum. Acaba kurulum sırasında
    $ sudo ./mkmmc-android.sh /dev/sdX kısmında kendi pc’imde ben (a,b,c) demenizden dolayı bütün harddiskimi kaybettim flashımı
    $ df -h dediğimde mmc’in /dev/mmcblk0 ve gparted ile gözlemlediğimde yine aynısı olduğunu gördüm ancak
    $ sudo ./mkmc-android.sh /dev/mmcblk0 yazdığımda

    gokhan@gokhan-K52JT:~/Downloads/beaglebone$ sudo ./mkmmc-android.sh /dev/mmcblk0Assuming Default Locations for Prebuilt Images
    All data on /dev/mmcblk0 now will be destroyed! Continue? [y/n]
    y
    [Unmounting all existing partitions on the device ]
    umount: /dev/mmcblk0: not mounted
    umount: /dev/mmcblk0p1: not mounted
    [Partitioning /dev/mmcblk0...]
    Disk /dev/mmcblk0 doesn’t contain a valid partition table
    DISK SIZE – 2032664576 bytes
    CYLINDERS – 247
    [Making filesystems...]
    [Copying files...]
    mount: special device /dev/mmcblk01 does not exist
    umount: /dev/mmcblk01: not found
    mount: special device /dev/mmcblk02 does not exist
    umount: /dev/mmcblk02: not found
    [Copying all clips to data partition]
    mount: special device /dev/mmcblk03 does not exist
    umount: /dev/mmcblk03: not found
    [Done]
    ile karsılastım bu durumu /media/ olarakta denediğimde aynısına ulastım gparted ile kendim attım bu sefer uLoader acıldı bbone üzerindeki tuşa bastığımda
    ancak hiçbir şey olmamıs gibi takılır oldu üstteki yolla yaptıgımda gparted dan baktıgımda hiçbir format almamıs bir şekilde duruyor acaba bu konuyu biraz genişletip bilgilenebilirmiyiz uzun süredir ugrasmaktayım.

  • MMC kartı boot etmek için aşağıdaki linten faydalanabilirsiniz. Eksik bir bilgi yoktur.
    http://www.mcu-turkey.com/mmc-kart-uzerinden-boot-operasyonu/

  • Teşekkür ederim sizin yaptıgınız beagleboard’ın bone versiyonunu klasörleri mount umount ederek aynı yöntemi izleyerek yaptım ve sorunsuzca calısıyoruz suanda. Teşekkürler

Leave a Reply