Thinkpad x200 Libreboot Kurulumu (2): Nasıl?
Bir önceki yazımda Libreboot’un ne olduğundan bahsetmiştim. Bu yazıda ise Thinkpad x200 ‘e Libreboot kurulum aşamalarından ve bu aşamaları gerçekleştirirken deneyimlediğim bazı problemlerden ve çözümlerinden detaylı olarak bahsedeceğim.
Bu işlemi gerçekleştirirken karşılaştığım birçok problemin tartışıldığı Reddit platformundan çok yardım aldım. Hatta takip ettiğim ana kaynak da Reddit üzerinde yer alıyordu. Bu konuda Türkçe kaynak bulmak gerçekten çok zor, ben sadece bir tane bulabildim mesela.
Thinkpad X60 ve T60 gibi bazı bilgisayarlara, donanımsal olarak herhangi bir müdahale olmadan Libreboot kurulabiliyor ancak x200 için donanımsal müdahale gerektiği için bazı ekipmanların olması gerekir. Benim kullandığım ekipmanları aşağıdaki listede belirttim.
- Raspbian kurulu bir Raspberry Pi (RPi)
- Bilgisayar (RPi ‘yi ayarlamak için)
- Jumper kablolar
- Lehim teli (ince) ve havya
- İnternet bağlantısı olan ve boş ethernet çıkışı olan bir modem
- Ethernet kablosu
- Monitor (HDMI çıkışlı)
Genelde yerli/yabancı tüm kaynaklardaki ekipmanların hemen hemen hepsinde anakarttaki entegreye göre SOIC-8 veya SOIC-16 klip yer alıyor. Bende maalesef olmadığı için lehim ile uğraşmak zorunda kaldım. Bir yerlerden satın alabilirdim işleri kolaylaştırmak için belki ama sabırsız olduğum için beklemek istemedim.
Ekipmanlardan söz etmişken değinmeden geçmek istemiyorum; bu çalışmada kullandığım Raspberry ‘i, ben öğrenciyken, Mert Sarıca’nın “Pi Hediyem Var – 2” yarışmasından kazanmıştım. Bu vesileyle kıymetli büyüğüm Mert Sarıca’ya teşekkür ediyorum.
Raspberry Konfigürasyonları
RPi’ye, uzaktan bağlantı konfigürasyonlarını yapabilmek için monitor, klavye, fare ve diğer ucu modemde olan bir ethernet kablosu bağladım. Bendeki RPi’ye zamanında Raspbian kurduğum için aşağıdaki komutla güncellemeleri gerçekleştirdim ve sistemi yeniden başlattım.
1sudo apt-get update && sudo apt-get dist-upgrade
Ardından, RPi’ye uzaktan bağlantı sağlamak için SSH bağlantısını aktif edip, diğer bilgisayardan SSH ile RPi ‘ye bağlandım. SSH’in nasıl aktif edileceğine dair kaynağı buraya bırakıyorum 1. Artık ethernet bağlantısı hariç diğer ekipmanlara ihtiyacım kalmadı.
RPi ile BIOS entegre, SPI arayüzü ile haberleşeceği için RPi üzerinde SPI protokolüne de izin verilmesi gerekiyordu. Bu işlemi gerçekleştirmek için de birçok metot vardı. Ben SSH’ı aktif ettiğim menüden SPI’da aktif etmiştim. Bahsettiğim ve diğer yöntemler için diğer bir kaynağı da buraya bırakayım 2.
Sonraki işlemlere uzak masaüstü bağlantısı ile devam ettim. Yukarıdaki işlemlerden sonra, RPi ‘ye flashrom yazılımının yüklenmesi gerekiyor. Flashrom, flash çiplerin (nasıl çevireceğimi bilemedim) okunması, yazılması, silinmesi gibi işlemleri gerçekleştirir 3. Flashrom’un kurulabilmesi için bazı bağımlı paketlerin de kurulması gerekiyor. Bu adımda ben, takip ettiğim dokümanda yer alan paketlerin dışında, libreboot’un kendi dokümanındaki paketleri de kurdum. Komut:
1sudo apt-get install libftdi1 libftdi-dev libusb-dev libpci-dev git subversion build-essential pciutils usbutils zlib1g-dev libusb-1.0-0-dev
Flashrom için gereksinimler tamamlanmış oldu. Ardından kullanıcı dizininde ya da istenilen bir yerde ilgili dosyaların bir arada olması için x200 adında bir klasör oluşturdum. Bu klasöre github üzerinde bulunan flashrom projesini aşağıdaki komutla indirdim.
1git clone https://github.com/flashrom/flashrom.git
İndirdiğim proje klasörünün içine girerek, derleme işlemlerini aşağıdaki komutlarla yaptım. Böylece Flashrom RPi’ye kurulmuş oldu. Aşağıdaki komutlardaki diğer parametrelerin gerçekten gerekli olup olmadığı ile ilgili şüphelerim de oldu açıkçası. Ama yine de işi sağlama almak için bu şekilde bıraktım.
1make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no CONFIG_ENABLE_LIBPCI_PROGRAMMERS=no
2sudo make install CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no CONFIG_ENABLE_LIBPCI_PROGRAMMERS=no
Böylece RPi konfigurasyonu tamamlanmış oldu.
Elektronik Bağlantılar
Sökme takma işlerine girişmeden önce bilgisayarın arka kısmında beyaz bir etikette yazan mac adresini bir kenara not ettim çünkü libreboot’u derlerken bu adresten faydalanacaktım. Ardından x200’ü bulduğum birkaç kaynağı [4, 5] takip ederek söktüm ve programlamak istediğim entegreye eriştim (Şekil 1). Bazı serilerde entegre 16 bacaklı bazı serilerde 8 bacaklı oluyormuş. Benim bilgisayarımda 8 bacaklı bir entegre vardı (Şekil 2). Markası ve modeli de önemliydi çünkü bağlantıları ona göre gerçekleştirmem gerekiyordu. Bu nedenle entegrenin üzerindeki “LC1” yazan etiketi söktüm ve modeli daha rahat görebilmek için telefonla flaş açık bir şekilde entegrenin yakından fotoğrafını çektim (Şekil 2). Bu arada Şekil 2 de görülen fotoğraf lehim işleminden sonra çekildiği için bacaklarda deformasyon görülüyor yoksa tertemizdi.
Marka/model öğrendikten sonra, entegrenin datasheetini indirip, ilgilendiğim kısımlarını okudum. Burada dikkat edilecek en önemli unsur bacakların işlevleriydi. Zaten takip ettiğim dokümanda entegrenin bacak işlevlerini açıklayan datasheet’ten alınmış bir görsel (Şekil 3) de yer alıyordu. Bu aşamada MOSI, MISO, SI ve SO gibi bilmediğim terimler karşıma çıktı. Bunların anlamını da internetten araştırıp öğrendim. Şekil 3’teki entegre türlerine baktığımda, üç tip 8 bacaklı entegre bulunuyordu ve hepsinde bacak sıralaması ve işlevleri aynıydı o yüzden herhangi birini kullanmamda bir sakınca yoktu. Entegre ile ilgili bilgiler edindikten sonra RPi ve entegre arasındaki bağlantıları, RPi kapalı iken, Şekil 4 ile Şekil 3 ‘ü dikkate alarak gerçekleştirdim. Bu arada Şekil 4, bendeki RPi Model 2 v1.1 ‘e göre çizilmiş. Farklı bacak sayısına sahip RPi’ler için diyagramlar, takip ettiğim kaynakta yer alıyor.
Kablolama işlemini yaparken çok zorlandım. Çünkü bunun için SOIC klibin kullanılması çok daha kolay olurdu ama şartlar maalesef buna elverişli değildi. Bu nedenle aldım elime havyayı, başladım jumperları lehimlemeye, amma ne lehimlemek üfff (Şekil 5, 6). Fotoğraflardan da anlaşıldığı gibi pek de iyi lehim yaptığım söylenemez. Anakarta veya entegreye zarar veririm diye korktuğumu da belirtmeden geçmemeliyim sanırım. Bu arada RPi’den jumper kablolar çıkıyor, ardından lehim teli ile birleşiyor. Yani lehim telini kablo niyetine kullanıyorum. Bu şekilde çalışmasına pek ihtimal vermiyordum açıkçası. Çünkü jumper kablonun entegre bacağına kadar gitmesi ve orada lehimle direkt bacağa kaynatılması gerekiyordu, doğru olan buydu. Ama yine de ilginç bir şekilde işe yaradı. Yine de burada o lehim telinin olabildiği kadar kısa tutulmasında fayda var diye düşünüyorum.
Libreboot Konfigürasyonu
Sıra, x86 mimarili, linux işletim sistemli bir bilgisayarda, Libreboot’u indirip, not ettiğimiz mac adresine göre derlemeye geldi. Libreboot’un web sitesindeki adreslerin [6] birinden (yakın lokasyon olmadığı için herhangi biri seçilebilir) bendeki entegreye uygun olan iki farklı dosya indirdim:
- “/release/stable/20160907/” dizinindeki “util” kelimesini içeren dosya
- “/release/stable/20160907/rom/grub/” dizinindeki “x200_4mb” içeren dosya
Bilgisayarım x200 ve içindeki entegre 8 bacaklı olduğu için x200_4mb içeren dosyayı indirdim. Entegrem 16 bacak olsaydı, “x200_8mb” içeren dosyayı indirmem gerekirdi. İndirilecek dosyalarla ilgili bilgi takip ettiğim kaynakta da yer alıyor. Bunun yanında şuradaki resim dizisinde de indirilecek dosyalar belirtiliyor.
Gerekli dosyaları indirdikten sonra, her iki dosyayı aşağıdaki komutlarla arşivden çıkardım. Çünkü iki dosyada sıkıştırılmış olarak indirilmişti.
1tar xf util-isimli-dosya.tar.xz
2tar xf x200_4mb-isimli-dosya.tar.xz
Bu iki dosyanın bulunduğu dizinde kendi isimlerinde klasörler oluştu. Kenara not ettiğim mac adresi ile bazı dosyaları üretmek üzere “util” isimli klasörde “ich9deblob/x86_64” dizinine girip, aşağıdaki komutu çalıştırdım:
1./ich9gen --macaddress 11:11:11:11:11:11</code></pre>
Bu komut çalıştırdığımda, aynı dizinde sonu “gbe” ile biten 6 adet yeni dosya oluşturuldu. Bu dosyalardan entegreme uygun olan, ich9fdgbe_4m.bin dosyasını kullanıcı dizininde oluşturduğum “/work” isimli klasöre kopyaladım.
Util klasöründe işim bitmişti. Ardından arşivden çıkardığım diğer klasöre girdim. Buradaki dosyalardan, türkçe klavye için bir seçenek olmadığından içinde usqwerty olan “x200_4m_usqwerty_vesafb.rom” adlı dosyayı “/work” klasörüne kopyaladım. Bu işlemle birlikte “/work” klasöründe toplam 2 dosya oldu.
“/work” dizinine kopyaladığımız libreboot ROM dosyası üzerinde MAC adresi değişikliği yapmak için “work” klasöründe iken aşağıdaki komutu çalıştırdım.
1dd if=ich9fdgbe_4m.bin of=x200_4m_usqwerty_vesafb.rom bs=1 count=12k conv=notrunc
Yukarıdaki komutun çalıştırılması ile birlikte, “/work” klasöründe MAC ayarları yapılmış yeni bir rom dosyası (mac_degisikligi_yapılmıs_rom_dosyasi.rom) oluşturuldu. Yeni oluşturulan dosyayı “scp” komutu ile RPi’deki “x200” klasörüne gönderdim.
FlashROM
Entegreyi silip yeni ROM dosyasını yazmak üzere, SSH ile tekrar RPi ‘ye bağlandım. “x200” klasörüne mac_degisikligi_yapılmıs_rom_dosyasi.rom dosyası gelmişti. Bu dosyayı yazmadan önce işi sağlama almak için o anda entegrede bulunan ROM’un kopyasını almak üzere aşağıdaki kodu çalıştırdım.
1flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128 -r flash01.bin -V
Bu komut çalıştırıldıktan sonra “flash01.bin” adında yeni bir dosya oluşması gerekiyor. Takip ettiğim dokümanda ve diğer dokümanlarda bu komut çıktı dosya ismi farklı olmak koşulu (flash02.bin, flash03.bin) ile iki kez daha çalıştırılıyor. Ve oluşan üç dosyanın md5sum’ları karşılaştırılarak dosyaların aynılık ve sağlamlık durumu doğrulanmış oluyor.
Tabii üst paragrafta anlattığım sonuç olması gereken sonuç. Hayaller ve hayatlar farklı tabii. Yukarıdaki komutu ben çalıştırdığımda ne oldu peki? Dananın kuyruğu koptu: flashrom entegreyi göremedi (Şekil 7) – No EEPROM/flash device found. Bundan sonraki uğraşlarım tüm günümü aldı. Bu işin en yorucu kısmıydı; problemin ne olduğunu bulmak.
Araştırdığımda karşılaştığım hatayı birçok kişinin aldığını gördüm. Birçoğu problemi, entegreyi harici güç kaynağı bağlayarak çözmüştü, bazıları ise komuttaki hız parametresi (spispeed) ile oynayarak 7. Ben de bunlara dayanarak, Arduino’nun 3.3v çıkışını kullanarak entegreyi ayrıca besledim. Ama yine olmadı. Hız değiştirdim olmadı. Olmadı da olmadı. Sonunda flashrom’un IRC kanalına sorunu yazdım. Hemen cevap geldi. Kanalın yöneticilerinden biri (@Hellsenberg), devreyi tekrar kontrol etmemi söyleyince sorunu anladım. RPi’deki pinleri sayarken bir pin eksik sayarak bağlantıları kurmuşum. Tekrar sayınca 10,11,12 ye bağlamam gereken kabloları 9,10,11 ‘ye bağladığımı farkettim ve düzeltince sorun kalmadı (Şekil 9). Bunu bulmak saatlerimi aldı. Hep öyle olur zaten değil mi?
Şekil 9’da da görüldüğü gibi flashrom, entegre için iki farklı tanım buldu, benim entegrem için uygun olan seçenek “MX25L3205(A)” idi. O yüzden yukarıdaki komutu aşağıdaki gibi revize ederek tekrar çalıştırdım.
1flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128 -c "MX25L3205(A)" -r flash01.bin -V
Adımlarımı artık IRC ‘de sorarak atıyordum. Komutu üç defa çalıştırmamın anlamsız olduğunu komuttaki “V” parametresinin zaten doğrulama işlemini yaptığını belirtti “Hellsenberg”. O yüzden bir defa çalıştırdım ve backup dosyası (flash01.bin) oluşturuldu. İşlem uzun sürünce hızı 512’ye çıkarmayı denedim. Ama hızı arttırdığımda flashrom, entegreyi görmüyordu. O yüzden 128 ile yoluma devam ettim.
Artık yeni oluşturduğum rom dosyasını mac_degisikligi_yapılmıs_rom_dosyasi.rom
flashrom ile entegreye yazma vakti gelmişti. Kader anıydı, nefesimi tutup aşağıdaki komutu çalıştırdım:
1sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=128 -c "MX25L3205(A)" -w mac_degisikligi_yapılmıs_rom_dosyasi.rom -V
Uzun sürdü. FAILED’ler görmeye başladım. Entegre içindeki yazılımı silemiyordu. Farklı silme fonksiyonları deniyordu ve sonunda “FUNCTION 2” halletti işi. Fonksiyon 2 ye çok teşekkür ederim. Çıktısı Şekil 10’da.
İşlem bittikten sonra bağlantıları temizleyip, bilgisayarı tekrar toparladım. Ve sonuç:
Kaynaklar
- https://www.raspberrypi.org/documentation/remote-access/ssh/
- https://www.raspberrypi-spy.co.uk/2014/08/enabling-the-spi-interface-on-the-raspberry-pi/
- https://github.com/flashrom/flashrom
- https://libreboot.org/docs/install/x200_external.html
- https://www.youtube.com/watch?v=_qX1LHreBI0
- https://libreboot.org/download.html
- https://www.reddit.com/r/libreboot/comments/77iygk/flashrom_and_x200_no_eeprom_device_found/