S3C6410时钟初始化
void system_clock_init(void) { int count = 1000; (*(volatile unsigned int *)S3C6410_OTHERS_ADDR) |= (1 << 6); //sys clock select in cmu while(count--); //nop (*(volatile unsigned int *)S3C6410_OTHERS_ADDR) |= ((1 << 7) | (1 << 6)); //syncmodereq to arm,0:asynchronous mode 1:synchronous mode while((((*(volatile unsigned int *)S3C6410_OTHERS_ADDR) & 0xF00) != 0xF00)); //synchronous acknowledge writel(0xffff, S3C6410_APLL_LOCK); //control pll locking period for apll writel(0xffff, S3C6410_MPLL_LOCK); //control pll locking period for mpll writel(0xffff, S3C6410_EPLL_LOCK); //control pll locking period for epll (*(volatile unsigned int *)S3C6410_CLOCK_DIV2) &= 0xFFF0FFFF; (*(volatile unsigned int *)S3C6410_CLOCK_DIV2) |= (0x3 << 16); //uart clock pider ratio,clkuart=clkuart_in/(uart_ratio+1) //0:3 p_arm clock pider ratio //4 p_mpll clock pider ratio //8 hclk clock pider ratio //9:11 hclkx2 clock pider ratio //12:15 pclk clock pider ratio,which must be odd value. in other words,s3c6410 supports only even pider ratio (*(volatile unsigned int *)S3C6410_CLOCK_DIV0) &= 0xFFFC0000; (*(volatile unsigned int *)S3C6410_CLOCK_DIV0) |= ((0x3 << 12) | (1 << 9) | (1 << 8) | (1 << 4) | 0); //0:2 sp,pll s pide value //8:13 pp,pll p pide value //16:25 pp,pll m pide value //31: pll enable control,0:disable 1:enable //f_out=mp*f_in(12MHZ)/(pp * (1 << sp)) writel(((1 << 31) | (266 << 16) | (3 << 8) | (1 << 0)), S3C6410_APLL_CON); writel(((1 << 31) | (266 << 16) | (3 << 8) | (1 << 0)), S3C6410_MPLL_CON); //0:2 sp, pll s pide value 0x3 //8:13 pp, pll p pide value 0x2 //16:23 mp, pll m pide value 0x20 //31: pll enable control,0:disable 1:enable writel(0x80200203, S3C6410_EPLL_CON0); //0:15 kp,pll k pide value //f_out=(mp+kp/2^16)*f_in/(pp*2^sp) 24MHZ writel(0, S3C6410_EPLL_CON1); //0 control mux_apll,0:fin_apll 1:fout_apll //1 control mux_mpll,0:fin_mpll 1:fout_mpll //2 control mux_epll,0:fin_epll 1:fout_epll //13 control uart0,which is the source clock of uart,0:mout_epll 1:dout_mpll (*(volatile unsigned int *)(S3C6410_CLOCK_SRC)) |= (0x2007); count = 0x10000; while(count--); //nop //(*(volatile unsigned int *)S3C6410_OTHERS_ADDR) &= 0xFFFFFFDF; }