Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
50,11 KB
Nội dung
Lưu trữ liệu: Lưu trữ hệ thống nhúng thực cách sử dụng ROM cho việc lưu trữ đọc-mã NVRAM cho việc lưu trữ cho đọc-ghi liệu Tuy nhiên, thay công nghệ flash, cung cấp nonvol mật độ cao atile lưu trữ Những lợi kết hợp với chi phí thấp đèn flash có cách sử dụng tăng lên đáng kể hệ thống nhúng Chương bàn hệ thống lưu trữ chủ yếu thiết bị đèn flash hệ thống tập tin khác có sẵn Linux có nghĩa cho hệ thống nhúng Chương chia thành bốn phần + Flash nhúng đồ cho Linux +Sự hiểu biết MTD (Memory Cơng nghệ điều khiển) có nghĩa hệ thống chủ yếu cho thiết bị đèn flash + Sự hiểu biết hệ thống tập tin liên kết với hệ thống nhúng Ở chuyên hệ thống tập tin nhớ flash bo mạch cho nhúng hệ thống +Chỉnh cho không gian lưu trữ thêm: kỹ thuật để siết chặt thêm chương trình lên đèn flash bạn 1.1 Flash Bản đồ Trên hệ thống Linux nhúng, đèn flash thường sử dụng cho: + Lưu trữ tải khởi động + Lưu trữ hình ảnh hệ điều hành + Lưu trữ ứng dụng ứng dụng thư viện hình ảnh + Lưu trữ đọc-ghi tập tin (có liệu cấu hình) Trong phần , phần thứ đọc cho hầu hết hệ thống thực thi thời gian (ngoại trừ lần nâng cấp) Đó bạn sử dụng tải khởi động bạn nên có hai phân vùng: có tải khởi động khác nắm giữ hệ thống tập tin gốc Các phận đèn flash mơ tả đồ flash Tại đầu dự án bạn, bạn đến với đồ flash Một đồ flash sửa lỗi nhớ đồ làm bạn có kế hoạch phân vùng đèn flash để lưu giữ liệu làm bạn có kế hoạch để truy cập vào liệu Sau vấn đề thiết kế khác đến bạn cố gắng đóng băng đồ flash Làm bạn muốn phân vùng đèn flash? Bạn có hệ điều hành, appli - Cation, đọc-ghi ảnh phân vùng điều làm tăng nguy làm hư hỏng liệu tồn hệ thống tồn phân vùng đọc -ghi Mặt khác bạn đọc liệu phân vùng riêng biệt đọc-ghi phân vùng riêng để việc đọc liệu an toàn từ nhiễm; sau bạn cần sửa chữa kích thước phân vùng đảm bảo kích thước phân vùng không vượt điểm tương lai - Làm bạn muốn truy cập phân vùng nguyên bạn muốn sử dụng hệ thống tập tin? Nguyên phân vùng có ích cho nạp khởi động khơng địi hỏi bạn phải có hệ thống tập tin, bạn đánh dấu khu vực đèn flash cho giữ liệu cấu hình khởi động phần lại ngành để giữ khởi động mã Tuy nhiên, phân vùng Linux nắm giữ liệu, an tồn để qua hệ thống tập tin Những hệ thống tập tin bạn chọn cho liệu đóng vai trò quan trọng tờ đồ flash - Làm bạn muốn nâng cấp nào? Nâng cấp hệ thống nhúng thực hệ thống chạy từ khởi động Trong trường hợp nâng cấp bạn liên quan đến việc thay đổi đọc liệu tốt để phân vùng flash thành đọc đọc-ghi phân vùng để bạn lưu phục hồi đọc-ghi liệu 1,2 MTD- ( Memory technology devices ) MTD viết tắt Công nghệ thiết bị nhớ, hệ thống sử dụng để xử lý thiết bị lưu trữ tàu Chính xác cơng việc MTD và làm để bạn bao gồm thiết bị đèn flash theo MTD hệ thống con? Làm để đặt hệ thống tập tin thiết bị MTD? Sau phần trả lời cho câu hỏi 1.2.1 Các Mẫu MTD Mặc dù thiết bị đèn flash thiết bị lưu trữ đĩa cứng, có số khác biệt chúng + Thông thường ổ đĩa cứng có khu vực kinh tế mà chia kích thước trang 4.096 byte Giá trị tiêu chuẩn 512 byte Các mơ hình hệ thống tập tin Linux, đặc biệt nhớ cache đệm (cache nhớ hệ thống tập tin thiết bị khối lớp), dựa giả định Flash chip Mặt khác có kích cỡ khu vực kinh tế lớn; kích thước chuẩn 64 K + Flash lĩnh vực bình thường xố hoàn toàn trước viết thư họ; cách viết xóa hoạt động độc lập tùy thuộc vào phần mềm sử dụng đèn flash +Flash chip có đời giới hạn quy định điều khoản số, khu vực kinh tế lần bị xóa Vì vậy, lĩnh vực cụ thể nhận văn thường xuyên tuổi thọ rút ngắn Để ngăn chặn này, viết cho đèn flash cần phải phân phối cho tất lĩnh vực Điều gọi mặc san lấp mặt không hỗ trợ thiết bị khối +Bình thường hệ thống tập tin sử dụng đèn flash thơng qua nhớ cache đệm Bình thường đĩa IO chậm; để tăng tốc độ lên nhớ cache nhớ gọi cửa hàng đệm cache IO liệu vào đĩa Trừ liệu flushed trở lại đĩa, hệ thống tập tin khơng phù hợp nói Tuy nhiên, hệ thống nhúng cung off mà khơng tắt máy phù hợp cịn có liệu phù hợp; thường tập tin hệ thống thiết bị chặn mơ hình khơng tốt với nhúng hệ thống Các phương pháp truyền thống để truy cập flash sử dụng để thông qua FTL( Flash Translation Layer) Lớp mô thiết bị chặn hành vi đèn flash để có hệ thống tập tin thường xuyên làm việc thiết bị đèn flash, thay việc thay đổi trình điều khiển cấp thấp giới thiệu lớp dịch, thay đổi ứng dụng sử dụng thiết bị nhớ họ có.Các hệ thống phụ MTD chia hành hai phần: driver ứng dụng Các thiết bị cho phép thiết bị nhớ truy cập trực tiếp sử dụng tiêu chuẩn mở / đọc / ghi / ioctl gọi Nhưng trường hợp bạn muốn gắn kết hệ thống tập tin thường xuyên nhớ điện thoại sử dụng phương pháp truyền thống, bạn mount cách sử dụng khối điều khiển Hai thiết bị mà hỗ trợ MTD: chip flash đĩa flash 1.2.2 Flash Chips Flash thiết bị theo hai hương vị: flash NAND NOR Mặc dù hai người số họ đến khoảng thời gian (NOR giới thiệu Intel NAND Toshiba vào cuối năm 1980), NOR nhanh chóng bắt kịp với giới nhúng dễ dàng sử dụng Tuy nhiên hệ thống nhúng tiến hóa để có lưu trữ lớn (như máy nghe nhạc máy ảnh kỹ thuật số), flash NAND trở thành phổ biến cho ứng dụng lưu trữ liệu Lớp MTD phát triển ban đầu xung quanh đèn flash NOR, hỗ trợ cho NAND bổ sung sau Chip NOR theo hai hương vị: cũ không CFI chip CFI tuân thủ CFI thường gặp viết tắt Flash diện chuẩn cơng nghiệp đảm bảo khả tương thích chip flash đến từ nhà bán Flash chip thiết bị nhớ khác giai đoạn tiến hóa với chip thay cũ nhanh chóng; bao gồm viết lại trình điều khiển đèn flash Thường thay đổi cấu hình thay đổi xóa timeouts, khối kích cỡ Các tiêu chuẩn CFI giới thiệu cho phép nhà cung cấp đèn flash cho phép liệu cấu hình đọc từ thiết bị đèn flash Vì vậy, hệ thống phần mềm tra hỏi thiết bị đèn flash cấu hình lại MTD hỗ trợ CFI tập lệnh Intel AMD 1.2.3 Flash Disk Ổ Flash giới thiệu cho ứng dụng lưu trữ hàng loạt Như tên gọi họ cho thấy, ổ đĩa flash có nghĩa ổ đĩa cục hệ thống dựa công nghệ flash Đĩa Flash theo hai hương vị: ATA-based tuyến tính Table 4.1 Truy cập liệu Bảng Giao Diện NOR versus NAND Flash NOR Các liệu truy cập ngẫu nhiên SRAM Cái hoạt động từ ngày flash được: + Đọc thói quen: Đọc nội dung flash +Xố bỏ thói quen: Xố bỏ q trình thực tất bit đèn flash Xoá bỏ chip NOR xảy điều khoản khối +Viết thường lệ: Viết trình chuyển đổi từ đến flash Khi chút làm 0, khơng thể văn vào khối xoá hồn tồn, tập hợp tất bit khối để NAND Các chip NAND chia lưu trữ thành khối, chia thành trang lần Mỗi trang chia vào liệu thường xuyên out-ofband liệu The out-of-dữ liệu ban nhạc sử dụng để lưu trữ siêu liệu ECC (Error-Correction Code) liệu xấu chặn thông tin Các NAND đèn flash đèn flash NOR có ba hoạt động bản: đọc, xóa, viết Tuy nhiên, khơng giống NOR mà truy cập liệu ngẫu nhiên, NAND lần đọc viết thực điều khoản trang xóa bỏ xảy điều khoản khối Có nhiều cách kết nối với đèn flash NAND CPU khác Đây kết nối thiết bị SRAM bình thường địa xử lý liệu xe buýt Execution o code khắp nhà cung cấp NAND truy cập thực kết nối liệu lệnh đường đến thường dòng IO ngày chip flash Mã số thực thi trực Nếu mã flash NAND tiếp từ NOR kết nối cần đến chép vào trực tiếp đến địa / liệu bus nhớ cho thực Performanc Flash NOR đặc trưng cách xóa chậm, chậm viết, nhanh chóng đọc Bad blocks Chip flash NOR khơng dự kiến có xấu khối họ có thiết kế để giữ hệ thống liệu Usage Flash NAND đặc trưng nhanh xóa, nhanh chóng viết, đọc nhanh Những nhấp nháy thiết kế thiết bị lưu trữ giá thấp hơn, đó, mong họ có khối xấu Thông thường chip flash đến với xấu đánh dấu lĩnh vực Cũng NAND flash bị nhiều lĩnh vực vấn đề bit flipping nơi chút lộn nhận văn đến; phát lỗi thuật toán điều chỉnh gọi ECC EDC, thực phần cứng hay phần mềm Đây sử Đây chủ yếu sử dụng cho Mã thực Khởi dụng lưu trữ thiết bị cho động tải tồn hệ thống nhúng chẳng hạn NOR nhấp nháy mã từ hộp set-top MP3 Nếu nhấp nháy trực bạn định sử dụng hội tiếp thực thi Những nhấp nháy đồng với NAND, bạn có thể phải tốn họ cung cấp nhớ đặt ROM khởi động thấp mật độ có tương bổ sung Họ cung cấp mật độ đối ngắn sống span cao thấp giá có (khoảng 100.000 xóa chu kỳ) khoảng dài sống (khoảng 10 đến sức mạnh xóa chu kỳ) ATA dựa đĩa flash sử dụng giao diện đĩa tiêu chuẩn cho giao diện bo mạch chủ, để họ xuất IDE đĩa hệ thống Một điều khiển ngồi silic giống đèn flash, không thực FTL để đồ flash đến lĩnh vực Ngồi ra, thực giao thức để đĩa flash xuất đĩa bình thường vào hệ thống Đây phương pháp lấy CompactFlash thiết kế Ưu điểm việc sử dụng cách tiếp cận phần mềm tương thích bất lợi đắt giải pháp toàn diện thực phần cứng Linux xử lý thiết bị thường xuyên thiết bị IDE trình điều khiển cho thiết bị tìm thấy drivers / ide thư mục Các đĩa flash tuyến tính chế làm việc M2000 hệ thống Đây NAND dựa thiết bị có khả khởi động (nó có ROM khởi động chấp nhận phần mở rộng BIOS), điều khiển mỏng mà sử dụng thuật toán sửa lỗi, phần mềm trueFFFS FTL thi đua Vì thiết bị sử dụng để trực tiếp khởi động hệ thống sử dụng để chạy hệ thống tập tin thường xuyên thiết bị blocklike Những tốn so sánh với nhấp nháy nhỏ gọn thời gian cho tất tính cần thiết thiết bị chặn Bởi người truy cập thiết bị đèn flash tương tự thiết bị truy cập vào nhớ, Linux thực trình điều khiển cho mơ hình theo MTD 1,3 MTD Kiến trúc Một thiết bị flash-based: +Linux hỗ trợ trình điều khiển đèn flash tơi, không làm cách để cổng driver? + Nếu trình điều khiển Linux hỗ trợ đèn flash tơi, làm cách để làm cho phát flash - Các MTD kiến trúc chia thành thành phần sau: -MTD Điểm: cung cấp giao diện trình điều khiển đèn flash thấp cấp ứng dụng Nó thực chế độ ký tự thiết bị cấm Thấp cấp trình điều khiển đèn flash: phần nói NOR NAND dựa Chip flash BSP cho flash: Một đèn flash kết nối máy bay Ví dụ, đèn flash NOR kết nối trực tiếp xe buýt vi xử lý kết nối với PCI bus bên ngồi Việc truy cập vào flash tùy thuộc vào loại vi xử lý Lớp BSP làm cho đèn flash trình điều khiển làm việc với hội đồng / xử lý Người sử dụng có để cung cấp chi tiết cách flash ánh xạ diễn đàn, đến đoạn mã đèn flash lập đồ, trình điều khiển - MTD ứng dụng: Đây hạt nhân submodules JFFS2 - NFTL, sử dụng ứng dụng không gian quản lý nâng cấp - Con số 4,2 cho thấy cách thành phần tương tác với phần lại hạt nhân 1.3.1 mtd_info Cấu trúc liệu mtd_infois trái tim phần mềm MTD Nó định nghĩa tập tin bao gồm : Linux / mtd / trình điều khiển phần mềm mtd.h.The ngày phát đèn flash cụ thể lấp đầy lên cấu trúc với trỏ đến tất công việc cần thiết (như xóa, đọc, viết, vv) sử dụng lõi MTD ứng dụng MTD Danh sách cấu mtd_info cho tất thiết bị giữ bảng gọi mtd_table [] 1.3.2 Giao diện MTD Core Low-Level Flash Drivers Như đề cập trên, trình điều khiển cấp thấp flash xuất chức sau Điểm đến MTD: + Chung cho hai chip flash NAND NOR Chức - Đọc () / ghi () - Xóa () - Khóa cửa () / mở khóa () - Đồng () - Đình () / phục hồi () +Chức cho chip NAND - Read_ecc () / write_ecc () - Read_oob () / write_oob () Nếu bạn có CFI-bật đèn flash NOR IO thiết bị tiêu chuẩn ánh xạ bit chip NAND Nếu không, bạn cần phải thực điều khiển MTD Một số thói quen yêu cầu phần cứng hỗ trợ, bạn cần kiểm tra bảng đèn flash liệu bạn để thực chức Mục cho mô tả công việc khác đọc (), viết (), xóa () thói quen + khóa () mở khóa (): Đây sử dụng để thực flash khóa; phần flash viết hay xóa bảo vệ để ngăn chặn tình cờ ghi đè hình ảnh Ví dụ, bạn khóa tất phân vùng mà bạn có đọc hệ thống tập tin cho hầu hết hệ thống thực thi trừ nâng cấp xong Đây xuất sang applications người sử dụng ioctls MEMLOCK MEMUNLOCK + đồng (): Điều gọi thiết bị đóng cửa phát hành bảo đảm đèn flash trạng thái an tồn +đình () andresume (): Đây hữu dụng bạn bật CONFIG_PM lựa chọn xây dựng hạt nhân + read_ecc () write_ecc (): Những thói quen áp dụng cho flash NAND ECC sửa chữa sai sót mã sử dụng để phát bit xấu trang Những thói quen hành xử đọc bình thường () / ghi (), ngoại trừ đệm riêng biệt có chứa ECC đọc hay viết với liệu +read_oob () write_oob (): Những thói quen áp dụng cho flash NAND Mỗi flash NAND chia thành hai 256 - 512-trang byte; trang có chứa bổ sung - 16-byte phụ tùng khu vực gọi out -dữ liệu ban nhạc, cửa hàng ECC, xấu chặn thông tin, tập tin hệ thống liệu phụ thuộc Các chức sử dụng để truy cập out-of - ban nhạc liệu 1,4 mẫu MTD driver cho NOR Flash Bây vào chi tiết trình điều khiển đèn flash NOR cho Linux Các tập tin mtd.c có chứa mã cho đèn flash NOR, đơn giản, dựa giả định sau +Các thiết bị đèn flash có khu vực để xóa tất ngành có cỡ (An xóa vùng định nghĩa khu vực chip có chứa thành phần kích thước.) + Chip flash truy cập cách sử dụng 4-byte xe buýt chiều rộng + Không có khóa, mở khóa, đình chỉ, phục hồi chức Để đơn giản lợi ích chúng tơi giả định thơng tin sau có sẵn macro chức - DUMMY_FLASH_ERASE_SIZE: The flash xóa cỡ khu vực - DUMMY_FLASH_SIZE: The flash kích thước - PROBE_FLASH (): Chức thăm dị đèn flash NOR có mặt địa cụ thể -WRITE_FLASH_ONE_WORD: Chức / macro để viết từ xác định địa -ERASE_FLASH_SECTOR: Chức để xóa lĩnh vực định -DUMMY_FLASH_ERASE_TIME: Mỗi thời gian lĩnh vực xóa jiffies Trước tiên đặt tất tiêu đề tập tin, muốn cho driver đèn flash /* mtd.c */ #include #include #include #include #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 16 Now we put all the APIs/macros that we expect the user to define 17 18 #define DUMMY_FLASH_ERASE_SIZE 19 #define PROBE_FLASH(map) 20 #define WRITE_FLASH_ONE_WORD(map, start, addr, data) 21 #define ERASE_FLASH_SECTOR(map, start, addr) 22 #define DUMMY_FLASH_ERASE_TIME 23 #define DUMMY_FLASH_SIZE 24 Một lời giải thích ngắn gọn đối số truyền cho API sau - Bản đồ: Đây trỏ đến cấu trúc map_info tuyên bố tiêu đề file include / linux / mtd / map.h Cấu trúc giải thích thêm chi tiết mục 4.5 -bắt đầu: Đây địa bắt đầu chip flash NOR Đây địa thường sử dụng cho lập trình flash với lệnh xóa ghi liệu - addr: Đây địa bù đắp từ chipâ € ™ s bắt đầu, nơi liệu cần phải viết khu vực cần phải xố hồn tồn - liệu: đối số cho viết API 32-bit, từ xác định cần phải văn địa định 25 26 27 28 29 30 31 Tiếp theo, xác định cấu trúc chứa thông tin cá nhân để đèn flash struct dummy_private_info_struct { int number_of_chips; /* Number of flash chips */ int chipshift; /* Size of each flash */ struct flchip *chips; }; Một lời giải thích ngắn gọn lĩnh vực cấu trúc sau number_of_chips: Như tên cho thấy, điều rõ có chip liên tiếp tìm thấy địa obe pr API PROBE_FLASH () bắt buộc để trở số vào mã điều khiển chipshift: Đó tổng số bit địa cho thiết bị, mà sử dụng để tính tốn offsets địa tổng số byte thiết bị có khả chip: Các struct flchip tìm thấy include / linux / mtd / flashchip.h Thêm hình giải thích dummy_probe () function 32 33 34 35 36 37 38 39 40 41 Tiếp theo danh sách chức tĩnh cần khai báo static struct mtd_info * dummy_probe(struct map_info *); static void dummy_destroy(struct mtd_info *); static int dummy_flash_read(struct mtd_info *, loff_t , size_t , size_t *, u_char *); static int dummy_flash_erase(struct mtd_info *, struct erase_info *); static int dummy_flash_write(struct mtd_info *, loff_t , size_t , size_t *, const u_char *); static void dummy_flash_sync(struct mtd_info *); Các mtd_chip_driver cấu trúc sử dụng thói quen khởi dummy_flash_init () chức thoát dummy_flash_exit () Cái hầu hết lĩnh vực quan trọng probethat gọi để phát flash đặc biệt loại có mặt địa định diễn đàn Lớp MTD trì danh sách cấu trúc Những thói quen thăm dị truy cập do_map_probe thường trình () gọi đèn flash, lập đồ điều khiển 315 316 317 return ret; *retlen += i; } 318 319 320 321 return 0; } Listing 4.4 Dummy Erase Routines 322 323 324 325 326 327 328 static int dummy_flash_erase_one_block(struct map_info *map, struct flchip *chip, unsigned long addr) { DECLARE_WAITQUEUE(wait, current); again: spin_lock(chip->mutex); 329 330 331 332 333 334 335 336 337 338 339 340 if(chip->state != FL_READY) { set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); spin_unlock(chip->mutex); schedule(); remove_wait_queue(&chip->wq, &wait); if(signal_pending(current)) return -EINTR; goto again; } 341 342 343 344 chip->state = FL_ERASING; addr += chip->start; ERASE_FLASH_SECTOR(map, chip->start, addr); 345 346 347 348 349 spin_unlock(chip->mutex); schedule_timeout(chip->erase_time); if(signal_pending(current)) return -EINTR; 350 351 /* We have been woken after the timeout Take the mutex to proceed */ 352 353 spin_lock(chip->mutex); 354 /* Add any error checks if the flash sector has not been erased */ 355 356 357 358 359 360 361 /* We assume that here the flash erase has been completed */ chip->state = FL_READY; wake_up(&chip->wq); spin_unlock(chip->mutex); return 0; } 362 363 364 365 366 367 368 369 370 371 static int dummy_flash_erase(struct mtd_info *mtd, struct erase_info *instr) { struct map_info *map = mtd->priv; struct dummy_private_info_struct *priv = map->fldrv_priv; int chipnum = 0; unsigned long addr; int len; int ret; 372 373 374 375 376 377 378 /* Some error checkings initially */ if( (instr->addr > mtd->size) || ((instr->addr + instr->len) > mtd->size) || instr->addr & (mtd->erasesize -1))) return -EINVAL; Listing 4.4 Dummy Erase Routines (continued) 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 /* Find the chip number for the first chip */ chipnum = (instr->addr >> priv->chipshift); addr = instr->addr & ((1 chipshift) - 1); len = instr->len; while(len) { if( (ret = dummy_flash_erase_one_block(map, &priv>chips[chipnum], addr)) < 0) return ret; addr += mtd->erasesize; len -= mtd->erasesize; if(addr >> priv->chipshift) { addr = 0; 394 395 396 chipnum++; } } 397 398 399 400 401 402 403 instr->state = MTD_ERASE_DONE; if(instr->callback) instr->callback(instr); return 0; } 4,5 Các Flash-Mapping Drivers Không phân biệt loại thiết bị (NAND NOR), sở lập đồ hoạt động điều khiển để có cấu mtd_info dân (bằng cách gọi thói quen thăm dị thích hợp) sau đăng ký với lõi MTD Cái mtd_infowill có trỏ chức khác tùy thuộc vào loại thiết bị Các cấu trúc mtd_info đặt mảng mtd_table [] Một tối đa / 16 thiết bị lưu trữ bảng Làm mục mtd_table xuất nhân vật thiết bị chặn giải thích sau Q trình flash-lập đồ lái xe chia thành: Tạo cấu trúc Populating mtd_info Đăng ký mtd_info với lõi MTD 4.5.1 chiết lên mtd_info cho NOR Flash chip Các cấp độ thấp phần cứng NOR phụ thuộc vào hội đồng liên quan đến fol -lowing thứ trường hợp đèn flash bạn kết nối trực tiếp vi xử lýphần cứng xe buýt (như trường hợp bình thường) -Các địa mà flash nhớ ánh xạ -Kích thước flash -Xe bt chiều rộng; -, 16 -, hay 32-bit bus -Thói quen làm -, 16 -, 32-bit, đọc viết -Thói quen để số lượng lớn 404 Listing 4.5 Dummy Sync Routine 405 406 static void dummy_flash_sync(struct mtd_info *mtd) 407 { 408 struct map_info *map = mtd->priv; 409 struct dummy_private_info_struct *priv = map->fldrv_priv; 410 411 struct flchip *chip; int i; 412 413 DECLARE_WAITQUEUE(wait, current); 414 415 416 417 418 419 for(i=0; i< priv->number_of_chips;i++) { chip = &priv->chips[i]; again: spin_lock(chip->mutex); 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 switch(chip->state) { case FL_READY: case FL_STATUS: chip->oldstate = chip->state; chip->state = FL_SYNCING; Y break; L case FL_SYNCING: spin_unlock(chip->mutex); F break; default: add_wait_queue(&chip->wq, &wait); spin_unlock(chip->mutex); M schedule(); remove_wait_queue(&chip->wq, &wait); A } goto again; E } T 440 441 442 443 444 445 446 447 448 449 for(i ; i >=0; i ) { chip = &priv->chips[i]; spin_lock(chip->mutex); if(chip->state == FL_SYNCING) { chip->state = chip->oldstate; wake_up(&chip->wq); } spin_unlock(chip->mutex); } } Bản đồ flash NOR định nghĩa cấu trúc liệu map_info sở liệu cho cấu hình ban khác tìm thấy trình điều khiển / mtd / đồ thư mục Một cấu map_info đầy, sau chức do_map_probe () gọi với map_info đối số Điều Func - tion trả trỏ đến cấu trúc mtd_info với đầy đủ chức gợi ý cho hoạt động chip flash 1.5.2 chiết lên mtd_info cho NAND Flash chip 450 451 452 453 Như đề cập trước đó, truy cập NAND flash thực cách kết nối liệu lệnh đường đến dòng IO vi xử lý -CE (Chip Enable) pin: Khi pin khẳng định thấp đèn flash NAND chip chọn -WE (Write Enable) pin: Khi pin khẳng định thấp, đèn flash NAND chip chấp nhận -RE (Đọc Enable) pin: Khi pin khẳng định thấp, đèn flash NAND chip gửi liệu -CLE (Command Latch Enable) pin ALE (Address Latch Enable) pin Những pins xác định điểm đến hoạt động chip NAND Bảng 4,2 giải thích cách Pin sử dụng -WP (Write Protect) Pin: Pin sử dụng để bảo vệ viết -RB (Ready Bận) pin: Điều sử dụng giai đoạn chuyển giao liệu biết chip sử dụng -IO chân: Đây sử dụng để truyền liệu Không giống chip flash NOR mà gọi do_map_probe ()để phân bổ mtd_info cấu trúc, phân bổ mtd_info cấu trúc Chìa khóa để nand_chip cấu, mà đầy trình điều khiển lập đồ NAND Các bước sau thực NAND lập đồ điều khiển Phân bổ cấu mtd_info -Phân bổ cấu trúc nand_chip điền lên trường bắt buộc -Hãy điểm trường Priv mtd_info để cấu nand_chip -Gọi hàm nand_scan (), thăm dò chip NAND, điền vào cấu trúc mtd_info với chức -Đăng ký cấu trúc mtd_info với lõi MTD Các tham số cho NAND lưu cấu nand_chip phân thành: - Bắt buộc thông số: - IO_ADDR_R, IO_ADDR_W: Đây địa để truy cập IO dòng chip NAND - Hwcontrol (): Chức thực cụ thể ban Mecha nism để cài đặt giải phóng CLE, ALE, ghim CE - Eccmode: sử dụng để biểu thị loại ECC cho đèn flash NAND Trong có khơng có ECC tất cả, phần mềm ECC, phần cứng ECC -Nếu bắt buộc thông số phần cứng ECC Một số phần cứng cung cấp ECC hệ; trường hợp đó, chức sau cần phải imple - mented Trong trường hợp phần mềm ECC, trình điều khiển NAND theo mặc định cung cấp chức sau - Calculate_ecc (): Chức để tạo ECC - Correct_data (): Chức cho ECC chỉnh - Enable_hwecc (): Chức cho phép HW ECC hệ -Nonmandatory tham số Trình điều khiển cung cấp chức mặc định / giá trị cho thông số sau Tuy nhiên chúng ghi đè lập đồ lái xe: - Dev_ready (): chức sử dụng để tìm bang flash - Cmdfunc (): chức để gửi lệnh để flash - Waitfunc (): chức gọi sau viết xóa thực Chức mặc định cung cấp trình điều khiển NAND chức bỏ phiếu; trường hợp bảng treo pin RB đến ngắt dịng, chức chuyển đổi sang ngắt-hướng chức - Chip_delay: Đây chậm trễ cho việc chuyển liệu từ NAND mảng để đăng ký mình; giá trị mặc định 20 1.5.3 Đăng ký mtd_info Các bước sau áp dụng chung cho NAND NOR nhấp nháy Cơ sở đăng ký add_mtd_device chức () chức năng,có thêm thiết bị đến mảng mtd_table [] Tuy nhiên hầu hết trường hợp, bạn không sử dụng chức trực tiếp bạn muốn tạo phân vùng chip Phân vùng Phân vùng cho phép nhiều phân vùng đèn flash tạo thêm vào khe khác mảng mtd_table [] Vì vậy, phân vùng xuất nhiều thiết bị để ứng dụng Các phân vùng khác chia sẻ chức để truy cập vào mảng Ví dụ, bạn muốn chia 4-MB flash thành 1-MB 3-MB phân vùng hình 4.3 Chìa khóa để phân vùng mtd_partition cấu trúc liệu Bạn xác định mảng cấu trúc liệu để xuất phân vùng 454 struct mtd_partition partition_info[] = 455 { 456 { name=”part1”, offset=0, size= 1*1024*1024}, 457 Listing 4.2 Dummy Read Routines 458 459 static inline int dummy_flash_read_one_chip(struct map_info *map, 460 struct flchip *chip, loff_t addr, size_t len, u_char *buf) 461 { 462 DECLARE_WAITQUEUE(wait, current); 463 464 again: 465 spin_lock(chip->mutex); 466 467 if(chip->state != FL_READY) 468 { 469 set_current_state(TASK_UNINTERRUPTIBLE); 470 add_wait_queue(&chip->wq, &wait); 471 spin_unlock(chip->mutex); 472 schedule(); 473 remove_wait_queue(&chip->wq, &wait); 474 if(signal_pending(current)) 475 return -EINTR; 476 goto again; 477 } 478 479 addr += chip->start; 480 chip->state = FL_READY; 481 map_copy_from(map, buf, addr, len); 482 wake_up(&chip->wq); 483 spin_unlock(chip->mutex); 484 return 0; 485 } 486 487 488 489 490 491 492 493 494 495 static int dummy_flash_read(struct mtd_info *mtd, loff_t from, size_t len,size_t *retlen, u_char *buf) { struct map_info *map = mtd->priv; struct dummy_private_info_struct *priv = map->fldrv_priv; int chipnum = 0; int ret = 0; unsigned int ofs; *retlen = 0; 496 497 498 499 500 501 502 503 504 /* Find the chip number and offset for the first chip */ chipnum = (from >> priv->chipshift); ofs = from & ((1 chipshift) - 1); while(len) { unsigned long to_read; if(chipnum >= priv->number_of_chips) break; 505 506 507 508 509 510 511 512 513 514 /* Check whether the read spills over to the next chip */ if( (len + ofs - 1) >> priv->chipshift) to_read = (1 chipshift) - ofs; else to_read = len; if( (ret = dummy_flash_read_one_chip(map, &priv->chips[chipnum], ofs, to_read, buf))) break; ? Sau chi tiết cách sử dụng chip flash Chip flash ánh xạ địa 0xBFC00000 có kích thước MB Flash đèn flash khởi động có hai khu vực xóa Việc xóa khu vực có tám ngành kích thước K; diện tích 64-K sử dụng để lưu trữ khởi động tải khởi động lên tham số cấu hình Thứ hai khu vực xóa có phần có kích thước 64 K hoàn toàn sử dụng để lưu trữ hệ thống tập tin JFFS2 Chip flash thứ hai ánh xạ địa 0xBF000000 lần kích thước MB Đèn flash thứ hai gồm khu vực xóa với tất ngành có kích thước 64 K flash hồn tồn sử dụng để lưu trữ tập tin hệ thống JFFS2 Yêu cầu từ đèn flash lái xe để lập đồ phân vùng flash địa 0xBFC00000 thành hai Các phân vùng có kích thước 64 K phân vùng khởi động Các phân vùng thứ hai nối với flash địa 0xBF000000 để lưu trữ tập tin hệ thống JFFS2 Trước tiên bắt đầu với tập tin tiêu đề định nghĩa 515 /* mtd-bsp.c */ 516 #include 517 #include 518 #include 519 #include 520 #include 521 #include 522 #include 523 #include 524 #include 525 #include 526 527 #define WINDOW_ADDR_0 0xBFC00000 528 #define WINDOW_SIZE_0 0x00400000 529 #define WINDOW_ADDR_1 0xBF000000 530 #define WINDOW_SIZE_1 0x00400000 531 Map_info chứa chi tiết địa (vật lý) chip, kích thước, chiều rộng xe buýt Đây sử dụng thói quen thăm dị chip 532 static struct map_info dummy_mips_map[2] = { 533 { 534 .name = "DUMMY boot flash", 535 .phys = WINDOW_ADDR_0, 536 .size = WINDOW_SIZE_0, 537 .bankwidth = 4, 538 }, { name = "Dummy non boot flash", phys = WINDOW_ADDR_1, size = WINDOW_SIZE_1, bankwidth = 4, } }; Cấu trúc sau dùng để thiết lập phân vùng flash khởi 539 540 541 542 543 544 545 546 động 547 548 549 550 551 552 553 554 555 556 557 558 559 static struct mtd_partition boot_flash_partitions [] = { { name = "BOOT", offset = 0, size = 0x00010000, }, { name = "JFFS2", offset = 0x00010000, size = 0x003f0000, }, }; * Sau cấu trúc giữ trỏ mtd_info cho * Phân vùng, concatenating */ static struct mtd_info * concat_partitions [2]; /* * Sau giữ cấu trúc cấu mtd_info gợi ý cho * Mỗi thiết bị đèn flash */ static struct mtd_info * mymtd [2], * concat_mtd; Các init_dummy_mips_mtd_bsp chức () chức Tham khảo 4,6 đến danh mục thực Những chức sau Đầu dò cho đèn flash địa 0xBFC00000 populates MTD cấu cho flash mymtd [0] Đầu dò cho đèn flash địa 0xBF000000 populates MTD cấu cho flash mymtd [1] Tạo hai phân vùng cho flash với địa 0xBFC00000 Concatenates phân vùng thứ hai với đèn flash địa bắt đầu mà 0xBF000000 sau tạo thiết bị cách gọi hàm add_mtd_device () 560 561 562 563 564 565 566 Cuối chức dọn dẹp sau static void exit cleanup_dummy_mips_mtd_bsp(void) { mtd_concat_destroy(concat_mtd); del_mtd_partitions(mymtd[0]); map_destroy(mymtd[0]); map_destroy(mymtd[1]); } 567 568 569 570 571 572 573 module_init (init_dummy_mips_mtd_bsp); module_exit (cleanup_dummy_mips_mtd_bsp); MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("Embedded Linux book"); MODULE_DESCRIPTION ("Sample Mapping driver"); Listing 4.6 init_dummy_mips_mtd_bsp Function 574 575 576 int init init_dummy_mips_mtd_bsp (void) { 577 578 579 580 581 582 583 584 585 /* First probe for the boot flash */ dummy_mips_map[0].virt = (unsigned long)ioremap( dummy_mips_map[0].phys,dummy_mips_map[0].size); simple_map_init(&dummy_mips_map[0]); mymtd[0] = do_map_probe("cfi_probe", &dummy_mips_map[0]); if(mymtd[0]) mymtd[0]->owner = THIS_MODULE; 586 587 588 589 590 591 592 593 /* Repeat for the second flash */ dummy_mips_map[1].virt = (unsigned long)ioremap(dummy_mips_map[1].phys, dummy_mips_map[1].size); simple_map_init(&dummy_mips_map[1]); mymtd[1] = do_map_probe("cfi_probe", &dummy_mips_map[1]); if(mymtd[1]) 594 595 596 mymtd[1]->owner = THIS_MODULE; if (!mymtd[0] || !mymtd[1]) return -ENXIO; 597 /* * Bây phân vùng khởi động đèn flash Chúng quan tâm đến * Mới mtd đối tượng cho phân vùng thứ hai kể từ * Concatenating với đèn flash khác * / 600 boot_flash_partitions[1].mtdp = &concat_partitions[0]; 601 add_mtd_partitions(mymtd[0], boot_flash_partitions, 2); 602 603 /* 604 * concat_partitions[1] should contain the mtd_info pointer for the 605 * 2nd partition Do the concatenation 606 */ 607 concat_partitions[1] = mymtd[1]; 608 concat_mtd = mtd_concat_create(concat_partitions, 2, 609 "JFFS2 flash concatenate"); 610 if(concat_mtd) 611 add_mtd_device(concat_mtd); 612 return 0; 613 } 598 599 II Thiết bị đĩa: Đĩa thiết bị điều khiển tay dành sử dụng ghi vào thiết bị Linux giống từ lúc bạn làm mạng cục máy chủ Linux 2,1Thẻ nhớ: Một thẻ nhớ truy cập Linux qua đường; đĩa IDE (Integrated Drive Electronics), chặn CF (CompactFlash) đến IDE CF đến thiết bị tiếp hợp PCMCIA (Personal Computer Memory Card International Association) đĩa SCSI (Small Computer System Interface: dùng để cắm vào CD-ROM, ổ đĩa cứng, ổ đĩa, máy quét hình, máy laser) truy cập USB (Universal Serial Bus) CF reader Trong thực tế, thuận tiện cho việc sử dụng USB reader từ thẻ chương trình CF máy chủ sử dụng CF to IDE or CFđến thiết bị tiếp hợp PCMCIA đích đến thiết bị truy cập Sau đây, CF Card thấy đĩa SCSI máy chủ, gần đích đĩa IDE Đến chủ đề phức tạp nữa, gần Kernel phải bắt đầu truy cập đến đĩa IDE(or “PATA”) hệ thống phụ SCSI sử dụng libata xuất IDE divers /dev/sdx đĩa SCSI làm Truy cập thẻ nhớ đầu đọc thẻ nhớ USB máy chủ, bạn phải hỗ trợ dành cho thiết bị lưu trữ USB Sự phân bố tốt gửi với thiết bị hỗ trợ xây dựng USB đơn vị đo, tải chúng tự động Bởi vậy, tất cần làm chặn thiết bị USB máy chủ bạn Khi thiết bị mặc định, bạn nhìn thích hợp nhiều mục /proc đến đầu đọc thẻ nhớ bạn Ví dụ, hệ thống phụ SCSI thấy đầu đọc SanDisk SDDR-31 máy chủ : #cat /proc/scsi/scsi Attached Devices: Host: scsi0 Chanel: 00 Id: 00 Lun: 00 Vendor: SanDisk Model: ImageMate II Rev: 1.30 Type: Direct-Access ANSI SCSI revision: 02 #cat /proc/scsi/usb-storage-0/0 Host scsi0: usb-storage Vendor: SanDisk Comporation Product: ImageMate CompactFlash USB Serial Number: None Protocol: Transparent SCSI Transport: Bulk GUID: 07810002 000 000 000 000 0000 Attached: Yes Trong trường hợp này, đầu đọc thiết bị SCSI Bus, bị truy cập /dev/sda Bởi vậy, tơi dành riêng, định dạng, mang thẻ nhớ đường dành riêng, định dạng mang quy ước đĩa SCSI # fdisk /dev/sda … # mkdir /mnt/cf # mke2fs /dev/sda1 # mount –t ext2 /dev/sda1 /mnt/cf Tuy nhiên gần Linux phân bố nâng cấp cách tự động mở thiết bị dành cho bạn, yêu cầu bạn muốn nhập ảnh từ chúng, chúng đến từ máy ảnh kỹ thuật số Bạn ngăn chặn hành động cách bố trí GNOME KED, thiết bị không nâng cấp điều khiển tay chúng xuất hình bạn Nếu bạn cố gắng phân chia lại thiết bị nâng cấp FDISK thông báo lỗi: Command (m for help): w The partition table has been altered; Calling ioctl() to re-read partition table WARNING: Re-reading the partition table failed with error 16: Devive or Resoure busy The Kernel still uses the old table The new table will be used at the next reboot Syncing disks Bạn cho vào thẻ CF sử dụng tùy thuộc phân phối khác mức độ lớn mục tiêu bạn Nếu mục tiêu bạn bắt nguồn từ PC x86, bạn sử dụng phân phối đơn Nếu mục tiêu bạn PPC sử dụng U-Boot bootloader, bạn cần phải có vài phân phối nhỏ đến giữ nhân ảnh có phân phối lớn đến giữ gốc tập tin hệ thống bạn Bởi U-Boot đọc thiết bị phân chia CF liệu ngăn khác, khơng nhận vài tập tin hệ thống Do đó, nhân ảnh phải viết từ phân chia thô U-Boot Chúng ta sử dụng vài ví dụ thẻ CF thiết bị khởi động ... NAND chia lưu trữ thành khối, chia thành trang lần Mỗi trang chia vào liệu thường xuyên out-ofband liệu The out-of -dữ liệu ban nhạc sử dụng để lưu trữ siêu liệu ECC (Error-Correction Code) liệu xấu... dụng Tuy nhiên hệ thống nhúng tiến hóa để có lưu trữ lớn (như máy nghe nhạc máy ảnh kỹ thuật số), flash NAND trở thành phổ biến cho ứng dụng lưu trữ liệu Lớp MTD phát triển ban đầu xung quanh đèn... thước K; diện tích 64-K sử dụng để lưu trữ khởi động tải khởi động lên tham số cấu hình Thứ hai khu vực xóa có phần có kích thước 64 K hồn tồn sử dụng để lưu trữ hệ thống tập tin JFFS2 Chip flash