/* * (C) Copyright 2007-2013 * Allwinner Technology Co., Ltd. * Jerry Wang * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ #include #include #include "nand_bsp.h" #include extern int NAND_UbootInit(int boot_mode); extern int NAND_UbootToPhy(void); extern int NAND_UbootExit(void); extern uint NAND_UbootRead(uint start, uint sectors, void *buffer); extern uint NAND_UbootWrite(uint start, uint sectors, void *buffer); extern int NAND_BurnBoot0(uint length, void *buffer); extern int NAND_BurnUboot(uint length, void *buffer); extern int NAND_ReadBoot0(uint length, void *buffer); extern int NAND_PhyInit(void); extern int NAND_PhyExit(void); extern int NAND_Uboot_Erase(int erase_flag); extern int NAND_UbootProbe(void); extern int NAND_GetParam_store(void *buffer, uint length); extern int NAND_FlushCache(void); extern PARTITION_MBR nand_mbr; extern int mbr_burned_flag; static int nand_open_times; int nand_get_mbr(char* buffer, uint len) { int i,j; sunxi_mbr_t *mbr = (sunxi_mbr_t *)buffer; nand_mbr.PartCount = mbr->PartCount +1; nand_mbr.array[0].addr = 0; nand_mbr.array[0].len = 32*1024; nand_mbr.array[0].user_type = 0x8000; nand_mbr.array[0].classname[0] = 'm'; nand_mbr.array[0].classname[1] = 'b'; nand_mbr.array[0].classname[2] = 'r'; nand_mbr.array[0].classname[3] = '\0'; for(i=1; iarray[i-1].name[j]; nand_mbr.array[i].addr = nand_mbr.array[i-1].addr + nand_mbr.array[i-1].len; nand_mbr.array[i].len = mbr->array[i-1].lenlo; nand_mbr.array[i].user_type =mbr->array[i-1].user_type; if(i == 1) nand_mbr.array[0].user_type = nand_mbr.array[1].user_type; } for(j=0;j<16;j++) nand_mbr.array[nand_mbr.PartCount-1].classname[j] = mbr->array[nand_mbr.PartCount-2].name[j]; nand_mbr.array[nand_mbr.PartCount-1].addr = nand_mbr.array[nand_mbr.PartCount-2].addr + nand_mbr.array[nand_mbr.PartCount-2].len; nand_mbr.array[nand_mbr.PartCount-1].len = 0; //for DEBUG { printf("total part: %d\n", nand_mbr.PartCount); for(i=0; i