Raspberry Pi’ye fazladan ethernet portu eklemenin birden fazla yolu vardır. Fazladan usb portunuz varsa usb-to-ethernet tarzı modüller kullanılabilir. Burada Enc28j60 modülünü, SPI arayüzü kullanarak Rasberry Pi’ ye bağlama yoluyla fazladan bir ethernet arayüzü sağlayacağız. Benim elimde Model B Raspberry Pi cihazı var. Bu nedenle bu uygulamayı onunla yapacağım. Bazı Raspberry Pi modellerinde ethernet yoktur (örneğin Model A). Onlardan birine sahipseniz yine bu yöntemi kullanarak ethernet arayüzü sağlayabilirsiniz.
Enc28j60’ı Dx, Aliexpress gibi Çin kaynaklı sitelerden alabileceğiniz gibi beklemeden Türkiye‘den de alabilirsiniz.
Modülü Rasberry Pi’ye entegre etmeden önce, SPI arayüzüyle haberleşeceğimiz için hızının düşük olacağını bilmemiz gerekiyor. Ekleme işlemi bittiğinde 3 mbit/s civarı bir hıza sahip olacağız. Bu yüzden sadece performans gerektirmeyen işlerde kullanabilirsiniz. Ayrıca uzun süreli kullanımlarda problem yaşanıp yaşanmadığını bilmiyorum.
Kerneli Uygun Şekilde Derlemek
İlk iş olarak kernel derlememiz gerekiyor. Raspberry Pi üzerinde kernel derlemek uzun süreceği için cross-compile tercih ediyoruz. Yani güçlü bir platform üzerinde Raspberry Pi’nin geliştirme araçlarını kullanarak derleme işlemini gerçekleştireceğiz. Bunun için favoriniz olan linux dağıtımını kullanabilirsiniz. Ben Debian tabanlı dağıtımları temel aralarak anlatacağım.
Geliştirme araçlarını herhangi bir yere
[bash]
git clone https://github.com/raspberrypi/tools
[/bash]
komutunu kullanarak indiriyoruz. Eğer bilgisayarınızda git yoksa
[bash]
sudo apt-get install git
[/bash]
komutunu vererek kurabilirsiniz.
Raspberry Pi kaynak kodunu
[bash]
git clone https://github.com/raspberrypi/linux.git
[/bash]
komutuyla indiriyoruz.
Raspberry Pi araç klasörü birkaç çeşit derleme aracı sunar. Bunlar:
-
- tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi
- tools/arm-bcm2708/arm-bcm2708-linux-gnueabi
- tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian
Biz cross-compile için en sonuncusunu kullanacağız.
Terminalde daha sonra kullanmak üzere değişken oluşturuyoruz ki sonra uzun uzun yazmayalım:
[bash]
export CCPREFIX=/home/testuser/raspberry/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-”
[/bash]
Bunu örneğin derleyici versiyonumuzu öğrenmek için kullanabiliriz. Terminale “${CCPREFIX}gcc -v” yazdığımızda aracın versiyonu ekrana gelmiş olmalı.
Şimdi bir konfigürasyon dosyasına ihtiyacımız var. Bu ihtiyacımızı Raspberry Pi üzerinden karşılayabiliriz. /proc/config.gz dosyasını açtığımızda konfigürasyon dosyasını elde ederiz.
[bash]
gunzip -c config.gz .config
[/bash]
“.config” dosyasını Raspberry Pi’den derleme yapacağımız platforma taşıyalım. Daha sonra kernel klasörünüz içinde bcm2708.c dosyasını bulun ve açın. Adresi aşağı yukarı şöyledir:
“kernel_klasörünüz/linux/arch/arm/mach-bcm2708/bcm2708.c”
Favori metin düzenleyicinizle dosyayı açın ve bcm2708_spi_devices[] sözcüğünü aratın. Bulduktan sonra aşağıdaki gibi düzenleyin:
[code]
static struct spi_board_info bcm2708_spi_devices[] = {
#ifdef CONFIG_SPI_SPIDEV
{
.modalias = “enc28j60”,
.max_speed_hz = 12000000,
.bus_num = 0,
.chip_select = 0,
.mode = SPI_MODE_0,
.irq = ((25) + GPIO_IRQ_START),
}, {
.modalias = “spidev”,
.max_speed_hz = 500000,
.bus_num = 0,
.chip_select = 1,
.mode = SPI_MODE_0,
}
#endif
};
[/code]
Düzenleme bittikten sonra kaydedip “kernel_klasörünüz/linux/drivers/net/ethernet/microchip/enc28j60.c” dosyasını açın ve “request_irq” sözcüğünü aratın aşağıdaki gibi değiştirin:
[code]
ret = request_irq(spi->irq, enc28j60_irq, IRQF_TRIGGER_FALLING, DRV_NAME, priv);
[/code]
“.config” dosyasını derleme yapacağımız ortama almıştık. Kendi kernel klasörümüz neredeyse onun içine “.config” dosyasını atıyoruz. “kernel_klasörünüz/linux/.config” şeklinde bir yola sahip olması gerekiyor.
.config dosyasını herhangi bir metin düzenleyiciyle açıyoruz. "CONFIG_ENC28J60"
cümleciğinin başında # işareti varsa kaldırıyoruz. Aşağıdaki değişiklikleri yapıyoruz.
[bash]
CONFIG_ENC28J60=m
CONFIG_ENC28J60_WRITEVERIFY=y
[/bash]
[bash]
ARCH=arm CROSS_COMPILE=${CCPREFIX} make oldconfig
[/bash]
komutunu giriyoruz. Eğer herhangi bir soruyla karşılaşırsanız tavsiye edilen seçimle devam edin.
Artık kernel’i derleyebiliriz. -j parametresini kullanarak bu işlemi multi-core olarak yapabiliriz.
“ARCH=arm CROSS_COMPILE=${CCPREFIX} make -k -j 9”
İşlem biraz uzun sürebilir. Her şey yolunda gittiyse artık modüller kurulabilir. Bunu aşağıdaki komutla yapıyoruz:
[code]
ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=kernel_klasörünüz/modules make modules_install
[/code]
Kernel imajı oluşturmak için aşağıdaki komutları kullanıyoruz.
[code]
cd ../tools/mkimage/
./imagetool-uncompressed.py ${KERNEL_SRC}/arch/arm/boot/zImage
[/code]
Şimdi oluşan dosyaları Raspberry Pi’ye taşıyabiliriz. Taşınması ve değiştirilmesi gereken dosyalar şu şekildedir:
Derleme Platformu -> Raspberry Pi
kernel_klasörünüz/tools/mkimage/kernel.img -> /boot/kernel.img
kernel_klasörünüz/modules/lib/firmware -> /lib/firmware
kernel_klasörünüz/modules/lib/modules -> /lib/modules
Rasberry Pi’yi baştan başlatabilirisiniz. Yeni kernel kullanıma hazır olacaktır.
Ethernet Modülünü Bağlama İşlemi
Derleme işleminden sonra artık pin haritasına geçebiliriz. Pin bağlama işlemini Raspberry Pi kapalıyken yapınız.
ENC28J60 – Rasberry Pi
=======
VCC – 3v3 (pin 1)
GND – GND ( pin 9)
CS – CE0 (gpio 8 / pin 24)
SI – MOSI (gpio 10 / pin 19)
SCK – SCKL (gpio 11 / pin 23)
SO – MISO (gpio 9 / pin 21)
INT – GPIO25 (pin 22)
Eğer bu kadar işlemi hatasız şekilde gerçekleştirdiyseniz Raspberry Pi açıldığında “ifconfig” komutunu verdiğinizde arayüzü orada görmüş olacaksınız.
Raspberry Pi 3.18.7+ kernel için derlenmiş dosyaları aşağıda paylaşıyorum. Bu dosyalarla, dosya değiştirme işlemini ve ethernet modülü bağlama başlığı altındakileri yapmanızın modülü çalıştırmak için yeterli olacağını düşünüyorum.
Raspberry Pi Zero için yapımı kolay bir örnek var, muhtelemelen diğer modeller için de uygundur. Şuradan inceleyebilirsiniz.