Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmain.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: OMAP3 NAND Flashing Utility 00003 * LICENSE: BSD - See COPYING.ARM in the top level directory 00004 * FILE: tools/nandflash/main.c 00005 * PURPOSE: Flashes OmapLDR, FreeLDR and a Root FS into a NAND image 00006 * PROGRAMMERS: ReactOS Portable Systems Group 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include "nandflash.h" 00012 00013 /* GLOBALS ********************************************************************/ 00014 00015 /* File Names */ 00016 PCHAR NandImageName = "reactos.bin"; 00017 PCHAR LlbImageName = "./output-arm/boot/armllb/armllb.bin"; 00018 PCHAR BootLdrImageName = "./output-arm/boot/freeldr/freeldr/freeldr.sys"; 00019 PCHAR FsImageName = "ramdisk.img"; 00020 PCHAR RamImageName = "ramdisk.bin"; 00021 00022 /* NAND On-Disk Memory Map */ 00023 ULONG LlbStart = 0x00000000, LlbEnd = 0x00010000; // 64 KB 00024 ULONG BootLdrStart = 0x00010000, BootLdrEnd = 0x00090000; // 512 KB 00025 ULONG FsStart = 0x00090000, FsEnd = 0x10000000; // 255 MB 00026 00027 /* Should we write OOB data? */ 00028 ULONG NeedsOob = TRUE; 00029 00030 /* FUNCTIONS ******************************************************************/ 00031 00032 INT 00033 NTAPI 00034 CreateFlashFile(VOID) 00035 { 00036 INT FileDescriptor, i; 00037 CHAR Buffer[NAND_PAGE_SIZE + NAND_OOB_SIZE]; 00038 00039 /* Try open NAND image */ 00040 FileDescriptor = open(NandImageName, O_RDWR); 00041 if (FileDescriptor) 00042 { 00043 /* Create NAND image */ 00044 FileDescriptor = open(NandImageName, O_RDWR | O_CREAT); 00045 if (FileDescriptor) return FileDescriptor; 00046 00047 /* Create zero buffer */ 00048 memset(Buffer, 0xff, sizeof(Buffer)); 00049 00050 /* Write zero buffer */ 00051 for (i = 0; i < NAND_PAGES; i++) write(FileDescriptor, Buffer, sizeof(Buffer)); 00052 } 00053 00054 /* Return NAND descriptor */ 00055 return FileDescriptor; 00056 } 00057 00058 VOID 00059 NTAPI 00060 WriteToFlash(IN INT NandImageFile, 00061 IN INT ImageFile, 00062 IN ULONG ImageStart, 00063 IN ULONG ImageEnd) 00064 { 00065 CHAR Data[NAND_PAGE_SIZE], Oob[NAND_OOB_SIZE]; 00066 ULONG StartPage, EndPage, i, OobSize = 0; 00067 BOOLEAN KeepGoing = TRUE; 00068 00069 /* Offset to NAND Page convert */ 00070 StartPage = ImageStart / NAND_PAGE_SIZE; 00071 EndPage = ImageEnd / NAND_PAGE_SIZE; 00072 00073 /* Jump to NAND offset */ 00074 if (NeedsOob) OobSize = NAND_OOB_SIZE; 00075 lseek(NandImageFile, StartPage * (NAND_PAGE_SIZE + OobSize), SEEK_SET); 00076 00077 /* Set input image offset */ 00078 lseek(ImageFile, 0, SEEK_SET); 00079 00080 /* Create zero buffer */ 00081 memset(Data, 0xff, NAND_PAGE_SIZE); 00082 memset(Oob, 0xff, NAND_OOB_SIZE); 00083 00084 /* Parse NAND Pages */ 00085 for (i = StartPage; i < EndPage; i++) 00086 { 00087 /* Read NAND page from input image */ 00088 if (read(ImageFile, Data, NAND_PAGE_SIZE) < NAND_PAGE_SIZE) 00089 { 00090 /* Do last write and quit after */ 00091 KeepGoing = FALSE; 00092 } 00093 00094 /* Write OOB and NAND Data */ 00095 write(NandImageFile, Data, NAND_PAGE_SIZE); 00096 if (NeedsOob) write(NandImageFile, Oob, NAND_OOB_SIZE); 00097 00098 /* Next page if data continues */ 00099 if (!KeepGoing) break; 00100 } 00101 } 00102 00103 VOID 00104 NTAPI 00105 WriteLlb(IN INT NandImageFile) 00106 { 00107 INT FileDescriptor; 00108 00109 /* Open LLB and write it */ 00110 FileDescriptor = open(LlbImageName, O_RDWR); 00111 WriteToFlash(NandImageFile, FileDescriptor, LlbStart, LlbEnd); 00112 close(FileDescriptor); 00113 } 00114 00115 VOID 00116 NTAPI 00117 WriteBootLdr(IN INT NandImageFile) 00118 { 00119 INT FileDescriptor; 00120 00121 /* Open FreeLDR and write it */ 00122 FileDescriptor = open(BootLdrImageName, O_RDWR); 00123 WriteToFlash(NandImageFile, FileDescriptor, BootLdrStart, BootLdrEnd); 00124 close(FileDescriptor); 00125 } 00126 00127 VOID 00128 NTAPI 00129 WriteFileSystem(IN INT NandImageFile) 00130 { 00131 INT FileDescriptor; 00132 00133 /* Open FS image and write it */ 00134 FileDescriptor = open(FsImageName, O_RDWR); 00135 WriteToFlash(NandImageFile, FileDescriptor, FsStart, FsEnd); 00136 close(FileDescriptor); 00137 } 00138 00139 VOID 00140 NTAPI 00141 WriteRamDisk(IN INT RamDiskFile) 00142 { 00143 INT FileDescriptor; 00144 00145 /* Open FS image and write it 16MB later */ 00146 FileDescriptor = open(FsImageName, O_RDWR); 00147 WriteToFlash(RamDiskFile, FileDescriptor, 16 * 1024 * 1024, (32 + 16) * 1024 * 1024); 00148 close(FileDescriptor); 00149 } 00150 00151 int 00152 main(ULONG argc, 00153 char **argv) 00154 { 00155 INT NandImageFile, RamDiskFile; 00156 00157 /* Flat NAND, no OOB */ 00158 if (argc == 2) NeedsOob = FALSE; 00159 00160 /* Open or create NAND Image File */ 00161 NandImageFile = CreateFlashFile(); 00162 if (!NandImageFile) exit(-1); 00163 00164 /* Write components */ 00165 WriteLlb(NandImageFile); 00166 WriteBootLdr(NandImageFile); 00167 if (NeedsOob) 00168 { 00169 /* Write the ramdisk normaly */ 00170 WriteFileSystem(NandImageFile); 00171 } 00172 else 00173 { 00174 /* Open a new file for the ramdisk */ 00175 RamDiskFile = open(RamImageName, O_RDWR | O_CREAT); 00176 if (!RamDiskFile) exit(-1); 00177 00178 /* Write it */ 00179 WriteRamDisk(RamDiskFile); 00180 00181 /* Close */ 00182 close(RamDiskFile); 00183 } 00184 00185 00186 /* Close and return */ 00187 close(NandImageFile); 00188 return 0; 00189 } 00190 00191 /* EOF */ Generated on Sun May 27 2012 04:16:44 for ReactOS by
1.7.6.1
|