> ## Documentation Index
> Fetch the complete documentation index at: https://docs.t3gemstone.org/llms.txt
> Use this file to discover all available pages before exploring further.

# EEPROM

> Elektriksel Olarak Silinebilir Programlanabilir Salt Okunur Bellek

<Tip>
  Bölüm bitiminde aşağıdaki konularda deneyim kazanacaksınız.

  * Gemstone'da bulunan EEPROM'un teknik özellikleri ve kullanım örnekleri
</Tip>

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.

<Note>
  SD Kartlar ve USB Flash bellekler içinde depolanan veriyi 10 yıla kadar bozulmadan saklayabilirken AT24C512C
  model eeprom 40 yıl bozulmadan saklayabilir.
</Note>

## 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](/tr/faq#device-tree-nedir)'de aşağıdaki gibi tanımlanmıştır.

```c++ lines theme={"system"}
&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.

```bash highlight=5 theme={"system"}
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
```

<Note>
  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.
</Note>

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.

```bash highlight=11 theme={"system"}
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.

<Note>
  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.
</Note>

```bash theme={"system"}
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
```

<Note>
  `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.
</Note>

Aşağıdaki komutla EEPROM'a veri yazılabilmektedir.

```bash theme={"system"}
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.

```bash theme={"system"}
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.

<CodeGroup>
  ```Python Python lines theme={"system"}
  #!/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)
  ```

  ```C C/C++ lines theme={"system"}
  #include <stdio.h>

  #define EEPROM_SIZE 65536

  const char* EEPROM_DEST = "/sys/bus/i2c/drivers/at24/2-0051/eeprom";

  int main()
  {
      char eeprom_buffer[EEPROM_SIZE] = {0};
      
      // Write
      FILE* eeprom = fopen(EEPROM_DEST, "w");
      fprintf(eeprom, "Read-Write Example of EEPROM\n");
      fclose(eeprom);
      
      // Read
      eeprom = fopen(EEPROM_DEST, "r");
      fread(eeprom_buffer, 1, EEPROM_SIZE, eeprom);
      printf("Data: %s\n", eeprom_buffer);
      fclose(eeprom);
      
      return 0;
  }
  ```
</CodeGroup>
