Пример #1
0
int modify_system_uart(void)
{
    script_gpio_set_t fetch_cfg_gpio[2];
    int uart_port_id = 0;
    char uartname[16] ;
    char uart_data[8] ;
    int sdc0_used = 0;

    if(script_parser_fetch("force_uart_para","force_uart_rx",(int *)(&fetch_cfg_gpio[0]),sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error: can't find force_uart_rx \n");
        return -1;
    }
    if(script_parser_fetch("force_uart_para","force_uart_tx",(int *)(&fetch_cfg_gpio[1]),sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error: can't find force_uart_tx \n");
        return -1;
    }
    if(script_parser_fetch("force_uart_para","force_uart_port",(int *)(&uart_port_id),sizeof(int)/4))
    {
        printf("debug_mode_error: can't find card0_tx \n");
        return -1;
    }
    memset(uartname,0,16);
    memset(uart_data,0,8);
#if defined (CONFIG_ARCH_SUN7I) ||defined(CONFIG_ARCH_SUN8IW1P1)
    strcat(uartname,"uart_para");
#else
	strcat(uartname,"uart");
#endif
    sprintf(uart_data,"%d",uart_port_id);
    strcat(uartname,uart_data);
    printf("the uartname is %s  \n",uartname);
    if(script_parser_patch(uartname,"uart_port",(int *)(&uart_port_id),sizeof(int)/4))
    {
        printf("debug_mode_error : can't find uart_debug_port \n");
        return -1;
    }
    if(script_parser_patch(uartname,"uart_rx",(void*)&fetch_cfg_gpio[0],sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error : can't patch uart_debug_rx\n");
        return -1;
    }
    if(script_parser_patch(uartname,"uart_tx",(void*)&fetch_cfg_gpio[1],sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error : can't patch uart_debug_rx\n");
        return -1;
    }
//disable card0 init in linux
    if(script_parser_patch("mmc0_para","sdc_used",(int *)(&sdc0_used),sizeof(int)/4))
    {
        printf("debug_mode_error :can not patch sdc_used \n");
        return -1;
    }
    return 0;
}
Пример #2
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  :
*
*    说明    :
*
*
************************************************************************************************************
*/
int power_oz_probe(void)
{
	int ret;
	u32 oz_power_hd;
	user_gpio_set_t oz_gpio_cfg[1];

	memset(oz_gpio_cfg, 0, sizeof(oz_gpio_cfg));
	ret = script_parser_fetch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int));
	if(ret)
	{
		printf("get a15_pwr_en cfg failed\n");
		return -1;
	}

	oz_gpio_cfg[0].data = 1;

	//配置使能gpio
	ret = script_parser_patch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int));
	if(ret)
	{
		printf("patch a15_pwr_en config failed\n");
		return -2;
	}

	oz_power_hd = gpio_request_simple("external_power", "a15_pwr_en");
	if(oz_power_hd)
	{
		printf("set gpio failed\n");
		return -3;
	}
	return 0;
}
Пример #3
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:power_oz_patch_gpio
*
*    参数列表:
*
*    返回值  :
*
*    说明    :change the gpio data status in sys_config.fex with the vol input 
*
*
************************************************************************************************************
*/
static int power_oz_patch_gpio(int set_vol)
{
	int ret;
	int i;
	u8 index;
	char sub_name[16];
	user_gpio_set_t oz_gpio_cfg[3];
	memset(oz_gpio_cfg, 0, sizeof(oz_gpio_cfg));

	ret = script_parser_fetch("external_power", "a15_vset1", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int));
	if(ret)
	{
		printf("get oz power cfg failed\n");
		return -1;
	}

	ret = script_parser_fetch("external_power", "a15_vset2", (int*)&oz_gpio_cfg[1], sizeof(oz_gpio_cfg[1])/sizeof(int));
	if(ret)
	{
		printf("get oz power cfg failed\n");
		return -1;
	}

	ret = script_parser_fetch("external_power", "a15_vset3", (int*)&oz_gpio_cfg[2], sizeof(oz_gpio_cfg[2])/sizeof(int));
	if(ret)
	{
		printf("get oz power cfg failed\n");
		return -1;
	}

	//get the gpio status with the set_vol
	index = power_oz_probe_gpio(set_vol);

	//配置gpio data
	for(i = 0; i < 3; i++)
	{
		oz_gpio_cfg[i].data = gpio_value[index][i];
		memset(sub_name, 0, 16);
		sprintf(sub_name, "%s%d", "a15_vset", i+1);
		ret = script_parser_patch("external_power", sub_name, (void *)&oz_gpio_cfg[i], sizeof(oz_gpio_cfg[i])/sizeof(int));
		if(ret)
		{
			printf("patch gpio config failed\n");
			return -2;
		}
	}

	return 0;
}
Пример #4
0
int sunxi_flash_handle_init(void)
{
    int workmode;
	int storage_type;
	int card_no;
//	long long flash_size;

//	uboot_spare_head.boot_data.storage_type = 0;
//	if(uboot_spare_head.boot_data.storage_type)
//		uboot_spare_head.boot_data.work_mode = WORK_MODE_CARD_PRODUCT;//WORK_MODE_CARD_PRODUCT;

    workmode = uboot_spare_head.boot_data.work_mode;
#if 1
    printf("workmode = %d\n", workmode);
    debug("storage type = %d\n", uboot_spare_head.boot_data.storage_type);
#endif

	if(workmode == WORK_MODE_BOOT || workmode == WORK_MODE_SPRITE_RECOVERY)
	{
	    int nand_used, sdc0_used, sdc2_used, sdc_detmode=3;

		storage_type = uboot_spare_head.boot_data.storage_type;
		debug("storage type = %d\n", storage_type);
        if((storage_type == 1) || (storage_type == 2))
		{
		    if(2 == storage_type)
			{
			    nand_used = 0;
			    sdc2_used = 1;

				script_parser_patch("nand0_para", "nand0_used", &nand_used, 1);
		        script_parser_patch("nand1_para", "nand1_used", &nand_used, 1);
		        script_parser_patch("mmc2_para",  "sdc_used",   &sdc2_used, 1);
		        script_parser_patch("mmc2_para",  "sdc_detmode", &sdc_detmode, 1);
			}
			else
			{
				//nand_used  = 0;
			    sdc0_used  = 1;
			    //sdc2_used  = 0;

				//script_parser_patch("nand0_para", "nand0_used", &nand_used, 1);
		        //script_parser_patch("nand1_para", "nand1_used", &nand_used, 1);
		        script_parser_patch("mmc0_para",  "sdc_used",   &sdc0_used, 1);
		        script_parser_patch("mmc0_para",  "sdc_detmode", &sdc_detmode, 1);
		        //script_parser_patch("mmc2_para",  "sdc_used",   &sdc2_used, 1);
			}
			card_no = (storage_type == 1)?0:2;
			printf("MMC:	 %d\n", card_no);
			board_mmc_set_num(card_no);
			debug("set card number\n");
			board_mmc_pre_init(card_no);
			debug("begin to find mmc\n");
			mmc_boot = find_mmc_device(card_no);
			if(!mmc_boot){
				printf("fail to find one useful mmc card\n");
				return -1;
			}
			debug("try to init mmc\n");
			if (mmc_init(mmc_boot)) {
				puts("MMC init failed\n");
				return  -1;
			}
			debug("mmc %d init ok\n", card_no);

			sunxi_flash_read_pt  = sunxi_flash_mmc_read;
			sunxi_flash_write_pt = sunxi_flash_mmc_write;
			sunxi_flash_size_pt  = sunxi_flash_mmc_size;
			sunxi_flash_exit_pt  = sunxi_flash_mmc_exit;

			sunxi_flash_phyread_pt  = sunxi_flash_mmc_phyread;
			sunxi_flash_phywrite_pt = sunxi_flash_mmc_phywrite;
			sunxi_sprite_phyread_pt  = sunxi_flash_mmc_phyread;
			sunxi_sprite_phywrite_pt = sunxi_flash_mmc_phywrite;
		}
		else
		{
		    nand_used = 1;
			sdc2_used  = 0;
            script_parser_patch("nand0_para", "nand0_used", &nand_used, 1);
		    script_parser_patch("nand1_para", "nand1_used", &nand_used, 1);
		    script_parser_patch("mmc2_para",  "sdc_used",   &sdc2_used, 1);

		    tick_printf("NAND: ");
			if (workmode == WORK_MODE_BOOT) {
		    	if(nand_uboot_init(1))
		    	{
		    		tick_printf("nand init fail\n");
					return -1;
		    	}
			}
			else if (workmode == WORK_MODE_SPRITE_RECOVERY)
			{
		    	if(nand_uboot_init(2))	
		    	{
		    		tick_printf("nand init fail\n");
					return -1;
		    	}
				
			}
			//flash_size = nand_uboot_get_flash_size();
			//flash_size <<= 9;
			//print_size(flash_size, "\n");
			sunxi_flash_read_pt  = sunxi_flash_nand_read;
			sunxi_flash_write_pt = sunxi_flash_nand_write;
			sunxi_flash_size_pt  = sunxi_flash_nand_size;
			sunxi_flash_exit_pt  = sunxi_flash_nand_exit;
			sunxi_flash_flush_pt = sunxi_flash_nand_flush;
		}
		sunxi_sprite_read_pt  = sunxi_flash_read_pt;
		sunxi_sprite_write_pt = sunxi_flash_write_pt;

		sunxi_flash_init_uboot(0);
		script_parser_patch("target", "storage_type", &storage_type, 1);

		tick_printf("sunxi flash init ok\n");
#if defined(CONFIG_ARCH_SUN8IW1P1)
		if((storage_type == 0) || (storage_type == 2))	//如果是A31非卡0启动,则需要跳转检测卡0
		{
			sunxi_card_probe_mmc0_boot();
		}
#endif
        if((storage_type == 0) ||(storage_type == 2))
        {
            int sprite_next_work = 0;
            script_parser_fetch("card_boot","next_work",&sprite_next_work,1);
            if(sprite_next_work == SUNXI_UPDATA_NEXT_ACTION_SPRITE_TEST)
                sunxi_card_fill_boot0_magic();
        }
	}
	else if((workmode & WORK_MODE_PRODUCT) || (workmode == 0x30))		/* 量产模式 */
	{
	    if(!nand_uboot_probe())
        {
        	printf("nand found\n");
        	sunxi_sprite_init_pt  = sunxi_flash_nand_init;
            sunxi_sprite_exit_pt  = sunxi_flash_nand_exit;
            sunxi_sprite_read_pt  = sunxi_flash_nand_read;
			sunxi_sprite_write_pt = sunxi_flash_nand_write;
			sunxi_sprite_erase_pt = sunxi_flash_nand_erase;
			sunxi_sprite_size_pt  = sunxi_flash_nand_size;
			sunxi_sprite_flush_pt = sunxi_flash_nand_flush;
            sunxi_sprite_force_erase_pt = sunxi_flash_nand_force_erase;
			debug("sunxi sprite has installed nand function\n");
			uboot_spare_head.boot_data.storage_type = 0;
			if(workmode == 0x30)
			{
				if(sunxi_sprite_init(1))
			    {
			    	tick_printf("nand init fail\n");

					return -1;
			    }
			}
        }
#ifdef CONFIG_SUNXI_SPINOR
		else if(!try_spi_nor(0)) //burn nor
		{
			printf("try nor successed \n");
			sunxi_sprite_init_pt  = sunxi_flash_spinor_init;
			sunxi_sprite_exit_pt  = sunxi_flash_spinor_exit;
			sunxi_sprite_read_pt  = sunxi_flash_spinor_read;
			sunxi_sprite_write_pt = sunxi_sprite_spinor_write;
			sunxi_sprite_erase_pt = sunxi_flash_spinor_erase;
			sunxi_sprite_size_pt  = sunxi_flash_spinor_size;
			sunxi_sprite_flush_pt = sunxi_flash_spinor_flush;
			sunxi_sprite_datafinish_pt = sunxi_flash_spinor_datafinish;
			printf("sunxi sprite has installed spi function\n");
			uboot_spare_head.boot_data.storage_type = 3;
		}
#endif
        else                                   /* burn sdcard 2 */
		{
			printf("try nand fail\n");
		    board_mmc_pre_init(2);
			mmc_sprite = find_mmc_device(2);
			if(!mmc_sprite){
				printf("fail to find one useful mmc card\n");
				return -1;
			}

			if (mmc_init(mmc_sprite)) {
				puts("MMC init failed\n");
				return  -1;
			}
			sunxi_sprite_init_pt  = sunxi_sprite_mmc_init;
            sunxi_sprite_exit_pt  = sunxi_sprite_mmc_exit;
			sunxi_sprite_read_pt  = sunxi_sprite_mmc_read;
			sunxi_sprite_write_pt = sunxi_sprite_mmc_write;
			sunxi_sprite_erase_pt = sunxi_sprite_mmc_erase;
			sunxi_sprite_size_pt  = sunxi_sprite_mmc_size;
			sunxi_sprite_phyread_pt  = sunxi_sprite_mmc_phyread;
			sunxi_sprite_phywrite_pt = sunxi_sprite_mmc_phywrite;
            sunxi_sprite_force_erase_pt = sunxi_sprite_mmc_force_erase;
			debug("sunxi sprite has installed sdcard2 function\n");
			uboot_spare_head.boot_data.storage_type = 2;
	    }

		if((workmode == WORK_MODE_CARD_PRODUCT) || (workmode == 0x30))      //sdcard burn mode
		{
            board_mmc_pre_init(0);
			mmc_boot = find_mmc_device(0);
			if(!mmc_boot)
			{
				printf("fail to find one useful mmc card\n");
				return -1;
			}

			if (mmc_init(mmc_boot))
			{
				puts("MMC sprite init failed\n");
				return  -1;
			}
			else
			{
				puts("mmc init ok\n");
			}
			sunxi_flash_init_pt  = sunxi_flash_mmc_init;
			sunxi_flash_read_pt  = sunxi_flash_mmc_read;
			sunxi_flash_write_pt = sunxi_flash_mmc_write;
			sunxi_flash_size_pt  = sunxi_flash_mmc_size;
			sunxi_flash_phyread_pt  = sunxi_flash_mmc_phyread;
			sunxi_flash_phywrite_pt = sunxi_flash_mmc_phywrite;
			sunxi_flash_exit_pt  = sunxi_flash_mmc_exit;
		}
		sunxi_flash_init_uboot(0);
	}
	else if(workmode & WORK_MODE_UPDATE)		/* 升级模式 */
	{
	}
	else   /* undefined mode */
	{
	}

	return 0;
}
Пример #5
0
/*
************************************************************************************************************
*
*                                             function
*
*    name          :	modify_uboot_uart
*
*    parmeters     :
*
*    return        :
*
*    note          :	[email protected]
*
*
************************************************************************************************************
*/
int modify_uboot_uart(void)
{
    script_gpio_set_t fetch_cfg_gpio[2];
    u32  reg = 0;
    int uart_port_id = 0;
//disable uart0
    if(script_parser_fetch("uart_para","uart_debug_rx",(int *)(&fetch_cfg_gpio[0]),sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error: can't find card0_rx \n");
        return -1;
    }
	fetch_cfg_gpio[0].mul_sel = 0;
    if(script_parser_patch("uart_para","uart_debug_rx",(void*)&fetch_cfg_gpio[0],sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error : can't patch uart_debug_rx\n");
        return -1;
    }
    //config uart_tx
    if(script_parser_fetch("uart_para","uart_debug_tx",(int *)(&fetch_cfg_gpio[1]),sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error: can't find card0_tx \n");
        return -1;
    }
	fetch_cfg_gpio[1].mul_sel = 0;
    if(script_parser_patch("uart_para","uart_debug_tx",(void*)&fetch_cfg_gpio[1],sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error : can't patch uart_debug_tx\n");
        return -1;
    }
	//disable uart0
	gpio_request_simple("uart_para",NULL);
    //port_id
    if(script_parser_fetch("force_uart_para","force_uart_port",(int *)(&uart_port_id),sizeof(int)/4))
    {
        printf("debug_mode_error: can't find card0_tx \n");
        return -1;
    }
	if(script_parser_patch("uart_para","uart_debug_port",(int *)(&uart_port_id),sizeof(int)/4))
    {
        printf("debug_mode_error: can't find card0_tx \n");
        return -1;
    }
	if(script_parser_fetch("force_uart_para","force_uart_tx",(int *)(&fetch_cfg_gpio[0]),sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error: can't find card0_tx \n");
        return -1;
    }
    if(script_parser_patch("uart_para","uart_debug_tx",(void*)&fetch_cfg_gpio[0],sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error : can't patch uart_debug_tx\n");
        return -1;
    }
	if(script_parser_fetch("force_uart_para","force_uart_rx",(int *)(&fetch_cfg_gpio[1]),sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error: can't find card0_tx \n");
        return -1;
    }
    if(script_parser_patch("uart_para","uart_debug_rx",(void*)&fetch_cfg_gpio[1],sizeof(script_gpio_set_t)/4))
    {
        printf("debug_mode_error : can't patch uart_debug_tx\n");
        return -1;
    }

    printf("uart_port_id = %d\n",uart_port_id);
    uboot_spare_head.boot_data.uart_port = uart_port_id;
    //reset
#ifdef UART_RST_CTRL
	reg = readl(UART_RST_CTRL);
	reg &= ~(1 << (16 + uart_port_id));
	reg |=  (1 << (16 + uart_port_id));
        writel(reg,UART_RST_CTRL);
#endif
    //gate
	reg = readl(UART_GATE_CTRL);
    reg &= ~(1 << (16 + uart_port_id));
	reg |=  (1 << (16 + uart_port_id));
    writel(reg,UART_GATE_CTRL);
	//enable card0
	gpio_request_simple("uart_para",NULL);
    serial_init();
	return 0;
}
Пример #6
0
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :
*
*
************************************************************************************************************
*/
int dram_init(void)
{
    uint *addr;

    //gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);

    //memcpy((void *)BOOT_STANDBY_DRAM_PARA_ADDR, uboot_spare_head.boot_data.dram_para, 32 * 4);  //add by jerry
    addr = (uint *)uboot_spare_head.boot_data.dram_para;
#if defined CONFIG_FPGA
    gd->ram_size = 512 * 1024 *1024 ;
#else
    if(addr[4])
    {
        gd->ram_size = (addr[4] & 0xffff) * 1024 * 1024;
    }
    else
    {
        gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
    }
#endif
    puts("dram_para_set start\n");
    script_parser_patch("dram_para", "dram_clk", &addr[0], 1);
    script_parser_patch("dram_para", "dram_type", &addr[1], 1);
    script_parser_patch("dram_para", "dram_zq", &addr[2], 1);
    script_parser_patch("dram_para", "dram_odt_en", &addr[3], 1);

    script_parser_patch("dram_para", "dram_para1", &addr[4], 1);
    script_parser_patch("dram_para", "dram_para2", &addr[5], 1);

    script_parser_patch("dram_para", "dram_mr0", &addr[6], 1);
    script_parser_patch("dram_para", "dram_mr1", &addr[7], 1);
    script_parser_patch("dram_para", "dram_mr2", &addr[8], 1);
    script_parser_patch("dram_para", "dram_mr3", &addr[9], 1);

    script_parser_patch("dram_para", "dram_tpr0", &addr[10], 1);
    script_parser_patch("dram_para", "dram_tpr1", &addr[11], 1);
    script_parser_patch("dram_para", "dram_tpr2", &addr[12], 1);
    script_parser_patch("dram_para", "dram_tpr3", &addr[13], 1);
    script_parser_patch("dram_para", "dram_tpr4", &addr[14], 1);
    script_parser_patch("dram_para", "dram_tpr5", &addr[15], 1);
    script_parser_patch("dram_para", "dram_tpr6", &addr[16], 1);
    script_parser_patch("dram_para", "dram_tpr7", &addr[17], 1);
    script_parser_patch("dram_para", "dram_tpr8", &addr[18], 1);
    script_parser_patch("dram_para", "dram_tpr9", &addr[19], 1);
    script_parser_patch("dram_para", "dram_tpr10", &addr[20], 1);
    script_parser_patch("dram_para", "dram_tpr11", &addr[21], 1);
    script_parser_patch("dram_para", "dram_tpr12", &addr[22], 1);
    script_parser_patch("dram_para", "dram_tpr13", &addr[23], 1);
    puts("dram_para_set end\n");

    return 0;
}
Пример #7
0
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :
*
*
************************************************************************************************************
*/
int dram_init(void)
{
	uint *addr;

	//gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);

	memcpy((void *)BOOT_STANDBY_DRAM_PARA_ADDR, uboot_spare_head.boot_data.dram_para, 32 * 4);  //add by jerry
	addr = (uint *)uboot_spare_head.boot_data.dram_para;
	if(addr[10])
	{
		gd->ram_size = (addr[10] & 0xffff) * 1024 * 1024;
	}
	 else
	{
		gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
	}
	puts("dram_para_set start\n");
	script_parser_patch("dram_para", "dram_baseaddr", &addr[0], 1);
	script_parser_patch("dram_para", "dram_clk", &addr[1], 1);
	script_parser_patch("dram_para", "dram_type", &addr[2], 1);
	script_parser_patch("dram_para", "dram_rank_num", &addr[3], 1);

	script_parser_patch("dram_para", "dram_chip_density", &addr[4], 1);
	script_parser_patch("dram_para", "dram_io_width", &addr[5], 1);

	script_parser_patch("dram_para", "dram_bus_width", &addr[6], 1);
	script_parser_patch("dram_para", "dram_cas", &addr[7], 1);
	script_parser_patch("dram_para", "dram_zq", &addr[8], 1);
	script_parser_patch("dram_para", "dram_odt_en", &addr[9], 1);

	script_parser_patch("dram_para", "dram_size", &addr[10], 1);
	script_parser_patch("dram_para", "dram_tpr0", &addr[11], 1);
	script_parser_patch("dram_para", "dram_tpr1", &addr[12], 1);
	script_parser_patch("dram_para", "dram_tpr2", &addr[13], 1);
	script_parser_patch("dram_para", "dram_tpr3", &addr[14], 1);
	script_parser_patch("dram_para", "dram_tpr4", &addr[15], 1);
	script_parser_patch("dram_para", "dram_tpr5", &addr[16], 1);
	script_parser_patch("dram_para", "dram_emr1", &addr[17], 1);
	script_parser_patch("dram_para", "dram_emr2", &addr[18], 1);
	script_parser_patch("dram_para", "dram_emr3", &addr[19], 1);
	puts("dram_para_set end\n");

	return 0;
}
Пример #8
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*				int set_vol: not using
*				  int onoff: not using	
*    返回值  :
*
*    说明    :根据sys_config.fex 配置进行设置电压, 先设置电压,在使能或者关闭
*
*
************************************************************************************************************
*/
int power_oz_set_dcdc(int set_vol, int onoff)
{
	int ret;
	u32 oz_power_hd;
	user_gpio_set_t oz_gpio_cfg[1];

	//配置输出电压
	if(set_vol > 0)
	{
		ret = power_oz_patch_gpio(set_vol);
		if(ret)
		{
			printf("oz power patch config failed\n");
			return -1;
		}

		oz_power_hd = gpio_request_simple("external_power", "a15_vset1");
		if(oz_power_hd)
		{
			printf("set gpio failed\n");
			return -3;
		}

		oz_power_hd = gpio_request_simple("external_power", "a15_vset2");
		if(oz_power_hd)
		{
			printf("set gpio failed\n");
			return -3;
		}

		oz_power_hd = gpio_request_simple("external_power", "a15_vset3");
		if(oz_power_hd)
		{
			printf("set gpio failed\n");
			return -3;
		}
	}

	if(onoff < 0)
	{
		return 0;
	}

	memset(oz_gpio_cfg, 0, sizeof(oz_gpio_cfg));
	ret = script_parser_fetch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int));
	if(ret)
	{
		printf("get a15_pwr_en cfg failed\n");
		return -1;
	}

	if(onoff == 0)
	{
		oz_gpio_cfg[0].data = 0;
	}
	else
	{
		oz_gpio_cfg[0].data = 1;
	}

	//配置使能gpio
	ret = script_parser_patch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int));
	if(ret)
	{
		printf("patch a15_pwr_en config failed\n");
		return -2;
	}

	oz_power_hd = gpio_request_simple("external_power", "a15_pwr_en");
	if(oz_power_hd)
	{
		printf("set gpio failed\n");
		return -3;
	}
	return 0;
}
Пример #9
0
void board_init_r(gd_t *id, ulong dest_addr)
{
	char *s;
	bd_t *bd;
	ulong malloc_start;
#if !defined(CONFIG_SYS_NO_FLASH)
	ulong flash_size;
#endif

	gd = id;
	bd = gd->bd;

	gd->flags |= GD_FLG_RELOC;	/* tell others: relocation done */

	monitor_flash_len = _end_ofs;

	/* Enable caches */
	enable_caches();

//	debug("monitor flash len: %08lX\n", monitor_flash_len);
#ifdef CONFIG_ALLWINNER
#ifdef DEBUG
//	printf("sunxi script init\n");
#endif
	sw_gpio_init();
	if(script_parser_fetch("target", "storage_type", &storage_type, sizeof(int)))
		storage_type = 0;
	if((storage_type <= 0) || (storage_type > 2))
	{
		int used;

		used = 1;
		script_parser_patch("nand_para", "nand_used", &used, 1);
		used = 0;
		script_parser_patch("mmc2_para", "sdc_used", &used, 1);
		storage_type = 0;
	}
	else if(1 == storage_type)
	{
		mmc_card_no = 0;
	}
	else
	{
		int used;

		used = 0;
		script_parser_patch("nand_para", "nand_used", &used, 1);
		used = 1;
		script_parser_patch("mmc2_para", "sdc_used", &used, 1);

		mmc_card_no = 2;
	}
#ifdef DEBUG
	{
		int used;

		printf("test storage_type=%d, mmc_card_no=%d\n", storage_type, mmc_card_no);
		if(!script_parser_fetch("nand_para", "nand_used", &used, sizeof(int)))
		{
			printf("nand_para nand_used = %d\n", used);
		}
		if(!script_parser_fetch("mmc2_para", "sdc_used", &used, sizeof(int)))
		{
			printf("mmc2_para sdc_used = %d\n", used);
		}
		printf("test over\n");
	}
#endif	
	if(script_parser_fetch("uart_para", "uart_debug_port", &uart_console, sizeof(int)))
		uart_console = 0;
#endif
	board_init();	/* Setup chipselects */

#ifdef CONFIG_SERIAL_MULTI
	serial_initialize();
#endif

	debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);

#ifdef CONFIG_LOGBUFFER
	logbuff_init_ptrs();
#endif
#ifdef CONFIG_POST
	post_output_backlog();
#endif

	/* The Malloc area is immediately below the monitor copy in DRAM */
	malloc_start = dest_addr - TOTAL_MALLOC_LEN;
	mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);

#if !defined(CONFIG_SYS_NO_FLASH)
	puts("Flash: ");

	flash_size = flash_init();
	if (flash_size > 0) {
# ifdef CONFIG_SYS_FLASH_CHECKSUM
		print_size(flash_size, "");
		/*
		 * Compute and print flash CRC if flashchecksum is set to 'y'
		 *
		 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
		 */
		s = getenv("flashchecksum");
		if (s && (*s == 'y')) {
			printf("  CRC: %08X", crc32(0,
				(const unsigned char *) CONFIG_SYS_FLASH_BASE,
				flash_size));
		}
		putc('\n');
# else	/* !CONFIG_SYS_FLASH_CHECKSUM */
		print_size(flash_size, "\n");
# endif /* CONFIG_SYS_FLASH_CHECKSUM */
	} else {
		puts(failed);
		hang();
	}
#endif

#ifdef CONFIG_ALLWINNER
	if(!storage_type){
		puts("NAND:  ");
		nand_init();		/* go init the NAND */
	}
	else{
		puts("MMC:   ");
        mmc_initialize(bd);
	}
	sunxi_flash_handle_init();
	sunxi_partition_init();
#else
#if defined(CONFIG_CMD_NAND)
	if(!storage_type){
		puts("NAND:  ");
		nand_init();        /* go init the NAND */
	}
#endif/*CONFIG_CMD_NAND*/


#if defined(CONFIG_GENERIC_MMC)
	if(storage_type){
		puts("MMC:   ");
		mmc_initialize(bd);
	}
#endif/*CONFIG_GENERIC_MMC*/
#endif/*CONFIG_ALLWINNER*/


#if defined(CONFIG_CMD_ONENAND)
	onenand_init();
#endif

#ifdef CONFIG_HAS_DATAFLASH
	AT91F_DataflashInit();
	dataflash_print_info();
#endif

	/* initialize environment */
	env_relocate();

#if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI)
	arm_pci_init();
#endif

	/* IP Address */
	gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");

	stdio_init();	/* get the devices list going. */

	jumptable_init();

#if defined(CONFIG_API)
	/* Initialize API */
	api_init();
#endif

	console_init_r();	/* fully init console as a device */

#if defined(CONFIG_ARCH_MISC_INIT)
	/* miscellaneous arch dependent initialisations */
	arch_misc_init();
#endif
#if defined(CONFIG_MISC_INIT_R)
	/* miscellaneous platform dependent initialisations */
	misc_init_r();
#endif

	 /* set up exceptions */
	interrupt_init();
	/* enable exceptions */
	enable_interrupts();

	/* Perform network card initialisation if necessary */
#if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96)
	/* XXX: this needs to be moved to board init */
	if (getenv("ethaddr")) {
		uchar enetaddr[6];
		eth_getenv_enetaddr("ethaddr", enetaddr);
		smc_set_mac_addr(enetaddr);
	}
#endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */

	/* Initialize from environment */
	s = getenv("loadaddr");
	if (s != NULL)
		load_addr = simple_strtoul(s, NULL, 16);
#if defined(CONFIG_CMD_NET)
	s = getenv("bootfile");
	if (s != NULL)
		copy_filename(BootFile, s, sizeof(BootFile));
#endif

#ifdef BOARD_LATE_INIT
	board_late_init();
#endif

#ifdef CONFIG_BITBANGMII
	bb_miiphy_init();
#endif
#if defined(CONFIG_CMD_NET)
#if defined(CONFIG_NET_MULTI)
	puts("Net:   ");
#endif
	eth_initialize(gd->bd);
#if defined(CONFIG_RESET_PHY_R)
	debug("Reset Ethernet PHY\n");
	reset_phy();
#endif
#endif

#ifdef CONFIG_POST
	post_run(NULL, POST_RAM | post_bootmode_get(0));
#endif

#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
	/*
	 * Export available size of memory for Linux,
	 * taking into account the protected RAM at top of memory
	 */
	{
		ulong pram;
		uchar memsz[32];
#ifdef CONFIG_PRAM
		char *s;

		s = getenv("pram");
		if (s != NULL)
			pram = simple_strtoul(s, NULL, 10);
		else
			pram = CONFIG_PRAM;
#else
		pram = 0;
#endif
#ifdef CONFIG_LOGBUFFER
#ifndef CONFIG_ALT_LB_ADDR
		/* Also take the logbuffer into account (pram is in kB) */
		pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024;
#endif
#endif
		sprintf((char *)memsz, "%ldk", (gd->ram_size / 1024) - pram);
		setenv("mem", (char *)memsz);
	}
#endif

	/* main_loop() can return to retry autoboot, if so just run it again. */
	for (;;) {
		main_loop();
	}

	/* NOTREACHED - no way out of command loop except booting */
}