init.c

来自「Centrality Atlas II development software」· C语言 代码 · 共 204 行

C
204
字号
/* * $QNXLicenseC:  * Copyright 2007,2008, QNX Software Systems.   *   * Licensed under the Apache License, Version 2.0 (the "License"). You   * may not reproduce, modify or distribute this software except in   * compliance with the License. You may obtain a copy of the License   * at: http://www.apache.org/licenses/LICENSE-2.0   *   * Unless required by applicable law or agreed to in writing, software   * distributed under the License is distributed on an "AS IS" basis,   * WITHOUT WARRANTIES OF ANY KIND, either express or implied.  *  * This file may contain contributions from others, either as   * contributors under the License or as licensors under other terms.    * Please review this entire file for other proprietary rights or license   * notices, as well as the QNX Development Suite License Guide at   * http://licensing.qnx.com/license-guide/ for other information.  * $  */#include <hw/inout.h>#include "atlasii.h"#include "ipl.h"#include "nand.h"typedef void (*PFNLOCKCACHE)(unsigned dwAddr, unsigned dwSize, unsigned dwFlag);unsigned	pfnLockCache;#define CFG_SIGNATURE	0x86745312extern void LockCache(unsigned addr, unsigned dwNumWay, unsigned flags);extern void FlushICache(void);extern void Show_LED(int led, int val);extern void XipClkSwitch (unsigned dwPllCfg, unsigned dwClkRat);void SDRPllSwitch(unsigned dwPllCfg, unsigned dwClkRat){	volatile int i;	//switch to xtal	PWR_CLK_SWITCH=0x0;	for(i=1;i<=100;i++);	PWR_PLL1_CONFIG = dwPllCfg;	PWR_CLK_RATIO = dwClkRat;	for(i=1;i<=0x1000;i++);	//switch to pll1	PWR_CLK_SWITCH=0x01;	for(i=1;i<=0x100;i++);}void PLL_SWITCH(unsigned dwPllCfg, unsigned dwClkRat){	if ( ((dwClkRat >> 12) & 0xf) == ((dwClkRat >> 8) & 0xf) )	{		IOBG_ARB_CLKRATIO = 0x00; 		RISCINT_WIDTH = 0x00; 	}	else	{ 		IOBG_ARB_CLKRATIO = 0x01; 		RISCINT_WIDTH = 0x10; 	} 		pfnLockCache = (unsigned ) LockCache;	pfnLockCache |= 0xC0000000;	FlushICache();	((PFNLOCKCACHE)pfnLockCache)(((unsigned)SDRPllSwitch & ~0x1f), 1, 1);	SDRPllSwitch (dwPllCfg, dwClkRat); 	((PFNLOCKCACHE)pfnLockCache)(0, 0, 1);}int StartXipPllSwitch(unsigned dwClkSet){	unsigned dwPllCfg, dwClkRatio;	int i;	switch (dwClkSet)	{		case SDR_276_184_92_46_CLOCK:   dwPllCfg = PLL1_552M; dwClkRatio=0xfffc632; break;		case SDR_264_176_88_44_CLOCK:   dwPllCfg = PLL1_528M; dwClkRatio=0xfffc632; break;		case SDR_252_168_84_42_CLOCK:   dwPllCfg = PLL1_504M; dwClkRatio=0xfffc632; break;		case SDR_240_160_80_40_CLOCK:   dwPllCfg = PLL1_480M; dwClkRatio=0xfffc632; break;		case SDR_228_152_76_38_CLOCK:   dwPllCfg = PLL1_456M; dwClkRatio=0xfffc632; break;		case SDR_216_144_72_36_CLOCK:   dwPllCfg = PLL1_432M; dwClkRatio=0xfffc632; break;		case SDR_276_184_92_92_CLOCK:   dwPllCfg = PLL1_552M; dwClkRatio=0xfff6632; break;		case SDR_264_176_88_88_CLOCK:   dwPllCfg = PLL1_528M; dwClkRatio=0xfff6632; break;		case SDR_252_168_84_84_CLOCK:   dwPllCfg = PLL1_504M; dwClkRatio=0xfff6632; break;		case SDR_240_160_80_80_CLOCK:   dwPllCfg = PLL1_480M; dwClkRatio=0xfff6632; break;		case SDR_228_152_76_76_CLOCK:   dwPllCfg = PLL1_456M; dwClkRatio=0xfff6632; break;		case SDR_216_144_72_72_CLOCK:   dwPllCfg = PLL1_432M; dwClkRatio=0xfff6632; break;		default:									return -1;			break;	}	if(PWR_PLL1_CONFIG==dwPllCfg && ((PWR_CLK_RATIO & (dwClkRatio & 0xFFFF)) ==(dwClkRatio & 0xFFFF)))		return -1;#if 0		RESET_DECLARE(RESET_SR_SM_RST);	RESET_CLEAR(RESET_SR_SM_RST);#endif	//debug flush	while (!(UART_TXFIFO_STATUS & UART_TXFIFO_EMPTY)) ;	 for (i = 0; i < 0x3000; ++i) {}	(*(volatile unsigned int *)(_SMDF_MODULE_BASE+ 0x04)) 	= 0x1878; //SM_WAIT	(*(volatile unsigned int *)(_SMDF_MODULE_BASE+ 0x28))   	|= 1;   // set to direct read mode	(*(volatile unsigned int *)(_SMDF_MODULE_BASE+ 0xF00))  	= 3;    // set to IO read status	(*(volatile unsigned int *)(_SMDF_MODULE_BASE+ 0xF04))     	= 0;	(*(volatile unsigned int *)(_SMDF_MODULE_BASE+ 0xF10))   	= 1;    // must start FIFO	PLL_SWITCH (dwPllCfg, dwClkRatio);	return 0;} int CheckClkCfg(){	unsigned char dwClkSet;	unsigned char buf[PAGESIZE];	if(nand_init()<0)		return -1;	nand_read_config((unsigned)buf);	if(*(unsigned *)(buf)==CFG_SIGNATURE)	{		dwClkSet=buf[4];		if(dwClkSet>=FIRST_CLOCK_SETTING && dwClkSet<=LAST_CLOCK_SETTING)		{			return (StartXipPllSwitch(dwClkSet));		}	}	return -1;	}void board_init(void){	int i=0;	/*	 * Set pin mux	 */       Show_LED(0, 5);       	ENABLE_CAMSM_PADH(); //make sure NAND take the pin	ENABLE_CAMSM_PADL(); //make sure NAND take the pin	PWR_CLK_EN |= PWRCLK_DMA_EN | PWRCLK_SM_EN | PWRCLK_IO_EN ;	INT_RISC_MASK = 0;	*(volatile unsigned char *)(EXT_PIO_BASE+0x1600) = 0x10; //SYS CTRL	*(volatile unsigned char *)(EXT_PIO_BASE+0x1800) = 0x1; //RST CTRL	*(volatile unsigned char *)(EXT_PIO_BASE+0x4400) = 0x22; //Enable USP0 P7	*(volatile unsigned char *)(EXT_PIO_BASE+0x5000) = 0x0; //EPIO_PWR_CTRL	// must keep the 0x02 (camera/nand)bit set t0 1, otherwise nand won't work.	*(volatile unsigned char *)(EXT_PIO_BASE+0x5200) = 0x2; //EPIO_CAM_CTRL	for(i = 0; i < 100; i++);	//reset RTL8019	// NBOOT code must reset net chip here, for when booting whole image from nand,	// this mac chip will not work if it is not reset.	*(volatile unsigned char *)(EXT_PIO_BASE+0x1800)  = 0x1;	for(i = 0; i < 100; i++);	*(volatile unsigned char *)(EXT_PIO_BASE+0x1800)  = 0x0;	for(i = 0; i < 3000; i++);}int SelectClock(){	unsigned char dwClkSet;	unsigned char buf[PAGESIZE];	//bring out the menu:	while(1){		ser_putstr ((unsigned char *)"\n\t MEM_CPU_DSP_SYS_IO\n");		ser_putstr((unsigned char *)"\ra) SDR_276_184_92_46\n");		ser_putstr((unsigned char *)"\rb) SDR_264_176_88_44\n");		ser_putstr((unsigned char *)"\rc) SDR_252_168_84_42\n");		ser_putstr((unsigned char *)"\rd) SDR_240_160_80_40\n");		ser_putstr((unsigned char *)"\re) SDR_228_152_76_38\n");		ser_putstr((unsigned char *)"\rf) SDR_216_144_72_36\n");		ser_putstr((unsigned char *)"\rg) SDR_276_184_92_92\n");		ser_putstr((unsigned char *)"\rh) SDR_264_176_88_88\n");		ser_putstr((unsigned char *)"\ri) SDR_252_168_84_84\n");		ser_putstr((unsigned char *)"\rj) SDR_240_160_80_80\n");		ser_putstr((unsigned char *)"\rk) SDR_228_152_76_76\n");		ser_putstr((unsigned char *)"\rl) SDR_216_144_72_72\n");		ser_putstr((unsigned char *)"\r1) return: \n");		dwClkSet=ser_getchar();		if(dwClkSet>=FIRST_CLOCK_SETTING && dwClkSet<=LAST_CLOCK_SETTING)			break;		if(dwClkSet=='1')			return -1;	} 	if(nand_init()<0)		return -1;	nand_read_config((unsigned)buf);	if(*(unsigned *)(buf)==CFG_SIGNATURE && dwClkSet==buf[4])	{		return -1;	}	//construct the buffer	*(unsigned *)(buf)=CFG_SIGNATURE;	buf[4]=dwClkSet;	nand_write_config((unsigned)buf);		return (StartXipPllSwitch(dwClkSet));}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?