2 * PROJECT: OMAP3 NAND Flashing Utility
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: tools/nandflash/main.c
5 * PURPOSE: Flashes OmapLDR, FreeLDR and a Root FS into a NAND image
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
11 #include "nandflash.h"
13 /* GLOBALS ********************************************************************/
16 PCHAR NandImageName
= "reactos.bin";
17 PCHAR LlbImageName
= "./output-arm/boot/armllb/armllb.bin";
18 PCHAR BootLdrImageName
= "./output-arm/boot/freeldr/freeldr/freeldr.sys";
19 PCHAR FsImageName
= "ramdisk.img";
20 PCHAR RamImageName
= "ramdisk.bin";
22 /* NAND On-Disk Memory Map */
23 ULONG LlbStart
= 0x00000000, LlbEnd
= 0x00010000; // 64 KB
24 ULONG BootLdrStart
= 0x00010000, BootLdrEnd
= 0x00090000; // 512 KB
25 ULONG FsStart
= 0x00090000, FsEnd
= 0x10000000; // 255 MB
27 /* Should we write OOB data? */
28 ULONG NeedsOob
= TRUE
;
30 /* FUNCTIONS ******************************************************************/
36 INT FileDescriptor
, i
;
37 CHAR Buffer
[NAND_PAGE_SIZE
+ NAND_OOB_SIZE
];
39 /* Try open NAND image */
40 FileDescriptor
= open(NandImageName
, O_RDWR
);
43 /* Create NAND image */
44 FileDescriptor
= open(NandImageName
, O_RDWR
| O_CREAT
);
45 if (FileDescriptor
) return FileDescriptor
;
47 /* Create zero buffer */
48 memset(Buffer
, 0xff, sizeof(Buffer
));
50 /* Write zero buffer */
51 for (i
= 0; i
< NAND_PAGES
; i
++) write(FileDescriptor
, Buffer
, sizeof(Buffer
));
54 /* Return NAND descriptor */
55 return FileDescriptor
;
60 WriteToFlash(IN INT NandImageFile
,
65 CHAR Data
[NAND_PAGE_SIZE
], Oob
[NAND_OOB_SIZE
];
66 ULONG StartPage
, EndPage
, i
, OobSize
= 0;
67 BOOLEAN KeepGoing
= TRUE
;
69 /* Offset to NAND Page convert */
70 StartPage
= ImageStart
/ NAND_PAGE_SIZE
;
71 EndPage
= ImageEnd
/ NAND_PAGE_SIZE
;
73 /* Jump to NAND offset */
74 if (NeedsOob
) OobSize
= NAND_OOB_SIZE
;
75 lseek(NandImageFile
, StartPage
* (NAND_PAGE_SIZE
+ OobSize
), SEEK_SET
);
77 /* Set input image offset */
78 lseek(ImageFile
, 0, SEEK_SET
);
80 /* Create zero buffer */
81 memset(Data
, 0xff, NAND_PAGE_SIZE
);
82 memset(Oob
, 0xff, NAND_OOB_SIZE
);
84 /* Parse NAND Pages */
85 for (i
= StartPage
; i
< EndPage
; i
++)
87 /* Read NAND page from input image */
88 if (read(ImageFile
, Data
, NAND_PAGE_SIZE
) < NAND_PAGE_SIZE
)
90 /* Do last write and quit after */
94 /* Write OOB and NAND Data */
95 write(NandImageFile
, Data
, NAND_PAGE_SIZE
);
96 if (NeedsOob
) write(NandImageFile
, Oob
, NAND_OOB_SIZE
);
98 /* Next page if data continues */
99 if (!KeepGoing
) break;
105 WriteLlb(IN INT NandImageFile
)
109 /* Open LLB and write it */
110 FileDescriptor
= open(LlbImageName
, O_RDWR
);
111 WriteToFlash(NandImageFile
, FileDescriptor
, LlbStart
, LlbEnd
);
112 close(FileDescriptor
);
117 WriteBootLdr(IN INT NandImageFile
)
121 /* Open FreeLDR and write it */
122 FileDescriptor
= open(BootLdrImageName
, O_RDWR
);
123 WriteToFlash(NandImageFile
, FileDescriptor
, BootLdrStart
, BootLdrEnd
);
124 close(FileDescriptor
);
129 WriteFileSystem(IN INT NandImageFile
)
133 /* Open FS image and write it */
134 FileDescriptor
= open(FsImageName
, O_RDWR
);
135 WriteToFlash(NandImageFile
, FileDescriptor
, FsStart
, FsEnd
);
136 close(FileDescriptor
);
141 WriteRamDisk(IN INT RamDiskFile
)
145 /* Open FS image and write it 16MB later */
146 FileDescriptor
= open(FsImageName
, O_RDWR
);
147 WriteToFlash(RamDiskFile
, FileDescriptor
, 16 * 1024 * 1024, (32 + 16) * 1024 * 1024);
148 close(FileDescriptor
);
155 INT NandImageFile
, RamDiskFile
;
157 /* Flat NAND, no OOB */
158 if (argc
== 2) NeedsOob
= FALSE
;
160 /* Open or create NAND Image File */
161 NandImageFile
= CreateFlashFile();
162 if (!NandImageFile
) exit(-1);
164 /* Write components */
165 WriteLlb(NandImageFile
);
166 WriteBootLdr(NandImageFile
);
169 /* Write the ramdisk normaly */
170 WriteFileSystem(NandImageFile
);
174 /* Open a new file for the ramdisk */
175 RamDiskFile
= open(RamImageName
, O_RDWR
| O_CREAT
);
176 if (!RamDiskFile
) exit(-1);
179 WriteRamDisk(RamDiskFile
);
186 /* Close and return */
187 close(NandImageFile
);