2011-12-21 33 views
10

Tôi đang làm việc trên một bo mạch phát triển nhúng ARM9. Trong đó tôi muốn sắp xếp lại phân vùng nand của tôi. Ai có thể cho tôi biết làm thế nào để làm điều đó?Phân vùng Nand trong u-boot

Trong vỏ khởi động u nếu tôi đưa ra lệnh mtdparts cung cấp thông tin sau.

Boardcon> mtdparts  

device nand0 <nandflash0>, # parts = 7 

#: name    size   offset   mask_flags 
0: bios    0x00040000  0x00000000  0 
1: params    0x00020000  0x00040000  0 
2: toc     0x00020000  0x00060000  0 
3: eboot    0x00080000  0x00080000  0 
4: logo    0x00100000  0x00100000  0 
5: kernel    0x00200000  0x00200000  0 
6: root    0x03c00000  0x00400000  0 

active partition: nand0,0 - (bios) 0x00040000 @ 0x00000000 

defaults: 
mtdids : nand0=nandflash0 
mtdparts: mtdparts=nandflash0:[email protected](bios),128k(params),128k(toc),512k(eboot),1024k(logo),2m(kernel),-(root) 

nhắn Kernel khởi động cho thấy như sau:

Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit": 
0x000000000000-0x000000040000 : "Boardcon_Board_uboot" 
0x000000200000-0x000000400000 : "Boardcon_Board_kernel" 
0x000000400000-0x000003ff8000 : "Boardcon_Board_yaffs2" 

Bất kỳ ai có thể vui lòng giải thích cho tôi mối quan hệ giữa cả hai thông điệp là gì. Và một trong hai hạt nhân hoặc khởi động u có trách nhiệm tạo ra các phần trên nand flash ?. Đối với như tôi biết hạt nhân không phải là tạo phân vùng trên mỗi khởi động nhưng tại sao thông báo "Tạo 3 phân vùng MTD"?

Trả lời

1

bạn có thể đặt biến môi trường mtdparts để làm như vậy trong uboot, và hạt nhân chỉ sử dụng này nếu bạn vượt qua điều này trong dòng lệnh khởi động hạt nhân, nếu không nó sẽ mặc định cấu trúc phân vùng nand trong mã nguồn hạt nhân cho bạn nền tảng, trong trường hợp này, mặc định là phân vùng 3 MTD.

+0

Cảm ơn câu trả lời của bạn.Nhưng tôi đang nhận được thông báo ** Tạo 3 phân vùng MTD ** trên mỗi lần khởi động. Hạt nhân có thay đổi nand phân vùng trên mỗi lần khởi động không? Nếu tôi muốn thay đổi nand phân vùng thông qua khởi động u, lệnh nào tôi nên sử dụng? – yuvaeasy

+1

Tôi rất tiếc khi nói điều này nhưng bạn luôn có thể sử dụng google. http://www.denx.de/wiki/DULG/UBootCmdGroupFlash đây là những gì tôi tìm thấy dễ dàng trên trang web chính thức của u-boot thông qua google, bạn có thể muốn đọc về sự hiểu biết của bạn về khởi động u. – andycjw

+0

Cảm ơn tôi sẽ cố gắng hiểu. – yuvaeasy

20

Đối với thiết bị flash, NAND hoặc NOR, không có bảng phân vùng trên chính thiết bị. Tức là, bạn không thể đọc thiết bị trong đầu đọc flash và tìm một số bảng cho biết có bao nhiêu phân vùng trên thiết bị và nơi mỗi phân vùng bắt đầu và kết thúc. Chỉ có một chuỗi các khối không phân biệt. Đây là sự khác biệt cơ bản giữa các thiết bị và thiết bị flash MTD như đĩa hoặc thiết bị FTL như MMC.

Do đó, việc phân vùng thiết bị flash trong mắt của đối tượng, nghĩa là khởi động hoặc hạt nhân và phân vùng được "tạo" khi ứng xử chạy. Đó là lý do tại sao bạn thấy thông báo Creating 3 MTD partitions. Nó phản ánh thực tế là các phân vùng flash thực sự chỉ tồn tại trong hệ thống MTD của hạt nhân đang chạy, không phải trên chính thiết bị flash.

Điều này dẫn đến tình huống trong đó U-Boot và hạt nhân có thể có các định nghĩa khác nhau của phân vùng flash, điều này rõ ràng là những gì đã xảy ra trong trường hợp OP.

Trong U-Boot, bạn xác định phân vùng flash trong biến môi trường mtdparts. Trong hạt nhân Linux, các phân vùng flash được quy định tại các địa điểm sau:

  1. trong kernel cũ (ví dụ 2.6.35 cho i.MX28) các phân vùng đèn flash có thể được mã hóa cứng trong gpmi-nfc-mil.c hoặc mã nguồn điều khiển khác. (Thật là tiếc!).
  2. Trong hạt nhân đường chính mới hơn với sự hỗ trợ cây thiết bị, bạn có thể xác định paritions MTD trong cây thiết bị
  3. Trong kernel mới có thường được hỗ trợ cho định nghĩa phân vùng kernel dòng lệnh sử dụng một dòng lệnh như root=/dev/mmcblk0p2 rootwait console=ttyS2,115200 mtdparts=nand:6656k(all),1m(squash),-(jffs2)

Loại hỗ trợ phân vùng mà bạn có trong hạt nhân do đó phụ thuộc vào loại flash bạn đang sử dụng, cho dù trình điều khiển có hỗ trợ phân tích dòng lệnh hạt nhân hay không và hạt nhân của bạn có hỗ trợ cây thiết bị hay không.

Trong mọi trường hợp, có nguy cơ xung đột giữa U-Boot và phân vùng hạt nhân của flash.Do đó, đề xuất của tôi là xác định phân vùng flash trong biến U2 Boot mtdparts và chuyển nó tới hạt nhân trong dòng lệnh hạt nhân U-Boot, giả sử rằng hạt nhân của bạn hỗ trợ tùy chọn này.

+0

Yêu cầu của bạn rằng không có bảng phân vùng trên thiết bị flash là sai. Các thiết bị sử dụng chip Tegra, OMAP hoặc Qualcomm có thể có GPT trong bộ nhớ flash. – Melab

+1

@Melab: SoC của bạn đề cập đến hỗ trợ MMC, eMMC hoặc thiết bị ngoại vi SD. Mặc dù chúng thường dựa trên công nghệ flash, nhưng chúng không giống như flash nguyên hoặc MTD mà OP yêu cầu. Lệnh U-Boot 'mtdparts' mà OP hỏi về liên quan đến NAND hoặc NOR flash thô, không phải flash" quản lý "như MMC, eMMC hoặc SD. Bạn có thể tìm thấy một mô tả ngắn gọn về sự khác biệt trong các lệnh U-Boot trong http://processors.wiki.ti.com/index.php/Linux_Core_U-Boot_User%27s_Guide#Using_NAND. –

+0

Melab sai Jonathan bạn nói đúng. MTD flash không có bảng phân vùng và có các phân vùng được "định nghĩa" thông qua chuỗi mtdparts cho u-boot và hạt nhân linux hoặc thông qua .dts (và do đó .dtb). Một số bộ điều khiển có thể khác nhau nhưng điều này có vẻ là kinh nghiệm của tôi ở đây trên Linux Sunxi và chip Allwinner. –