Hawkboard
Last updated
Was this helpful?
Last updated
Was this helpful?
Hawkboard, TI (Texas Instruments) firmasının geliştirdiği, OMAP ARM9 (OMAP-L138) işlemcisini kullanan açık bir donanımdır.
Temel olarak aşağıdaki bileşenlere sahiptir.
İşlemci
ARMV5/ARM926
DSP
C674x Floating Point
RAM
128 MB DDR
NAND
128 MB
MMC/SD
Var
Ethernet
Var
VGA
Var
Konsol
Var
Not: Hawkboard projesi, kartın bazı donanım problemleri nedeniyle sonlandırılmış durumdadır. Fakat kartın NAND, Ethernet ve VGA gibi bileşenlere sahip olması, bu tür sistemleri tanıma sürecinde bizim için kullanışlı bir çalışma ortamı oluşturacaktır.
Bu bölümde, cihaz için önyükleyici ve işletim sistemi çekirdeğinin nasıl derlendiğinden, sonrasında cihazı kendi bilgisayarımız üzerinden (Host) nasıl açabileceğimize (Recovery) ve temel bazı kullanım senaryolarına bakacağız.
İlk olarak, önyükleyici ve çekirdeği nasıl edinip derleyebileceğimize bakalım.
Not: 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.
Hawkboard, U-Boot önyükleyicisini kullanmaktadır.
Bu aşamada ana dizinde u-boot dosyası oluşmuş olmalıdır.
Bu aşamada ana dizinden itibaren arch/arm/boot dizininde, U-Boot tarafından yüklenebilecek, çekirdek imajı uImage oluşmuş olmalıdır.
Şimdi kartı sıfırdan nasıl açabileceğimize bakalım.
Kart üzerinde, açılış sürecine ilişkin alt seviye bir yazılım olmaması, bu yazılımın bozulmuş olması durumununda veya bu süreç bypass edilmek istendiğinde, kartın dışarıdan açılması tek veya alternatif bir seçenek olarak karşımıza çıkmaktadır.
Kart kurtarma senaryolarında genel olarak cihaza SD kart, USB veya seri port üzerinden ilk olarak önyükleyicinin atılarak çalıştırılması hedeflenmektedir. Cihaz üzerinde önyükleyici çalıştırıldıktan sonra seri terminal üzerinden cihazla alt seviye bir iletişim kurulabilir ve sonraki adımlara buradan devam edilebilir.
Hawkboard seri port üzerinden (UART Recovery) açılabilmektedir. Öncesinde, daha önce derlediğimiz önyükleyici dosyasını (u-boot) seri port için uygun şekilde imzalamalıyız. Bu imzalama ve önyükleyiciyi cihaza atma işlemleri için TI tarafından hazırlanan AIS Generator / UART Host Tool araçlarını kullanacağız. Gerekli araçları sisteminize kurmak için ilk olarak aşağıdaki zip dosyasını indirebilirsiniz.
Not: TI tarafından sağlanan bu araçlar, maalesef Linux karşılıkları olmayan, .NET Framework bağımlılığı olan pencereli uygulamalardır. Linux altında bu programları kullanabilmek için sisteminizde mono, mono-vbnc ve wine paketleri bulunmalıdır.
zip dosyasından AISgen_d800k008_Install_v1.13.exe kurulum dosyası çıkacaktır. Kurulum sonrasında, sırasıyla imzalama ve cihaza önyükleyici atmak için AISgen_d800k008.exe ve UartHost.exe uygulamalarını kullanacağız.
İlk olarak, imzalama işlemini nasıl yaptığımıza bakalım.
Not: İşlemci yongasındaki ROM önyükleyici dışarıdan okuyacağı bir sonraki önyükleyiciyi, TI tarafından geliştirilen, Application Image Script (AIS) formatında beklemektedir. Formatın detaylarına TI dokümanlarında mevcuttur.
AISgen imzalama uygulamasında General ve DDR sekmelerine aşağıdaki değerleri vermeliyiz. DDR sekmesinin görünür olması için General sekmesinde, Configure DDR seçeneği işaretlenmelidir.
General:
Özellik
Değer
Device Type
d800k002 - ARM
Boot Mode
UART2
DDR:
Özellik
Değer
Memory Type
DDR2
DRPYC1R
0x43
SDCR
0x00134632
SDCR2
-
SDTIMR1
0x26492a09
SDTIMR2
0x7d13c722
SDRCR
0x249
Not: Bu aşamada yukarıdaki bu değerlerin ne anlama geldiğini bilmek zorunda değiliz.
Linux altında aldığımız örnek ekran görüntüleri aşağıdaki gibidir.
Sonrasında, ARM Application File bölümüne daha önce derlediğiniz u-boot dosyasını, AIS Output File bölümünü de oluşturulacak olan dosya ismini vererek imzalama işlemini gerçekleştirebilirsiniz. Biz imzalı dosyamıza u-boot_uart.bin ismini verdik.
Şimdi imzalanmış önyükleyici dosyasını Hawkboard'a nasıl atacağımıza bakalım.
Bu amaçla UartHost.exe uygulamasını kullanacağız. Fakat öncesinde cihaz üzerindeki açılış sürecini kontrol eden anahtarları (Boot Switches) uygun şekilde ayarlamalıyız. Üretim aşamasında işlemci içindeki dahili bir hafızaya kodlanan önyükleyici (ROM Bootloader) bu anahtarların durumuna göre sonraki önyükleyiciyi NAND veya seri port üzerinden okumaya çalışmaktadır. Cihazı seri port üzerinden açabilmek için boot anahtarları aşağıdaki gibi ayarlanmalıdır.
Not: Boot anahtarları, kart üzerinde DIP switch şeklinde bulunmaktadır. Reset butonunun yakınında bulunan bu anahtarlar SW1 olarak isimlendirilmiştir.
1
2
3
4
OFF
ON
OFF
ON
Bu durumda, cihaza enerji verildiğinde veya resetlendiğinde, seri terminale BOOTME mesajını gönderecektir. Cihaza önyükleyiciyi atmadan önce bu mesajın geldiğinden emin olunuz ve seri terminal bağlantınızı sonlandırınız.
Şimdi UartHost.exe uygulamasını kullanabiliriz. Uygulamaya daha önce imzaladığımız u-boot dosyasını ve seri portu göstermeliyiz, ayrıca Wait for BOOTME seçeneğinin seçili olduğundan emin olunuz. Bu durumda uygulamada Start butonuna bastığımızda Linux altında aldığımız örnek ekran görüntüsü aşağıdaki gibidir.
Bu aşamada uygulama cihaza enerji vermemizi veya resetlememizi beklemektedir. Cihaz yeniden başlatıldığında, imzalanmış u-boot cihaza atılacaktır. Örnek ekran görüntüsü aşağıdaki gibidir.
Sonrasında seri terminal üzerinden cihaza bağlanıp enter tuşuna bastığınızda u-boot komut satırını görmelisiniz. printenv ile önyükleyicinin kullandığı çevre değişkenlerini görebilirsiniz.
Bu aşamadan sonra sistemi açmak için bir çok seçeneğe sahibiz. Sırayla bunlardan bazılarını kısaca inceleyim.
Bu yöntemi kullanarak, ağ üzerindeki başka bir sistemden veya geliştirme yaptığınız bilgisayardan, çekirdeği cihaza çekmek ve uzaktaki bir dosya sistemini mount etmek mümkündür. Öncesinde geliştirme yaptığınız bilgisayarınızda TFTP ve NFS sunucuları kurulu olmalıdır.
Uzaktaki bir makinadan çekirdeği cihaz üzerine aşağıdaki gibi çekebilirsiniz.
Açılış sırasında root dosya sistemi olarak NFS'i kullanmak için ise bootargs değişkenine aşağıdaki formda değerler geçirilmelidir.
dhcp özelliğinin olmaması durumunda, cihaz IP, gateway ve netmask değerlerini aşağıdaki gibi verebilirsiniz.
Sonrasında daha önce çekirdeği çektiğiniz adresteki kodu çalıştırarak cihazı açabilirsiniz.
Kendi sistemimiz için örnek bir kullanım aşağıdaki gibidir.
Şimdi, bir diğer alternatif olarak, cihazı NAND üzerinden nasıl açabileceğimize bakalım.
Cihazı NAND üzerinden açabilmek için ilk olarak gerekli dosyaları bir şekilde NAND üzerine yazmalıyız. Bu işlemi, dosya sistemini NFS üzerinden mount edip, Linux üzerinden yapabildiğimiz gibi, U-Boot üzerinden de yapabiliriz. Fakat öncesinde, daha önce seri port için yaptığımıza benzer şekilde, NAND üzerine yazacağımız u-boot dosyasını imzalamalıyız.
Şimdi sırasıyla, imzalama işlemine ve gerekli dosyaları NAND üzerine nasıl yazabileceğimize bakalım.
İmzalama işlemi için yine AISgen_d800k008.exe uygulamasını kullanacağız, seri port için imzalama yaparken kullandığımız aynı değerleri kullanacağız yalnız Boot Mode tipini NAND Flash olarak seçmeliyiz.
General:
Özellik
Değer
Device Type
d800k002 - ARM
Boot Mode
NAND Flash
Çekirdek, NAND üzerinde sanki bir bölümlendirme (Partition) yapısı varmış gibi işlem yapabilir. Bu bölümlendirme, Linux kaynak kodu içerisinden sabit olarak ayarlanabileceği gibi çekirdeğe önyükleyici tarafından geçirilen argümanlar vasıtasıyla dinamik olarak da yapılabilir.
Sabit bölümlendirme bilgileri arch/arm/mach-davinci/board-omapl138-hawk.c dosyasında mtd_partition türündeki omapl138_hawk_nandflash_partition isimli bir dizi ile temsil edilmektedir.
Dinamik bölümlendirme için ise çekirdek kodu command line partition table parsing seçeneği seçilerek derlenmeli ve çekirdeğe mtdparts komut satırı seçeneği geçirilmelidir. Örnek olarak aşağıdaki gibi bir bölümlendirme oluşturalım.
Bölüm
Uzunluk
U-Boot_Env
128K
U-Boot
512K
Kernel
4M
Recovery
40M
FileSystem
Kalan Boş Alan
Bu bölümlendirmeyi oluşturabilmek için çekirdeğe, diğer komut satırı parametreleriyle beraber, aşağıdaki mtdparts değerini geçirmeliyiz.
Not: Yukarıdaki ifadede davinci_nand, mtd id değerini, noktadan sonra eklenen 1 değeri ise aygıt numarasını göstermektedir. mtd id değerine, Linux üzerinden, aşağıdaki gibi ulaşabilirsiniz.
ls /sys/bus/platform/drivers | grep nand
Linux üzerinden NAND bölümlendirmesini cat /proc/mtd şeklinde görebilirsiniz. Örneğimiz için çıktı aşağıdaki gibidir.
Her bir bölüm üzerinde, bir blok aygıt (block device) olarak işlem yapılabilir. İlgili dosya düğümlerini aşağıdaki gibi listeleyebilirsiniz.
Şimdi sırasıyla önyükleyici, çekirdek imajı ve dosya sistemini nasıl yazabileceğimize bakalım. Ayrıca, FileSystem olarak isimlendirdiğimiz son bölümden önce Recover isimli başka bir bölüm daha oluşturduğumuza dikkat ediniz. Bu bölüm üzerinde, güvenlik amaçlı, yalnız okunabilen bir dosya sistemi oluşturacağız.
İlk olarak, NAND üzerine yazacağımız önyükleyici, çekirdek ve dosya sistemi imajlarını NFS üzerinden açtığımız cihazımızın dosya sistemine kopyalamalıyız. Gerekli dosyaları /opt altına attığımızı kabul edelim.
Dosya
Türü
u-boot_nand.bin
NAND için imzalanmış önyükleyici
uImage
Çekirdek imajı
rootfs.sqsh
squashfs dosya sistemi imajı
rootfs.jffs2
jffs2 dosya sistemi imajı
Gerekli dosyaları dd aracı ile aşağıdaki gibi sırasıyla NAND üzerine yazabiliriz.
Uyarı: Bu işlemler öncesinde, U-Boot komut satırından nand erase ile tüm NAND'i silmeyi unutmayınız. Diğer bir alternatif mtd-utils araçlarını cihaz hedefli derleyerek aynı işlemi Linux üzerinden yapmak olabilir.
Şimdi aynı işlemi u-boot üzerinden nasıl yapabileceğimize bakalım.
nand write.e komutunun genel şekli aşağıdaki gibidir.
Çekirdeğe geçireceğininiz NAND bölümlendirmesini değiştirmeniz durumunda, kullandığımız ofset değerleri de değişecektir. Ayrıca yukarıdaki örnek kullanımda dosya sistemlerinin 16M sınırında olduğu kabul edilmiştir, boyut olarak 0x1000000 değerinin kullanıldığına dikkat ediniz.
Root dosya sisteminin uygun parametlerle jffs2 imajının oluşturuluması ve sonrasında, U-Boot veya Linux üzerinden, NAND üzerine yazıldıktan sonra tekrar okunmasında bazı problemler ortaya çıkabilmektedir. Bu yüzden önyükleyici ve çekirdeği u-boot üzeriden yazmanızı, dosya sistemini ise Linux üzerinden ilgili bölümü mount edip dosya sistemini kopyalamanızı öneririz.
U-Boot:
Linux:
Bu aşamada ROM yükleyicinin, bir sonraki açılışta, u-boot yükleyicisini NAND üzerinden araması için boot anahtarları aşağıdaki gibi ayarlanmalıyız.
1
2
3
4
ON
OFF
OFF
OFF
Gerekli dosyaları NAND üzerine yazdıktan sonra cihazın kendiliğinden NAND üzerinden açılabilmesi için önyükleyici üzerinde bazı değişiklikler yapmalıyız. Cihazı resetleyerek tekrar u-boot komut satırına düşelim.
Çekirdeğe, root dosya sisteminin yerini ve tipini geçirmeliyiz. Aşağıdaki kullanımda root=/dev/mtdblock4 dosya sisteminin aranacağı NAND bölümünü, rootfstype=jffs2 ise dosya sisteminin tipini göstermektedir. Sonrasında NAND üzerindeki çekirdek kodu, güvenli bir adrese çekilip başlatılmalıdır. nand read ve bootm komutları bu işleri yapmaktadır. bootcmd ile gösterilen komutlar, açılışta önyükleyici tarafından otomatik olarak çalıştırılarak, bu komutların icra edilmesi sağlanır.
Bu aşamadan sonra cihaz resetlendiğinde, dışarıdan herhangi bir müdahale olmaksızın, dahili NAND hafızası üzerinden açılacaktır.