110 }
111 else
112 {
113 /* FCLK:HCLK:PCLK = 1:4:8 */
114 clk_power->CLKDIVN = S3C2440_CLKDIV;
115
116 /* 修改为异步总线模式 */
117 __asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */
118 "orr r1, r1, #0xc0000000\n" /* Asynchronous */
119 "mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */
120 :::"r1"
121 );
122
123 /* 设置PLL锁定时间 */
124 clk_power->LOCKTIME = 0xFFFFFF;
125
126 /* 配置MPLL */
127 clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
128
129 /* 配置MPLL后,要延时一段时间再配置UPLL */
130 delay (4000);
131
132 /* 配置UPLL */
133 clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
134
135 /* 再延时一会 */
136 delay (8000);
137
138 /* 机器类型ID,这在调用Linux内核时用到,这个值要与内核相对应 */
139 gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
140 }
141
142 /* 启动内核时,参数存放位置。这个值在构造标记列表时用到 */
143 gd->bd->bi_boot_params = 0x30000100;
144
145 icache_enable();
146 dcache_enable();
147
148 return 0;
149 }
150
最后一步:获取系统时钟的函数需要针对S3C2410、S3C2440的不同进行修改。
在后面设置串口波特率时需要获得系统时钟,就是在U-Boot的第二阶
段,lib_arm/board.c中start_armboot函数调用serial_init函数初始化串口时,会调用get_PCLK函数。它在
cpu/arm920t/s3c24x0/speed.c中定义,与它相关的还有get_HCLK、get_PLLCLK等函数。
前面的board_init函数在识别出S3C2410或S3C2440后,设置了机器类型
ID:gd->bd->bi_arch_number,后面的函数可以通过它来分辨是S3C2410还是S3C2440。首先要在程序的开头
增加如下一行,这样才可以使用gd变量:
DECLARE_GLOBAL_DATA_PTR;
S3C2410和S3C2440的MPLL、UPLL计算公式不一样,所以get_PLLCLK函数也需要修改:
56 static ulong get_PLLCLK(int pllreg)
57 {
58 S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
59 ulong r, m, p, s;
60
61 if (pllreg == MPLL)
62 r = clk_power->MPLLCON;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-66092-19.html
沃日
好好笑
现在中国人咋啦