嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- h0 N# _8 D, d+ {5 J) o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 P9 w+ n ]4 ]; b# u1 s _5 ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* b/ U- j, C* I" c
7 X5 l# u+ f7 p. @3 {% A2 ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; i( J- c# h2 \- y; u$ i0 _$ g
+ t" l% F7 o1 f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, g* V( n1 C# @* J
/*
& e0 w9 [: U7 G/ W( O) ]( Z8 ~! H6 _
* Check memory range for valid RAM. A simple memory test determines
( v8 Y* n( W+ c- s H# w4 a
* the actually available RAM size between addresses `base' and
+ i6 ~2 z/ `3 Q3 T0 A0 G3 ~% e4 x
* `base + maxsize'.
5 W$ x9 x; d7 k- v8 l' i2 j
*/
1 b9 k2 j+ a( B$ z5 y0 P
long get_ram_size(long *base, long maxsize)
0 B: q+ g/ I1 {: E7 F
{
# ]# n6 q/ z1 H" e$ Q( d7 g2 G& w
volatile long *addr;
, I$ [6 O0 z' i* ]6 y- F3 M
long save[32];
5 y# q; c) w% q0 A0 V+ U- G4 }7 J
long cnt;
, w' E G" L+ q- X% _
long val;
4 Q3 z! K; X& I
long size;
, m, J& x, @) f2 E2 W
int i = 0;
/ C( O# d& f0 | B
/ P. S- m$ u6 a
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 c$ V/ P) J) F' p3 T2 [; ]
addr = base + cnt; /* pointer arith! */
/ `/ ^" u" u1 N+ ~5 L* U* k
sync ();
" M3 F1 |2 I* l$ f' R2 s7 {" s
save[i++] = *addr;
9 w/ o2 I- I ^ r. F; H
sync ();
3 A" G' l$ V3 m v
*addr = ~cnt;
, w( R, T4 }- ^. b3 O
}
2 k$ D- C7 K1 C3 v1 {& ?% }
2 {* }* j) u. f6 E
addr = base;
# H+ R% ^; Q" P( F/ ^
sync ();
: X9 H' T9 S1 M" t9 l, U
save
= *addr;
; G* R% M, x; C, K! ? q
sync ();
0 t2 N- q: u5 W3 W$ u2 v! B
*addr = 0;
; Z* K& Y) Y3 m4 ^/ h
$ K, B* W2 t% \: ]' ]6 c, z& h
sync ();
3 T7 ~$ ^% \5 N( G& c
if ((val = *addr) != 0) {
3 Q7 Z. L# g/ k* C3 l( ^ u3 ^
/* Restore the original data before leaving the function.
; R2 |, X% C! z: Y# o/ i
*/
. b+ r0 m, A. q% B( @+ u
sync ();
( u8 S; f8 @# Q$ l- n+ L
*addr = save
;
3 W8 o0 i. N* m! V' _4 ^* k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% U( ]( I/ c+ L; r( {3 O
addr = base + cnt;
3 [$ _9 }2 o, k; y; ]9 P. \+ J" w% E. F
sync ();
( n+ Y _7 {7 u' k
*addr = save[--i];
1 H8 ]1 H3 S$ u( z
}
: `( ~7 [7 U. e9 k
return (0);
) x/ I) U3 P# ^7 W4 \
}
" C8 {# M6 K: X {. ]: i
' s( s& m; i5 G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. [- \- Q% k/ N( x: f7 z J* U
addr = base + cnt; /* pointer arith! */
; Z! |( y6 q R2 Y
val = *addr;
2 |8 s6 {1 h1 P$ w
*addr = save[--i];
( ?, w4 c3 y/ W6 W& K& h
if (val != ~cnt) {
6 Z$ @9 W0 L* Y
size = cnt * sizeof (long);
4 u$ W/ Z; d" `9 r
/* Restore the original data before leaving the function.
% |8 W8 _! m/ O7 J0 O, ]
*/
/ I! m* h7 R4 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; \, H" i& Y8 T a/ \ {
addr = base + cnt;
. Z+ L9 L/ ]6 }: e% D) R
*addr = save[--i];
$ s6 ^4 y: ^& v6 y: K; ~
}
3 {% p. y" H4 L
return (size);
$ r& J8 U/ h: ~2 D0 d
}
! E% t7 M8 I5 v3 K* d
}
& }+ W G, [1 | n, q; n
/ U$ a3 N- z. O7 v' {/ o" N' l
return (maxsize);
* B" E8 J% O( Y' w% m
}
+ I, z( |) q* r9 |7 s4 q- {' s
int dram_init(void)
: n6 U% l1 v" r: ?4 u! q: A
{
! {# V5 ~9 S6 m7 b/ [
/* dram_init must store complete ramsize in gd->ram_size */
) b0 D4 U+ _/ V, j6 |+ z/ J1 p
gd->ram_size = get_ram_size(
( s, o9 ]9 ]- f* Z/ o" ~
(void *)CONFIG_SYS_SDRAM_BASE,
! u3 Z$ c F4 d5 M
CONFIG_MAX_RAM_BANK_SIZE);
^& m) h: U0 R( m- n7 c3 z
return 0;
% q0 w3 z, ^& ?! a1 I2 j
}
* y/ d$ X+ m. r+ ?* T! y! Y5 d
# I8 X) m M" a& k$ a5 |( p7 T$ e4 S
6 }+ L" m3 R8 g
8 z* {6 }, C" |. m
; n7 W9 w. Y8 _! w# a, Y' L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 A& j0 j5 m9 x. `+ e7 a
" c4 y3 v+ p& A2 B6 e& f. m3 K
5 p; }( ]/ f$ S
5 U5 e# B( Y: I# N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4