嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. V' A! v- M9 P+ }% g9 b
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 G% f* J* H) ?4 C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% K! ]! g7 W& n9 y+ o, v1 q( Q
5 |/ {! a5 l' O3 k9 w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# Z1 K& p0 Z2 ~- ?, N
3 u* Y4 R) e0 T1 z" \1 u9 ^& l5 z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 B' D" z; D/ | Z( ]
/*
" D; d# |7 b* A4 K( h! A4 O
* Check memory range for valid RAM. A simple memory test determines
9 u2 W' g) T% k8 T
* the actually available RAM size between addresses `base' and
' j+ y5 @9 X d* f4 H$ S
* `base + maxsize'.
% a( e$ N" E9 L9 k) u6 s
*/
7 u6 r; L! _9 {+ k( S! `
long get_ram_size(long *base, long maxsize)
0 ~: p& J4 ?! T* P/ N+ R0 t
{
$ I! d+ B) d! T3 v3 D! U, R1 I7 u
volatile long *addr;
- A, e8 ^# W9 q6 c# V& ~. i
long save[32];
3 g# m5 Q( M4 s2 k/ A: F
long cnt;
- @1 ^' W' O- n3 L3 l! O
long val;
; X, K! H1 m8 o8 y! h- _ v! u$ ~
long size;
3 {/ h, a! K8 h% U3 o
int i = 0;
* u- B; u) ^1 r
! _7 R7 v, s1 k) \5 g- E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 E+ I% J6 i; E) P+ b
addr = base + cnt; /* pointer arith! */
/ Z, }$ G* b& x) D
sync ();
& @$ a1 J- Y' b
save[i++] = *addr;
+ ~! W7 K/ X3 e8 `) \* s( Z
sync ();
: k5 B8 X( j/ ~% f M6 M3 l
*addr = ~cnt;
1 o( o1 `2 u8 z
}
4 s7 x& F# B0 _" T$ S7 o/ v: B
2 y1 Q4 ]. P: `$ J9 Q
addr = base;
7 o7 c2 q+ y$ \% B- H+ i- O
sync ();
$ ]7 W% m3 E, j* L1 k
save
= *addr;
4 V: ~8 _) [ O5 L/ I
sync ();
1 U' Z \7 x: y9 Z) O+ w
*addr = 0;
( r$ S2 i. d; D+ o+ r7 j
3 V% `" l0 A/ W3 U5 K3 y* b1 ~
sync ();
1 @/ _& @+ X- |7 `% z4 X
if ((val = *addr) != 0) {
& e" u t& M+ O( Z. r0 ?6 i3 P
/* Restore the original data before leaving the function.
- E! D/ Q" G0 N" q0 }
*/
! P& x- c- Z9 I* K& q
sync ();
! Y/ d7 j! J. f3 h
*addr = save
;
4 Y5 I3 Z# y: z) p% `/ a- ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( [! B8 V6 y, M, J* }% E0 G3 c
addr = base + cnt;
6 S8 a* c% U1 I9 e, N& o# k, Y
sync ();
8 g2 T/ _) t) W) w4 B
*addr = save[--i];
9 s# i: O7 l% M( v
}
: Z5 D" n& D8 L ?( x
return (0);
: k2 D( b+ Q$ W8 e
}
! b4 T* f2 N# y) D& N7 P) G4 n. m
& b. m8 k" a$ Z% o* Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 X: z" M) W8 P& y# H6 V* B I0 E
addr = base + cnt; /* pointer arith! */
; ]% b! v. s$ v4 ?
val = *addr;
, j1 E% ~; M- G( A: J9 q
*addr = save[--i];
4 {1 n. \" {) \1 x1 H" b
if (val != ~cnt) {
) n: ?; }% F9 R1 @* W3 [
size = cnt * sizeof (long);
. d( h( `0 o% r& N6 |
/* Restore the original data before leaving the function.
1 A- h4 T, }4 N+ t& R8 m$ s ^
*/
1 ]5 x. _( M9 ?! g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% e; B9 y0 d8 v- ~* R) q
addr = base + cnt;
c; X0 [( G$ |) \! _
*addr = save[--i];
; U# k0 L3 `# M( w1 r
}
4 ~* z q% A, c" M3 v2 b6 S
return (size);
$ l0 a5 N D" S) y9 @. \8 B3 z& f' q* a6 p
}
' k4 A+ ]/ `6 G' C# D. |
}
8 k3 R% A& f N( ~
% ?6 x. w3 M4 E3 E4 A- m
return (maxsize);
2 O1 g! \5 N* O$ w) i
}
0 ~3 S6 f% G# X+ f6 V6 [0 A
int dram_init(void)
" F, i5 }5 b+ S9 U
{
& i0 x+ p4 u1 f! `5 I, ^
/* dram_init must store complete ramsize in gd->ram_size */
( C! }5 Z* W* n# _
gd->ram_size = get_ram_size(
6 G; o i0 A8 X7 x; _7 R0 ?
(void *)CONFIG_SYS_SDRAM_BASE,
7 `% o' A* h" W4 j$ X8 G
CONFIG_MAX_RAM_BANK_SIZE);
' z& d5 h9 \% B0 m( F1 h
return 0;
{- `( n4 ~. ?
}
- ?& q2 u, U4 O- x3 p- }
* J4 m. J( Q2 {* _& X3 M
5 l9 Q! ^' J' G! c; j+ Z
4 e) ]+ o H6 Z% [
$ {! Z8 M6 @5 t; c9 r8 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) q' v/ M8 ?* c5 l
3 s E+ P4 P1 ^% s$ C
6 {* {) o; L. A7 S9 h& |
$ h4 J) W3 t7 K' b
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4