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
= "ReactOS.img";
21 /* NAND On-Disk Memory Map */
22 ULONG LlbStart
= 0x00000000, LlbEnd
= 0x00010000; // 64 KB
23 ULONG BootLdrStart
= 0x00010000, BootLdrEnd
= 0x00090000; // 512 KB
24 ULONG FsStart
= 0x00090000, FsEnd
= 0x10000000; // 255 MB
26 /* Should we write OOB data? */
27 ULONG NeedsOob
= TRUE
;
29 /* FUNCTIONS ******************************************************************/
35 INT FileDescriptor
, i
;
36 CHAR Buffer
[NAND_PAGE_SIZE
+ NAND_OOB_SIZE
];
38 /* Try open NAND image */
39 FileDescriptor
= open(NandImageName
, O_RDWR
);
42 /* Create NAND image */
43 FileDescriptor
= open(NandImageName
, O_RDWR
| O_CREAT
);
44 if (FileDescriptor
) return FileDescriptor
;
46 /* Create zero buffer */
47 memset(Buffer
, 0xff, sizeof(Buffer
));
49 /* Write zero buffer */
50 for (i
= 0; i
< NAND_PAGES
; i
++) write(FileDescriptor
, Buffer
, sizeof(Buffer
));
53 /* Return NAND descriptor */
54 return FileDescriptor
;
59 WriteToFlash(IN INT NandImageFile
,
64 CHAR Data
[NAND_PAGE_SIZE
], Oob
[NAND_OOB_SIZE
];
65 ULONG StartPage
, EndPage
, i
, OobSize
= 0;
66 BOOLEAN KeepGoing
= TRUE
;
68 /* Offset to NAND Page convert */
69 StartPage
= ImageStart
/ NAND_PAGE_SIZE
;
70 EndPage
= ImageEnd
/ NAND_PAGE_SIZE
;
72 /* Jump to NAND offset */
73 if (NeedsOob
) OobSize
= NAND_OOB_SIZE
;
74 lseek(NandImageFile
, StartPage
* (NAND_PAGE_SIZE
+ OobSize
), SEEK_SET
);
76 /* Set input image offset */
77 lseek(ImageFile
, 0, SEEK_SET
);
79 /* Create zero buffer */
80 memset(Data
, 0xff, NAND_PAGE_SIZE
);
81 memset(Oob
, 0xff, NAND_OOB_SIZE
);
83 /* Parse NAND Pages */
84 for (i
= StartPage
; i
< EndPage
; i
++)
86 /* Read NAND page from input image */
87 if (read(ImageFile
, Data
, NAND_PAGE_SIZE
) < NAND_PAGE_SIZE
)
89 /* Do last write and quit after */
93 /* Write OOB and NAND Data */
94 write(NandImageFile
, Data
, NAND_PAGE_SIZE
);
95 if (NeedsOob
) write(NandImageFile
, Oob
, NAND_OOB_SIZE
);
97 /* Next page if data continues */
98 if (!KeepGoing
) break;
104 WriteLlb(IN INT NandImageFile
)
108 /* Open LLB and write it */
109 FileDescriptor
= open(LlbImageName
, O_RDWR
);
110 WriteToFlash(NandImageFile
, FileDescriptor
, LlbStart
, LlbEnd
);
111 close(FileDescriptor
);
116 WriteBootLdr(IN INT NandImageFile
)
120 /* Open FreeLDR and write it */
121 FileDescriptor
= open(BootLdrImageName
, O_RDWR
);
122 WriteToFlash(NandImageFile
, FileDescriptor
, BootLdrStart
, BootLdrEnd
);
123 close(FileDescriptor
);
128 WriteFileSystem(IN INT NandImageFile
)
132 /* Open FS image and write it */
133 FileDescriptor
= open(FsImageName
, O_RDWR
);
134 WriteToFlash(NandImageFile
, FileDescriptor
, FsStart
, FsEnd
);
135 close(FileDescriptor
);
144 /* Flat NAND, no OOB */
145 if (argc
== 2) NeedsOob
= FALSE
;
147 /* Open or create NAND Image File */
148 NandImageFile
= CreateFlashFile();
149 if (!NandImageFile
) exit(-1);
151 /* Write components */
152 WriteLlb(NandImageFile
);
153 WriteBootLdr(NandImageFile
);
154 WriteFileSystem(NandImageFile
);
156 /* Close and return */
157 close(NandImageFile
);