ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

main.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.