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)