- Fix bugs.
[reactos.git] / reactos / tools / nandflash / main.c
1 /*
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
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "nandflash.h"
12
13 /* GLOBALS ********************************************************************/
14
15 /* File Names */
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";
20
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
25
26 /* Should we write OOB data? */
27 ULONG NeedsOob = TRUE;
28
29 /* FUNCTIONS ******************************************************************/
30
31 INT
32 NTAPI
33 CreateFlashFile(VOID)
34 {
35 INT FileDescriptor, i;
36 CHAR Buffer[NAND_PAGE_SIZE + NAND_OOB_SIZE];
37
38 /* Try open NAND image */
39 FileDescriptor = open(NandImageName, O_RDWR);
40 if (FileDescriptor)
41 {
42 /* Create NAND image */
43 FileDescriptor = open(NandImageName, O_RDWR | O_CREAT);
44 if (FileDescriptor) return FileDescriptor;
45
46 /* Create zero buffer */
47 memset(Buffer, 0xff, sizeof(Buffer));
48
49 /* Write zero buffer */
50 for (i = 0; i < NAND_PAGES; i++) write(FileDescriptor, Buffer, sizeof(Buffer));
51 }
52
53 /* Return NAND descriptor */
54 return FileDescriptor;
55 }
56
57 VOID
58 NTAPI
59 WriteToFlash(IN INT NandImageFile,
60 IN INT ImageFile,
61 IN ULONG ImageStart,
62 IN ULONG ImageEnd)
63 {
64 CHAR Data[NAND_PAGE_SIZE], Oob[NAND_OOB_SIZE];
65 ULONG StartPage, EndPage, i, OobSize = 0;
66 BOOLEAN KeepGoing = TRUE;
67
68 /* Offset to NAND Page convert */
69 StartPage = ImageStart / NAND_PAGE_SIZE;
70 EndPage = ImageEnd / NAND_PAGE_SIZE;
71
72 /* Jump to NAND offset */
73 if (NeedsOob) OobSize = NAND_OOB_SIZE;
74 lseek(NandImageFile, StartPage * (NAND_PAGE_SIZE + OobSize), SEEK_SET);
75
76 /* Set input image offset */
77 lseek(ImageFile, 0, SEEK_SET);
78
79 /* Create zero buffer */
80 memset(Data, 0xff, NAND_PAGE_SIZE);
81 memset(Oob, 0xff, NAND_OOB_SIZE);
82
83 /* Parse NAND Pages */
84 for (i = StartPage; i < EndPage; i++)
85 {
86 /* Read NAND page from input image */
87 if (read(ImageFile, Data, NAND_PAGE_SIZE) < NAND_PAGE_SIZE)
88 {
89 /* Do last write and quit after */
90 KeepGoing = FALSE;
91 }
92
93 /* Write OOB and NAND Data */
94 write(NandImageFile, Data, NAND_PAGE_SIZE);
95 if (NeedsOob) write(NandImageFile, Oob, NAND_OOB_SIZE);
96
97 /* Next page if data continues */
98 if (!KeepGoing) break;
99 }
100 }
101
102 VOID
103 NTAPI
104 WriteLlb(IN INT NandImageFile)
105 {
106 INT FileDescriptor;
107
108 /* Open LLB and write it */
109 FileDescriptor = open(LlbImageName, O_RDWR);
110 WriteToFlash(NandImageFile, FileDescriptor, LlbStart, LlbEnd);
111 close(FileDescriptor);
112 }
113
114 VOID
115 NTAPI
116 WriteBootLdr(IN INT NandImageFile)
117 {
118 INT FileDescriptor;
119
120 /* Open FreeLDR and write it */
121 FileDescriptor = open(BootLdrImageName, O_RDWR);
122 WriteToFlash(NandImageFile, FileDescriptor, BootLdrStart, BootLdrEnd);
123 close(FileDescriptor);
124 }
125
126 VOID
127 NTAPI
128 WriteFileSystem(IN INT NandImageFile)
129 {
130 INT FileDescriptor;
131
132 /* Open FS image and write it */
133 FileDescriptor = open(FsImageName, O_RDWR);
134 WriteToFlash(NandImageFile, FileDescriptor, FsStart, FsEnd);
135 close(FileDescriptor);
136 }
137
138 int
139 main(ULONG argc,
140 char **argv)
141 {
142 INT NandImageFile;
143
144 /* Flat NAND, no OOB */
145 if (argc == 2) NeedsOob = FALSE;
146
147 /* Open or create NAND Image File */
148 NandImageFile = CreateFlashFile();
149 if (!NandImageFile) exit(-1);
150
151 /* Write components */
152 WriteLlb(NandImageFile);
153 WriteBootLdr(NandImageFile);
154 WriteFileSystem(NandImageFile);
155
156 /* Close and return */
157 close(NandImageFile);
158 return 0;
159 }
160
161 /* EOF */