2017-10-18 19 views
8

Rafine SoruMTD Silme Blok Boyutu

nasıl okumak ve silme blok boyutu sıfır olan bir MTD SRAM cihazından metin bilgileri yazıyorsunuz?

Notlar: Ben libmtd sıfır

  • Denemesi bir silme blok boyutunu işleyemez, çünkü yapay olarak silme blok eklemek için MTD-Util araçları başarısız olmuş kullanmak
  • girişimleri 23K256 Sürücü kullanıyorum

    1. boyutu da başarısız tek çöp
    2. ürettiler mtdblock için echo > ve cat kullanımı
    3. girişimleri (aşağıya bakınız)

    Orijinal Linux çalıştıran bir ARM işlemcisine bağlı bir SRAM çipini okumaya ve yazmaya çalışıyorum. SRAM ile bir dosya, seri aygıt veya bellek bölümü gibi arayüz oluşturmama umurumda değil. SRAM çipi için mevcut cihaz sürücüsü cihazı bir MTD olarak kaydeder. Ben /proc/mtd denetleyerek bu doğrulanmadı:

    ~# cat /proc/mtd 
    dev: size erasesize name 
    mtd0: 00020000 00000000 "spi1.0" 
    

    Ben MTD utils'i kullanarak MTD biçimlendirmek için bir öğretici buldum. Bu cihazın bakarken tüm kullanıcı uzay MTD/UBI/JFF2 araçları kazasında çünkü yaşıyorum sorun, ben SRAM/MTD cihazla arayüzü olamaz IE geçerli:

    ~# mtdinfo 
    Count of MTD devices:   1 
    Floating point exception (core dumped) 
    

    Bu istisna meydana görünüyor çünkü tüm MTD yardımcı programları libmtd kullanıyor. Libmtd'deki mtd_get_dev_info1 işlevi, silme bloğu boyutuyla böler ve benim durumumda silme bloğu boyutu sıfırdır.

    mtd->eb_cnt = mtd->size/mtd->eb_size; 
    

    bu çip MTD sürücüsü sahip olsa da, ben yazma döngüleri bir endişe olduğunu sanmıyorum ve silme blok sıfır olmasının nedeni de bu.

    1. i programları doğru çalışması için çipini bir silme blok boyutunu vermek için sürücüyü değiştirmek olmalı: bu yüzden sorularım şunlardır? Eğer öyleyse ne büyüklük?
    2. Sıfır silme bloğu boyutunu yok saymak için libmtd'u değiştirmeliyim? Eğer öyleyse ne eb_cnt ayarlamalıyım?
    3. MTD cihazına veri okumak ve yazmak için daha iyi bir yol var mı?

    Ek Notlar:

    1. Stabilite Bir echo test > /dev/mtdblock0 ve cat /dev/mtdblock0 yapmaya çalıştım ve çöp

    Güncelleme 10 başka birşey

  • benim durumda optimum performans daha önemlidir/20 Sürücüdeki silme bloğu boyutunu 1 olarak değiştirdim (4000 olarak değiştirmek istedim ama birimleri hakkında emin değildim. MTD Utils artık daha önce verilen istisnayı alamaz.

    ~# mtdinfo 
    Count of MTD devices:   1 
    Present MTD devices:   mtd0 
    Sysfs interface supported:  yes 
    

    ubiformat başarısız oluyor Ancak:

    ~# ubiformat /dev/mtd0 
    ubiformat: mtd0 (ram), size 131072 bytes (128.0 KiB), 131072 eraseblocks of 
    1 bytes, min. I/O size 1 bytes 
    libscan: scanning eraseblock 0 -- 0 % complete libmtd: error!: bad offset 
    0 or length 64, mtd0 eraseblock size is 1 
    ubiformat: error!: failed to scan mtd0 (/dev/mtd0) 
    

    Güncelleme # Maalesef

    ubiformat çalıştırdıktan sonra çökmesine neden çekirdek (aslında 0x4000) 4000 silme blok boyutunun ayarlanması 2 10/20
    ~# ubiformat /dev/mtd0 
    ubiformat: mtd0 (ram), size 131072 bytes (128.0 KiB), 8 eraseblocks of 16384 
    bytes (16.0 KiB), min. I/O size 1 bytes 
    libscan: scanning erasebUnable to handle kernel NULL pointer dereference at 
    virtual address 00000000 
    libscanpgd = 8cc6c000te 
    libscan: scanning eras[00000000] *pgd=8cbbb835, *pte=00000000, *ppte=00000000 
    libscan: scanning eInternal error: Oops: 80000007 [#1] PREEMPT SMP ARM 
    

    Güncelleştirme 10/23 Ben fdisk ile normalde sürücüyü biçimlendirmek, ancak silindir olmaması ile ilgili elde hatalar gibi görünüyor çalıştı:

    veri /dev/mtdblock0 okunan yazılı ve edilecek kez izin sabit altta yatan donanım sorun oluştu
    :~# fdisk /dev/mtdblock0 
    ... 
    Command (m for help): p 
    Disk /dev/mtdblock0: 0 MB, 131072 bytes 
    255 heads, 63 sectors/track, 0 cylinders 
    Units = cylinders of 16065 * 512 = 8225280 bytes 
         Device Boot  Start   End  Blocks Id System 
    Command (m for help): n 
    Unknown value(s) for: cylinders (settable in the extra functions menu) 
    
  • +2

    (uzman modunu kullanarak etrafında almak mümkün olabilir) mantıksal olarak gerçek silme boyutu "geçerli değildir" belleğin adreslenebilir genişliği olurdu - çoğu mimaride 1 bayt. Ancak, SLRAM sürücüsü, muhtemelen bir MMU sayfalarını izleyen 4k olan blok boyutunu kullanır gibi görünüyor. –

    +0

    Silme bloğu boyutunu 4K olarak ayarlamak ve ne olacağını bildirmek için sürücüyü değiştireceğim. –

    +0

    +1 için @ChrisStratton fikri, bu 4K sesleri makul bir şekilde yazmak üzereydi, ancak neden bu tür bir ara yüzün kullanıldığını bilmiyorum. – 0andriy

    cevap

    0

    cihaz. Bu, yazmak için echo TEST > /dev/mtdblock0 ve okumak için cat /dev/mtdblock kullanılarak doğrulandı. İşte

    çip hala cat /dev/mtdblock0 çağrısından çıktı doğru miktarda üretecek 23K256 sürücü arızalı ise bu sorunu

    1. araştırma sırasında bulunan diğer hataların özetidir. Gerçek başlatılmamış çip çıkışı rastgele olacakken, çıktı aynı olacaktır.
    2. mtd-utils'un tümü de dahil olmak üzere libmtd kullanan tüm uygulamalar, sıfırlama blok boyutu sıfır olan bir MTD aygıtlarıyla çalışırken hata verir.
    3. SRAM silme bloğu boyutunu sürücüsünde 0x4000 olarak ayarlamak, bu sorunu düzeltebilir. 1'in silme boyutu kabul edilemezdi.
    4. fdisk silindir boyutu 0 olması nedeniyle hata olacaktır siz 0 özel tanınması için umut sürece