2017-10-18 16 views
8

Refined Câu hỏiMTD Erase Khối Kích thước của zero cho SRAM

Làm thế nào để đọc và ghi thông tin văn bản từ một thiết bị SRAM MTD với khối erase kích thước không?

Ghi chú:

  1. Tôi đang sử dụng trình điều khiển 23K256
  2. Nỗ lực để sử dụng công cụ MTD-util đã thất bại vì libmtd không thể xử lý một kích thước khối erase của zero
  3. nỗ lực để thêm nhân tạo một khối erase kích thước cũng không thành công (xem bên dưới)
  4. Cố gắng sử dụng echo >cat đến mtdblock chỉ sản xuất rác thải

gốc Tôi đang cố gắng để đọc và ghi vào một chip SRAM kết nối với một bộ xử lý ARM chạy Linux. Tôi không quan tâm nếu tôi giao diện với SRAM như một tập tin, thiết bị nối tiếp hoặc phân vùng bộ nhớ. Trình điều khiển thiết bị hiện tại cho chip SRAM đăng ký thiết bị dưới dạng MTD. Tôi xác nhận điều này bằng cách kiểm tra /proc/mtd:

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

Tôi tìm thấy một hướng dẫn để định dạng MTD sử dụng MTD utils. Vấn đề tôi đang gặp là tôi không thể giao tiếp với các thiết bị/MTD SRAM vì tất cả các MTD sử dụng không gian/UBI/công cụ JFF2 sụp đổ khi nhìn vào thiết bị này, IE:

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

ngoại lệ này dường như xảy ra vì tất cả các tiện ích MTD đều sử dụng libmtd. Hàm mtd_get_dev_info1 trong libmtd chia cho kích thước khối xóa và trong trường hợp của tôi, kích thước khối xóa là bằng không.

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

Mặc dù chip này có trình điều khiển MTD, tôi không nghĩ rằng chu trình ghi là một mối quan tâm và đó là lý do khối xóa là zero. vì vậy câu hỏi của tôi là như sau:

  1. Tôi có nên sửa đổi trình điều khiển để cung cấp cho chip kích thước khối xóa để tiện ích hoạt động chính xác không? Nếu vậy kích cỡ nào?
  2. Tôi có nên sửa đổi libmtd để bỏ qua kích thước khối xóa không? Nếu vậy tôi nên đặt số eb_cnt thành gì?
  3. Có cách nào tốt hơn để đọc và ghi dữ liệu vào thiết bị MTD không?

Ghi chú thêm:

  1. ổn định là quan trọng hơn hiệu suất tối ưu trong hoàn cảnh của tôi
  2. Tôi cố gắng để làm một echo test > /dev/mtdblock0cat /dev/mtdblock0 và có gì nhưng rác

Cập nhật 10/20 Thay đổi kích thước khối xóa thành 1 trong trình điều khiển (Tôi muốn thay đổi thành 4000 , nhưng tôi không chắc chắn về các đơn vị). MTD Utils không còn ném ngoại lệ được đưa ra trước đây nữa.

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

Tuy nhiên ubiformat không thất bại:

~# 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) 

Update # 2 10/20 Đáng tiếc là thiết lập kích thước khối erase đến 4000 (trên thực tế 0x4000) gây ra hạt nhân sụp đổ sau khi chạy ubiformat

~# 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 

Cập nhật 10/23.210 Tôi cố gắng để định dạng ổ đĩa bình thường với fdisk, nhưng dường như nhận được các lỗi liên quan đến việc thiếu xi lanh:

:~# 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

Trừ khi bạn đang hy vọng cho một sự thừa nhận đặc biệt từ 0 là "không áp dụng" một cách logic kích thước thực tế erase sẽ là chiều rộng địa chỉ của bộ nhớ - trên hầu hết các kiến ​​trúc 1 byte. Tuy nhiên, trình điều khiển SLRAM dường như sử dụng kích thước khối của nó là 4k, có thể là sau từ một trang MMU. –

+0

Tôi sẽ sửa đổi trình điều khiển để đặt kích thước khối xóa thành 4K và báo cáo lại những gì sẽ xảy ra. –

+0

+1 với ý tưởng @ChrisStratton, sắp viết 4K âm thanh hợp lý, mặc dù tôi không chắc chắn tại sao nó lại sử dụng loại giao diện đó ngay từ đầu. – 0andriy

Trả lời

0

Có một vấn đề phần cứng cơ bản rằng một khi cố định cho phép dữ liệu được viết và đọc từ /dev/mtdblock0 thiết bị. Điều này đã được xác minh bằng cách sử dụng echo TEST > /dev/mtdblock0 để viết và cat /dev/mtdblock để đọc.

Dưới đây là một bản tóm tắt của các lỗi khác được tìm thấy trong khi nghiên cứu vấn đề này

  1. Nếu chip là trục trặc driver 23K256 vẫn sẽ sản xuất đúng số lượng đầu ra từ một cuộc gọi cat /dev/mtdblock0. Đầu ra sẽ giống nhau, trong khi đầu ra chip chưa được khởi tạo thực tế sẽ là ngẫu nhiên.
  2. Tất cả các ứng dụng sử dụng libmtd, bao gồm tất cả các mtd-utils, sẽ lỗi khi xử lý các thiết bị MTD có kích thước khối xóa bằng 0.
  3. Đặt kích thước khối xóa SRAM giả tạo thành 0x4000 trong trình điều khiển có thể khắc phục sự cố này. Xóa kích thước của 1 là không thể chấp nhận được.
  4. fdisk sẽ báo lỗi do kích thước xi lanh là 0 (có thể có thể để có được xung quanh sử dụng chế độ chuyên gia)
Các vấn đề liên quan