Bölüm bitiminde aşağıdaki konularda deneyim kazanacaksınız.
- Gemstone’da bulunan EEPROM’un teknik özellikleri ve kullanım örnekleri
EEPROM’lar genelde dosya sistemi içermemeleri, boot esnasında hızlı erişilebilir olmaları, yazılan veriyi çok uzun
süre bozulmadan saklayabilmesi gibi sebeplerle bulundukları kartta ayarlanabilecek donanımsal veya yazılımsal
parametreleri, karta özel bilgileri (ürün tipi, ürün seri numarası vb.) veya firmware’leri (BIOS vb.) depolamak
için kullanılırlar.
SD Kartlar ve USB Flash bellekler içinde depolanan veriyi 10 yıla kadar bozulmadan saklayabilirken AT24C512C
model eeprom 40 yıl bozulmadan saklayabilir.
EEPROM Kullanımı
Kart üzerinde AT24C512C modelli 512-Kbit (64KiB) SOC’ye I2C hattı üzerinden bağlı bir EEPROM
mevcuttur. Linux üzerinde kullanılabilmesi için gerekli sürücüler yüklü olarak bulunmakta olup Device Tree’de
aşağıdaki gibi tanımlanmıştır.
&wkup_i2c0 {
eeprom@51 {
compatible = "atmel,24c512";
reg = <0x51>;
};
}
Kartın terminaline bağlandıktan sonra aşağıdaki komut çalıştırıldığında 2-0051
isimli klasör görülmelidir.
gemstone@t3-gem-o1:~$ ls /sys/bus/i2c/drivers/at24/
total 0
drwxr-xr-x 2 root root 0 Apr 7 2022 ./
drwxr-xr-x 66 root root 0 Apr 7 2022 ../
lrwxrwxrwx 1 root root 0 Jul 9 14:35 2-0051 -> '../../../../devices/platform/bus@f0000/bus@f0000:bus@b00000/2b200000.i2c/i2c-2/2-0051'/
lrwxrwxrwx 1 root root 0 Jul 9 14:35 module -> ../../../../module/at24/
--w------- 1 root root 4.0K Jul 9 14:35 bind
--w------- 1 root root 4.0K Apr 7 2022 uevent
--w------- 1 root root 4.0K Jul 9 14:35 unbind
Klasör ismindeki 2
EEPROM’un 2 numaralı i2c hattında (yani wkup_i2c0) olduğunu 0051
ise i2c adresinin 0x51
olduğunu göstermektedir.
Aşağıdaki örnekte belirtilen eeprom
isimli dosya at24
sürücüsü tarafından
üretilir ve EEPROM’a Linux üzerinden bir dosya olarak ulaşılabilmesini okuma yazma imkanı sağlar.
gemstone@t3-gem-o1:~$ ls /sys/bus/i2c/drivers/at24/2-0051/
total 0
drwxr-xr-x 4 root root 0 Apr 7 2022 ./
drwxr-xr-x 7 root root 0 Apr 7 2022 ../
drwxr-xr-x 3 root root 0 Apr 7 2022 2-00511/
lrwxrwxrwx 1 root root 0 Jul 9 14:54 driver -> ../../../../../../../bus/i2c/drivers/at24/
lrwxrwxrwx 1 root root 0 Jul 9 14:54 of_node -> '../../../../../../../firmware/devicetree/base/bus@f0000/bus@b00000/i2c@2b200000/eeprom@51'/
drwxr-xr-x 2 root root 0 Jul 9 14:54 power/
lrwxrwxrwx 1 root root 0 Apr 7 2022 subsystem -> ../../../../../../../bus/i2c/
lrwxrwxrwx 1 root root 0 Jul 9 14:54 supplier:regulator:regulator.0 -> ../../../../../../virtual/devlink/regulator:regulator.0--i2c:2-0051/
-rw------- 1 root root 4.0K Jul 9 14:54 eeprom
-r--r--r-- 1 root root 4.0K Jul 9 14:54 modalias
-r--r--r-- 1 root root 4.0K Apr 7 2022 name
-rw-r--r-- 1 root root 4.0K Apr 7 2022 uevent
Terminal Üzerinden EEPROM Kullanımı
Aşağıdaki komut ile EEPROM tamamen temizlenir.
T3-GEM-O1 kartta kullanılan eeprom 512 kilobitlik (64KiB) olduğu için count (yazılacak bayt sayısı)
65536(64 x 1024) verilmiştir.
gemstone@t3-gem-o1:~$ sudo dd if=/dev/zero of=/sys/bus/i2c/drivers/at24/2-0051/eeprom bs=1 count=65536 status=progress
[sudo] password for gemstone:
65493 bytes (65 kB, 64 KiB) copied, 356 s, 0.2 kB/s
65536+0 records in
65536+0 records out
65536 bytes (66 kB, 64 KiB) copied, 356.235 s, 0.2 kB/s
dd
çıktısından görüldüğü üzere eeprom yazma hızı 0.2 kB/s
yani saniyede 200 bayt yazabiliriz.
Eepromların bir dezavantajları da yazma hızlarının çok düşük olmasıdır.
Aşağıdaki komutla EEPROM’a veri yazılabilmektedir.
gemstone@t3-gem-o1:~$ echo "Gemstone EEPROM" | sudo tee /sys/bus/i2c/drivers/at24/2-0051/eeprom
[sudo] password for gemstone:
Gemstone EEPROM
Okuma işlemi için aşağıdaki komut çalıştırılabilir.
gemstone@t3-gem-o1:~$ sudo cat /sys/bus/i2c/drivers/at24/2-0051/eeprom
Gemstone EEPROM
EEPROM okuma yazma işlemleri için aşağıdaki Python ve C ile kullanım örneklerini inceleyiniz.
#!/usr/bin/python3
eeprom_dest = "/sys/bus/i2c/drivers/at24/2-0051/eeprom"
eeprom_size = 65536
# Write
with open(eeprom_dest, "w") as eeprom:
eeprom.write("Read-Write Example of EEPROM")
# Read
with open(eeprom_dest, "r") as eeprom:
eeprom_data = eeprom.read(eeprom_size)
print("EEPROM Data:", eeprom_data)