Lưu trữ dữ liệu:
Lưu trữ trên hệ thống nhúng được thực hiện bằng cách sử dụng ROM cho việc lưu 
trữ của đọc-mã và NVRAM cho việc lưu trữ cho các đọc-ghi dữ liệu. Tuy 
nhiên, đã được thay thế bởi công nghệ flash, cung cấp nonvol mật độ cao atile lưu 
trữ. Những lợi thế kết hợp với chi phí thấp của đèn flash có cách sử dụng tăng lên 
đáng kể trong các hệ thống nhúng. Chương này bàn về các hệ thống lưu trữ chủ 
yếu trên các thiết bị đèn flash và hệ thống tập tin khác nhau có sẵn trên Linux có 
nghĩa là cho các hệ thống nhúng. Chương này được chia thành bốn phần. 
 + Flash nhúng bản đồ cho Linux. 
 +Sự hiểu biết MTD (Memory Công nghệ điều khiển) có nghĩa là hệ thống con 
chủ yếu cho các thiết bị đèn flash. 
 + Sự hiểu biết hệ thống tập tin liên kết với các hệ thống nhúng. Ở đó chuyên hệ 
thống tập tin trên bộ nhớ flash và trên 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 các chương 
trình lên đèn flash của bạn. 
1.1 Flash Bản đồ 
Trên một hệ thống Linux nhúng, đèn flash thường được sử dụng cho: 
 + Lưu trữ các bộ tải khởi động 
 + Lưu trữ hình ảnh hệ điều hành 
 + Lưu trữ các ứng dụng và ứng dụng thư viện hình ảnh 
 + Lưu trữ các đọc-ghi tập tin (có dữ liệu cấu hình) 
 Trong 4 phần , phần thứ 3 đầu tiên là chỉ đọc cho hầu hết các hệ thống thực 
thi thời gian (ngoại trừ ở lần nâng cấp). Đó là nếu bạn sử dụng một bộ tải khởi 
động bạn nên có ít nhất hai phân vùng: một có bộ tải khởi động và các cái khác 
đang nắm giữ hệ thống tập tin gốc. Các bộ phận của đèn flash có thể được mô 
tả như bản đồ flash. Tại đầu của dự án của bạn, bạn đến với một bản đồ flash. Một 
bản đồ flash như các bản sửa lỗi bộ nhớ trên bản đồ làm thế nào bạn có kế hoạch 
phân vùng đèn flash để lưu giữ các dữ liệu trên và làm thế nào bạn có kế hoạch để 
truy cập vào dữ liệu . Sau đây là những vấn đề thiết kế khác nhau sẽ đến khi bạn cố 
gắng đóng băng trên một bản đồ flash. 
 Làm thế nào bạn muốn phân vùng đèn flash? Bạn có thể có hệ điều hành, appli 
- Cation, và đọc-ghi ảnh trong một phân vùng duy nhất nhưng điều đó làm tăng 
nguy cơ làm hư hỏng các dữ liệu của toàn bộ hệ thống bởi vì toàn bộ các phân 
vùng được đọc -ghi. Mặt khác bạn có thể đọc dữ liệu chỉ trong một phân vùng 
riêng biệt và đọc-ghi trong một phân vùng riêng để việc đọc dữ liệu được an toàn 
từ bất kỳ nhiễm; nhưng sau đó bạn sẽ cần sửa chữa một kích thước trên mỗi phân 
vùng và đảm bảo rằng kích thước phân vùng sẽ không được vượt quá tại bất kỳ 
điểm nào trong tương lai. 
 - Làm thế nào bạn muốn truy cập các phân vùng nguyên hoặc bạn muốn sử 
dụng một hệ thống tập tin? Nguyên phân vùng có thể có ích cho bộ nạp khởi động 
vì sẽ không đòi hỏi bạn phải có một hệ thống tập tin, bạn có thể đánh dấu một khu 
vực đèn flash cho giữ dữ liệu cấu hình khởi động và phần còn lại của ngành để giữ 
khởi động mã. Tuy nhiên, đối với phân vùng Linux đang nắm giữ dữ liệu, nó là an 
toàn hơn để đi qua hệ thống tập tin. Những gì hệ thống tập tin bạn chọn cho các dữ 
liệu cũng đóng một vai trò quan trọng trong tờ bản đồ flash. 
 - Làm thế nào bạn muốn nâng cấp nào? Nâng cấp trên một hệ thống nhúng có 
thể được thực hiện trên hệ thống đang chạy hoặc từ khởi động. Trong trường hợp 
nâng cấp của bạn liên quan đến việc thay đổi chỉ đọc dữ liệu chỉ tốt hơn để phân 
vùng flash thành chỉ đọc và đọc-ghi phân vùng để bạn sẽ không phải làm bất cứ 
sao lưu và phục hồi của đọc-ghi dữ liệu.
1,2 MTD- ( Memory technology devices )
MTD là viết tắt của Công nghệ và thiết bị bộ nhớ, là hệ thống con được sử dụng 
để xử lý các thiết bị lưu trữ trên tàu. Chính xác những gì là công việc của MTD 
và khi nào và làm thế nào để bạn bao gồm các thiết bị đèn flash theo một 
MTD hệ thống con? Làm thế nào để đặt hệ thống tập tin trên một thiết bị MTD? 
Sau đây là phần trả lời cho những câu hỏi này. 
1.2.1 Các Mẫu MTD 
Mặc dù các thiết bị đèn flash là thiết bị lưu trữ như đĩa cứng, có một số cơ bản 
khác biệt giữa chúng. 
 + Thông thường các ổ đĩa cứng có một khu vực kinh tế mà chia một kích 
thước trang là 4.096 byte. Giá trị tiêu chuẩn là 512 byte. Các mô hình hệ thống 
tập tin Linux, đặc biệt là bộ nhớ cache bộ đệm (cache bộ nhớ giữa một hệ thống 
tập tin và thiết bị khối lớp), là dựa trên giả định này. Flash chip trên Mặt khác 
có kích cỡ khu vực kinh tế lớn; kích thước chuẩn là 64 K. 
 + Flash lĩnh vực bình thường có thể xoá hoàn toàn trước khi viết thư này để 
cho họ; cách viết và xóa các hoạt động có thể được độc lập tùy thuộc vào phần 
mềm sử dụng đèn flash. 
 +Flash chip có một đời giới hạn được quy định tại các điều khoản của 
số, của khu vực kinh tế một lần là bị xóa. Vì vậy, nếu một lĩnh vực cụ thể là 
nhận bằng văn bản rất thường xuyên của tuổi thọ được rút ngắn. Để ngăn chặn 
này, viết cho một đèn flash 
 cần phải được phân phối cho tất cả các lĩnh vực. Điều này được gọi mặc và san 
lấp mặt bằng không được hỗ trợ bởi các thiết bị khối. 
 +Bình thường các hệ thống tập tin không thể được sử dụng trên một đèn 
flash vì những đi thông qua bộ nhớ cache bộ đệm. Bình thường đĩa IO chậm; để 
tăng tốc độ nó lên một bộ nhớ cache trong bộ nhớ được gọi là cửa hàng đệm 
cache của IO dữ liệu vào đĩa. Trừ khi dữ liệu này được flushed trở lại đĩa, hệ 
thống tập tin là trong một không phù hợp nói. Tuy nhiên, các hệ thống nhúng có 
thể được cung off mà không tắt máy phù hợp và vẫn còn có dữ liệu phù hợp; 
như vậy thường tập tin hệ thống và thiết bị chặn mô hình không đi tốt với 
nhúng hệ thống.
 Các phương pháp truyền thống để truy cập flash được sử dụng để được 
thông qua FTL( Flash Translation Layer). Lớp này mô phỏng một thiết bị chặn 
hành vi trên một đèn flash để có được hệ thống tập tin thường xuyên làm việc 
trên các thiết bị đèn flash, thay vì việc thay đổi các trình điều khiển ở cấp thấp 
hoặc giới thiệu một lớp dịch, thay đổi các ứng dụng sử dụng các thiết bị bộ nhớ 
là họ đang có.Các hệ thống phụ MTD được chia hành hai phần: driver và các 
ứng dụng. 
Các thiết bị có thể cho phép các thiết bị bộ nhớ được truy cập trực tiếp sử dụng 
các tiêu chuẩn mở / đọc / ghi / ioctl cuộc gọi. Nhưng trong trường hợp bạn 
muốn gắn kết một hệ thống tập tin thường xuyên về bộ nhớ điện thoại sử dụng 
phương pháp truyền thống, bạn vẫn có thể mount nó bằng cách sử dụng khối 
điều khiển. Hai thiết bị mà hiện nay được hỗ trợ bởi MTD: chip flash và đĩa 
flash. 
1.2.2 Flash Chips 
Flash các thiết bị đi theo hai hương vị: flash NAND và NOR. Mặc dù cả hai 
người trong số họ đến cùng một khoảng thời gian (NOR được giới thiệu bởi 
Intel và NAND bởi 
Toshiba vào cuối những năm 1980), NOR nhanh chóng bắt kịp với thế giới 
nhúng 
vì nó dễ dàng sử dụng. Tuy nhiên khi các hệ thống nhúng đã tiến hóa để có lưu 
trữ lớn (như các máy nghe nhạc và máy ảnh kỹ thuật số), flash NAND đã trở 
thành phổ biến cho các ứng dụng lưu trữ dữ liệu. Lớp MTD cũng phát triển ban 
đầu xung quanh đèn flash NOR, nhưng sự hỗ trợ cho NAND đã được bổ sung 
sau. Chip NOR đi theo hai hương vị: cũ không CFI chip và CFI mới hơn tuân 
thủ. CFI thường gặp là viết tắt của Flash diện và là một chuẩn công nghiệp đảm 
bảo khả năng tương thích giữa các chip flash đến từ các nhà bán cùng. Flash 
chip như bất kỳ thiết bị bộ nhớ khác là luôn ở trong một giai đoạn tiến hóa với 
chip mới thay thế những cái cũ rất nhanh chóng; này sẽ bao gồm viết lại các 
trình điều khiển đèn flash. Thường thì những thay đổi này sẽ được cấu 
hình thay đổi như xóa timeouts, khối các kích cỡ. Các tiêu chuẩn CFI được giới 
thiệu cho phép các nhà cung cấp đèn flash cho phép dữ liệu cấu hình được đọc 
từ các thiết bị đèn flash. Vì vậy, hệ thống phần mềm có thể tra hỏi các thiết bị 
đèn flash và cấu hình lại chính nó. MTD hỗ trợ CFI tập lệnh của Intel và AMD. 
1.2.3 Flash Disk 
Ổ Flash được giới thiệu cho các ứng dụng lưu trữ hàng loạt. Như tên gọi của họ 
cho thấy, ổ đĩa flash có nghĩa là ổ đĩa cục bộ trên một hệ thống dựa trên công 
nghệ flash. Đĩa Flash nữa đi theo hai hương vị: ATA-based và tuyến tính.
1.
2. Table 4.1 NOR versus NAND Flash
NOR NAND
Truy cập 
dữ liệu
Các dữ liệu có thể được truy cập 
tại ngẫu nhiên như SRAM. Cái 
hoạt động từ ngày flash có thể 
được:
+ Đọc thói quen: Đọc nội dung 
của flash.
+Xoá bỏ thói quen: Xoá bỏ 
là quá trình thực hiện tất cả 
các bit trên một đèn flash 1. Xoá 
bỏ về các chip NOR xảy ra 
trong 
điều khoản của các khối
+Viết thường lệ: Viết là quá trình 
chuyển đổi một từ 1 đến 0 trên 
flash. Khi một chút là 
làm 0, nó không thể được 
bằng văn bản vào cho đến khi 
khối là xoá hoàn toàn, trong đó 
tập hợp tất cả các bit trong một 
khối để 1.
Các chip NAND chia lưu 
trữ thành các khối, được chia 
thành trang một lần nữa. Mỗi 
trang được chia vào dữ liệu 
thường xuyên và out-of-
band dữ liệu. The out-of-dữ 
liệu ban nhạc được sử dụng để 
lưu trữ các siêu dữ liệu như 
ECC (Error-Correction Code) 
và dữ liệu xấu chặn thông tin. 
Các NAND đèn flash như đèn 
flash NOR có ba hoạt động cơ 
bản: đọc, xóa, 
và viết. Tuy nhiên, không 
giống như NOR mà có thể truy 
cập dữ liệu ngẫu 
nhiên, NAND những lần đọc 
và viết được thực hiện trong 
điều khoản của các trang trong 
khi xóa bỏ xảy ra trong điều 
khoản của các khối
Bảng Giao 
Diện
Có nhiều cách của kết nối với 
đèn flash NAND CPU khác 
Đây là các kết nối như 
thiết bị SRAM bình thường 
địa chỉ và xử lý dữ liệu xe buýt.
nhau trên khắp các nhà cung 
cấp. NAND truy cập được 
thực hiện bởi kết nối dữ liệu 
và lệnh đường đến thường 
dòng IO 8 ngày chip flash.
Execution o 
code
Mã số có thể được thực thi trực 
tiếp từ NOR vì nó được kết nối 
trực tiếp đến địa chỉ / dữ liệu bus
Nếu mã là trong flash NAND 
nó cần đến được sao chép vào 
bộ nhớ cho thực hiện.
Performanc Flash NOR được đặc trưng bằng 
cách xóa chậm, chậm viết, và 
nhanh chóng đọc.
Flash NAND được đặc trưng 
bởi nhanh xóa, nhanh chóng 
viết, và đọc nhanh.
Bad blocks Chip flash NOR không dự kiến 
sẽ có xấu khối bởi vì họ có được 
thiết kế để giữ hệ thống dữ liệu.
Những nhấp nháy được thiết 
kế một về cơ bản là một thiết 
bị lưu trữ giá thấp hơn, do đó, 
mong rằng họ có khối xấu. 
Thông thường các chip flash 
đến với xấu đánh dấu trong 
lĩnh vực này. Cũng NAND 
flash bị nhiều lĩnh vực các vấn 
đề của bit flipping nơi một 
chút lộn khi nhận được bằng 
văn bản đến; này được phát 
hiện bởi lỗi thuật toán điều 
chỉnh được gọi là ECC EDC, 
được thực hiện hoặc 
trong phần cứng hay phần 
mềm.
Usage Đây là những cơ bản được sử 
dụng cho Mã thực hiện. Khởi 
động bộ tải có thể tồn tại 
trên NOR nhấp nháy vì mã từ 
các nhấp nháy có thể được trực 
tiếp thực thi. Những nhấp nháy 
là khá 
tốn kém và họ cung cấp bộ nhớ 
thấp hơn mật độ và có một tương 
đối ngắn hơn cuộc sống span 
Đây là những chủ yếu được sử 
dụng như lưu trữ thiết bị cho 
các hệ thống nhúng chẳng hạn 
như hộp set-top và MP3 . Nếu 
bạn định sử dụng một hội 
đồng chỉ với NAND, bạn có 
thể phải 
đặt trong một ROM khởi động 
bổ sung. Họ cung cấp mật độ 
cao thấp giá cả và có một 
(khoảng 100.000 xóa 
chu kỳ).
khoảng dài hơn cuộc sống 
(khoảng 10 đến sức mạnh của 
6 xóa chu kỳ).
3. ATA dựa trên đĩa flash sử dụng giao diện đĩa tiêu chuẩn cho giao diện trên 
bo mạch chủ, để họ xuất hiện như là IDE đĩa trên hệ thống. Một bộ điều 
khiển ngồi trên các silic giống như đèn flash, nhưng không thực hiện FTL để 
bản đồ flash đến lĩnh vực. Ngoài ra, nó thực hiện các giao thức để đĩa 
flash xuất hiện như một đĩa bình thường vào hệ thống. Đây là phương pháp 
lấy bằng CompactFlash thiết kế. Ưu điểm chính của việc sử dụng cách tiếp 
cận này được phần mềm tương thích nhưng bất lợi là nó đã được đắt hơn bởi 
vì các giải pháp toàn diện đã được thực hiện trong phần cứng. Linux xử lý 
các thiết bị này như thường xuyên thiết bị IDE và trình điều khiển cho các 
thiết bị này có thể được tìm thấy trong drivers / ide thư mục. 
 Các đĩa flash tuyến tính là cơ chế đó là làm việc của các M2000 hệ thống. 
Đây là những NAND dựa trên các thiết bị có khả năng khởi động (nó có 
một ROM khởi động được chấp nhận như là một phần mở rộng BIOS), một 
bộ điều khiển mỏng mà sử dụng các thuật toán sửa lỗi, và phần mềm nào các 
trueFFFS FTL thi đua. Vì thế những thiết bị này có thể được sử dụng để trực 
tiếp khởi động hệ thống và có thể được sử dụng để chạy các hệ thống tập tin 
thường xuyên trên một thiết bị blocklike. Những cái này ít tốn kém khi so 
sánh với các nhấp nháy nhỏ gọn nhưng tại cùng một thời gian cho tất cả các 
tính năng cần thiết như là một thiết bị chặn. Bởi vì người truy cập
những thiết bị đèn flash tương tự như một thiết bị truy cập vào bộ nhớ, 
Linux thực hiện các trình điều khiển cho các mô hình theo MTD. 
1,3 MTD Kiến trúc 
Một thiết bị flash-based:
+Linux hỗ trợ các trình điều khiển đèn flash của tôi, nếu không làm cách nào để 
cổng driver? 
 + Nếu trình điều khiển Linux hỗ trợ đèn flash của tôi, làm cách nào để làm 
cho nó phát hiện các flash trên 
 - Các MTD kiến trúc này được chia thành các thành phần sau:
-MTD Điểm: này cung cấp giao diện giữa các trình điều khiển đèn flash thấp 
cấp và các ứng dụng. Nó thực hiện chế độ ký tự và thiết bị cấm. Thấp cấp trình 
điều khiển đèn flash: phần này nói về NOR và NAND dựa trên Chip flash chỉ. 
 BSP cho flash: Một đèn flash có thể được duy nhất một kết nối trên máy 
bay. Ví dụ, một đèn flash NOR có thể được kết nối trực tiếp trên xe buýt vi xử 
lý hoặc có thể được kết nối với một PCI bus bên ngoài. Việc truy cập vào flash 
cũng có thể được duy nhất 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 bất kỳ hội đồng / bộ xử lý. Người sử dụng có 
để cung cấp các chi tiết cách flash là ánh xạ ở trên diễn đàn, chúng tôi chỉ đến 
đoạn này của mã như đèn flash lập bản đồ, trình điều khiển. 
 - MTD ứng dụng: Đây có thể là hạt nhân submodules như JFFS2 hoặc 
 - NFTL, hoặc sử dụng các ứng dụng không gian như quản lý nâng cấp. 
 - Con số 4,2 cho thấy cách các thành phần tương tác với nhau và 
phần còn lại của hạt nhân.
1.3.1 mtd_info Cấu trúc dữ liệu 
mtd_infois trái tim của phần mềm MTD. Nó được định nghĩa trong tập tin này 
bao gồm :
Linux / mtd / trình điều khiển phần mềm mtd.h.The ngày phát hiện một đèn 
flash cụ thể lấp đầy lên cấu trúc này với các con trỏ đến tất cả các công việc cần 
thiết (như xóa, đọc, viết, vv) được sử dụng bởi lõi MTD và các ứng dụng 
MTD. Danh sách các cơ cấu mtd_info cho tất cả các thiết bị nhất là giữ trong 
một bảng gọi là mtd_table []. 
1.3.2 Giao diện giữa MTD Core và Low-Level Flash Drivers 
Như đã đề cập ở trên, các trình điều khiển cấp thấp flash xuất khẩu các chức 
năng sau đây 
Điểm đến MTD:
 + Chung cho cả hai chip flash NAND và NOR Chức năng 
 - Đọc () / ghi () 
 - Xóa () 
 - Khóa cửa () / mở khóa () 
 - Đồng bộ () 
 - Đình chỉ () / phục hồi () 
 +Chức năng cho chip NAND chỉ 
 - Read_ecc () / write_ecc () 
 - Read_oob () / write_oob () 
 Nếu bạn có một CFI-bật đèn flash NOR hoặc IO một thiết bị tiêu chuẩn ánh 
xạ 8 -- bit chip NAND. Nếu không, bạn cần phải thực hiện điều khiển MTD. 
Một số thói quen có thể yêu cầu phần cứng hỗ trợ, vì thế bạn cần kiểm tra bảng 
đèn flash dữ liệu của bạn để thực hiện các chức năng. 
Mục dưới đây cho các mô tả về công việc khác hơn là đọc (), viết (), và xóa () 
thói quen. 
 + khóa () và mở khóa (): Đây là được sử dụng để thực hiện flash khóa; một 
phần flash được có thể viết hay xóa bảo vệ để ngăn chặn tình cờ ghi đè của 
hình ảnh. Ví dụ, bạn có thể khóa tất cả các phân vùng trên mà bạn có chỉ đọc hệ 
thống tập tin cho hầu hết các hệ thống thực thi trừ khi nâng cấp xong. Đây là 
những xuất khẩu sang các applications người sử dụng ioctls MEMLOCK và 
MEMUNLOCK. 
 + đồng bộ (): Điều này được gọi là khi một thiết bị được đóng cửa hoặc phát 
hành và nó bảo đảm rằng đèn flash là trong trạng thái an toàn. 
 +đình chỉ () andresume (): Đây là những chỉ hữu dụng khi bạn 
bật CONFIG_PM lựa chọn xây dựng hạt nhân. 
 + read_ecc () và write_ecc (): Những thói quen áp dụng cho flash NAND 
chỉ. ECC là sửa chữa sai sót mã được sử dụng để phát hiện bất kỳ bit xấu trong 
một trang. Những thói quen hành xử như là đọc bình thường () / ghi (), ngoại 
trừ rằng một bộ đệm riêng biệt có chứa ECC cũng đọc hay viết cùng với các dữ 
liệu. 
 +read_oob () và write_oob (): Những thói quen áp dụng cho flash NAND 
chỉ. Mỗi flash NAND được chia thành hai 256 - hoặc 512-trang byte; mỗi của 
các trang này có chứa một bổ sung 8 - hoặc 16-byte phụ tùng khu vực được gọi 
là out -dữ liệu của ban nhạc, các cửa hàng của ECC, xấu chặn thông tin, và tập 
tin bất kỳ hệ thống dữ liệu phụ thuộc. Các chức năng này được sử dụng để truy 
cập out-of - ban nhạc dữ liệu. 
1,4 mẫu MTD driver cho NOR Flash
Bây giờ chúng ta đi vào chi tiết của một trình điều khiển đèn flash NOR cho 
Linux. Các tập tin mtd.c có chứa mã cho một đèn flash NOR, đơn giản, dựa trên 
các giả định sau đây. 
 +Các thiết bị đèn flash có một khu vực duy nhất để xóa tất cả các ngành có 
cùng một cỡ. (An xóa vùng được định nghĩa là một khu vực của một con chip 
có chứa thành phần của cùng kích thước.) 
 + Chip flash được truy cập bằng cách sử dụng một 4-byte xe buýt chiều 
rộng. 
 + Không có khóa, mở khóa, đình chỉ, và phục hồi chức năng. 
 Để đơn giản vì lợi ích của chúng tôi giả định rằng các thông tin sau đây có 
sẵn 
đối với chúng tôi như macro hoặc chức năng. 
 - 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 năng thăm dò rằng nếu đèn flash NOR có mặt 
tại địa chỉ cụ thể 
 -WRITE_FLASH_ONE_WORD: Chức năng / macro để viết một từ ở 
một xác định địa chỉ 
 -ERASE_FLASH_SECTOR: Chức năng để xóa một lĩnh vực nhất định 
 -DUMMY_FLASH_ERASE_TIME: Mỗi thời gian trong lĩnh vực xóa 
jiffies 
 Trước tiên chúng ta hãy đặt tất cả các tiêu đề các tập tin, chúng tôi muốn cho 
các driver của đèn flash của chúng tôi.
4. /* mtd.c */
5. #include <linux/kernel.h>
6. #include <linux/module.h>
7. #include <linux/types.h>
8. #include <linux/sched.h>
9. #include <linux/errno.h>
10. #include <linux/interrupt.h>
11. #include <linux/mtd/map.h>
12. #include <linux/mtd/mtd.h>
13. #include <linux/mtd/cfi.h>
14. #include <linux/delay.h>
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 về các đối số được truyền cho các API ở trên là 
như sau. 
 - Bản đồ: Đây là một con trỏ đến một cấu trúc map_info tuyên bố trong 
tiêu đề 
 file include / linux / mtd / map.h. Cấu trúc này được giải thích thêm 
 chi tiết tại mục 4.5. 
 -bắt đầu: Đây là địa chỉ bắt đầu của chip flash NOR. Đây là địa chỉ 
 thường được sử dụng cho các lập trình flash với lệnh xóa hoặc 
 ghi dữ liệu. 
 - addr: Đây là địa chỉ bù đắp từ chipâ € ™ s bắt đầu, nơi dữ liệu 
 cần phải được viết hoặc khu vực cần phải được xoá hoàn toàn. 
 - dữ liệu: đối số này cho viết API là một 32-bit, từ đó xác định những 
gì 
 cần phải được bằng văn bản tại địa chỉ được chỉ định. 
 Tiếp theo, chúng tôi xác định một cấu trúc chứa thông tin cá nhân để đèn 
flash này.
25. struct dummy_private_info_struct
26. {
27. int number_of_chips; /* Number of flash chips */
28. int chipshift; /* Size of each flash */
29. struct flchip *chips;
30. } ;
31. Một lời giải thích ngắn gọn về từng lĩnh vực cấu trúc như sau. 
 number_of_chips: Như tên cho thấy, điều này chỉ rõ có bao nhiêu 
 chip liên tiếp có thể được tìm thấy tại địa chỉ obe pr. API 
 PROBE_FLASH () là bắt buộc để trở về con số này vào mã điều 
khiển. 
 chipshift: Đó là tổng số bit địa chỉ cho thiết bị, mà 
 được sử dụng để tính toán offsets địa chỉ và tổng số byte trong đó 
 các thiết bị có khả năng. 
 chip: Các struct flchip có thể được tìm thấy trong include / linux / 
mtd / 
 flashchip.h. Thêm hình của nó được giải thích trong các dummy_probe 
() function. 
 Tiếp theo là danh sách các chức năng tĩnh cần được khai báo.
32. static struct mtd_info * dummy_probe(struct map_info *);
33. static void dummy_destroy(struct mtd_info *);
34. static int dummy_flash_read(struct mtd_info *, loff_t , size_t ,
35. size_t *, u_char *);
36. static int dummy_flash_erase(struct mtd_info *,
37. struct erase_info *);
38. static int dummy_flash_write(struct mtd_info *, loff_t ,
39. size_t , size_t *, const u_char *);
40. static void dummy_flash_sync(struct mtd_info *);
41. Các mtd_chip_driver cấu trúc được sử dụng bởi những thói quen khởi 
dummy_flash_init () và các chức năng thoát dummy_flash_exit (). Cái 
hầu hết các lĩnh vực quan trọng là probethat. được gọi là để phát hiện nếu 
một flash của một đặc biệt là loại có mặt tại một địa chỉ được chỉ định ở trên 
diễn đàn. Lớp MTD duy trì một danh sách các cấu trúc. Những thói quen 
thăm dò được truy cập khi 
do_map_probe thường trình () được gọi bằng đèn flash, lập bản đồ điều 
khiển.
42. static struct mtd_chip_driver dummy_chipdrv =
43. {
44. .probe = dummy_probe,
45. .destroy = dummy_destroy,
46. .name = "dummy_probe",
47. .module = THIS_MODULE
48. };
49. Bây giờ chúng tôi xác định những thói quen thăm dò. Chức năng này xác 
nhận nếu một đèn flash có thể được tìm thấy tại bản đồ địa chỉ-> virt, được 
làm đầy bởi các trình điều khiển lập bản đồ. Nếu nó là có thể phát hiện một 
đèn flash, sau đó nó phân bổ cơ cấu mtd và dummy_private_info cấu trúc. 
Cơ cấu mtd là đầy khác nhau driver thói quen như đọc, viết, xóa, vv. Cái cơ 
cấu dummy_private_info là đầy đèn flash thông tin cụ thể. Tại chức năng 
thăm dò là những hàng đợi chờ và mutex này. Đây là được sử dụng để ngăn 
chặn đồng thời truy cập vào flash, mà là một yêu cầu cho hầu hết các thiết bị 
đèn flash. Do đó bất cứ khi nào một hoạt động như đọc hoặc viết cần phải 
được thực hiện, Điều này được thực hiện bằng cách sử dụng lĩnh vực nhà 
nước, được thiết lập để FL_READY lúc khởi tạo. Nếu đèn flash là đang 
được sử dụng, sau đó tiến trình cần chặn trên hàng đợi chờ cho đến khi nó 
được đánh thức. Các mutex (spinlock) được dùng để ngăn ngừa những vấn 
đề chủng tộc trên SMP sự mua trước máy hoặc trong trường hợp được kích 
hoạt. 
 Tiếp theo, chúng tôi đi đến thói quen đọc. Những thói quen đọc đăng ký 
với MTD lõi là dummy_flash_read (), được gọi là để đọc lennumber của 
byte từ đèn flash bù đắp từ. Bởi vì các chip span có thể viết nhiều, 
các dummy_flash_read_one_chip chức năng () được gọi là nội bộ để đọc dữ 
liệu từ một con chip duy nhất. Bây giờ chúng ta đi đến thói quen viết. 
Thường đăng ký với MTD lõi là dummy_flash_write (). Bởi vì viết có thể 
bắt đầu từ removed địa chỉ, chức năng bảo đảm rằng nó bộ đệm dữ liệu 
trong trường hợp như vậy và trong lần lượt gọi 
dummy_flash_write_oneword chức năng () để viết 32-bit dữ liệu đến 32-bit 
địa chỉ liên kết.
50. Các chức năng xoá đăng ký để lõi MTD là dummy_flash_erase (). 
Chức năng này cần đảm bảo rằng xoá địa chỉ được chỉ định là khu vực kinh 
tế 
liên kết và số byte được xoá hoàn toàn là một của nhiều kích cỡ khu 
vực. Các dummy_flash_erase_one_block chức năng () được gọi là nội bộ; 
này erases một trong những khu vực kinh tế tại một địa chỉ nhất định. Do 
các khu vực xóa là tốn thời gian,
51. Listing 4.1 Dummy Probe Function
52.
53. static struct mtd_info *dummy_probe(struct map_info *map)
54. {
55. struct mtd_info * mtd = kmalloc(sizeof(*mtd), GFP_KERNEL);
56. unsigned int i;
57. unsigned long size;
58. struct dummy_private_info_struct * dummy_private_info =
59. kmalloc(sizeof(struct dummy_private_info_struct), GFP_KERNEL);
60.
61. if(!dummy_private_info)
62. {
63. return NULL;
64. }
65. memset(dummy_private_info, 0, sizeof(*dummy_private_info));
66.
67. /* The probe function returns the number of chips identified */
68. dummy_private_info->number_of_chips = PROBE_FLASH(map);
69. if(!dummy_private_info->number_of_chips)
70. {
71. kfree(mtd);
72. return NULL;
73. }
74.
75. /* Initialize mtd structure */
76. memset(mtd, 0, sizeof(*mtd));
77. mtd->erasesize = DUMMY_FLASH_ERASE_SIZE;
78. mtd->size = dummy_private_info->number_of_chips * 
DUMMY_FLASH_SIZE;
79. for(size = mtd->size; size > 1; size >>= 1)
80. dummy_private_info->chipshift++;
81. mtd->priv = map;
82. mtd->type = MTD_NORFLASH;
83. mtd->flags = MTD_CAP_NORFLASH;
84. mtd->name = "DUMMY";
85. mtd->erase = dummy_flash_erase;
86. mtd->read = dummy_flash_read;
87. mtd->write = dummy_flash_write;
88. mtd->sync = dummy_flash_sync;
89.
90. dummy_private_info->chips = kmalloc(sizeof(struct flchip) *
91. dummy_private_info->number_of_chips, GFP_KERNEL);
92. memset(dummy_private_info->chips, 0,
93. sizeof(*(dummy_private_info->chips)));
94. for(i=0; i < dummy_private_info->number_of_chips; i++)
95. {
96. dummy_private_info->chips[i].start = (DUMMY_FLASH_SIZE * i);
97. dummy_private_info->chips[i].state = FL_READY;
98. dummy_private_info->chips[i].mutex =
99. &dummy_private_info->chips[i]._spinlock;
100. init_waitqueue_head(&dummy_private_info->chips[i].wq);
101. spin_lock_init(&dummy_private_info->chips[i]._spinlock);
102. dummy_private_info->chips[i].erase_time = 
DUMMY_FLASH_ERASE_TIME;
103. }
104.
105. map->fldrv = &dummy_chipdrv;
106. map->fldrv_priv = dummy_private_info;
107.
108. printk("Probed and found the dummy flash chip\n");
109. return mtd;
110. }
111. Listing 4.2 Dummy Read Routines
112.
113. static inline int dummy_flash_read_one_chip(struct map_info *map,
114. struct flchip *chip, loff_t addr, size_t len, u_char *buf)
115. {
116. DECLARE_WAITQUEUE(wait, current);
117.
118. again:
119. spin_lock(chip->mutex);
120.
121. if(chip->state != FL_READY)
122. {
123. set_current_state(TASK_UNINTERRUPTIBLE);
124. add_wait_queue(&chip->wq, &wait);
125. spin_unlock(chip->mutex);
126. schedule();
127. remove_wait_queue(&chip->wq, &wait);
128. if(signal_pending(current))
129. return -EINTR;