嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* k- Q! \* f+ a; Z' j
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 c" L# } E V4 R& w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ w9 q0 Y9 _! @4 [
7 a3 e8 s) Y* z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 k2 u: _/ N0 O! _
5 ?$ K% f% J9 r4 R" ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; }4 e/ G# f% \
/*
, s. W! N, Z& e* O' n" G
* Check memory range for valid RAM. A simple memory test determines
5 e! }1 z" P. x% j8 J
* the actually available RAM size between addresses `base' and
; M6 b6 T* N. C6 i2 m9 k/ n* ~% l
* `base + maxsize'.
5 }; b P+ K, P! f `3 l: D2 ]
*/
4 Q5 {7 R2 W# v6 ]/ ~
long get_ram_size(long *base, long maxsize)
4 r) T& v+ s/ N1 {5 u$ L- d
{
) w- N" u& `7 }1 t5 P. j
volatile long *addr;
7 ^7 n5 s1 ]$ B3 W. O
long save[32];
" r& H( T+ G8 `5 v
long cnt;
+ G5 T- I8 S4 K+ V- H$ ^! m
long val;
& p9 Q2 i( Y* `9 B
long size;
7 Q; D9 U% N T, F7 l3 O) b) }
int i = 0;
' P% i7 m5 U* A3 [2 ^* C* {
3 J, E5 t$ b c, v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. _+ S8 k( {' ~; w+ e6 p! R) r
addr = base + cnt; /* pointer arith! */
A0 F7 y! D- j, P6 N# V1 h
sync ();
" R( r! y# X' \/ ~" P1 x4 `
save[i++] = *addr;
$ T/ ?: `; I4 v3 Q; ] M# g, d+ R9 @
sync ();
! v# _7 t1 b; X& u3 q
*addr = ~cnt;
. e2 u0 N0 S O0 U
}
0 u& Q9 ]$ O3 |5 H
' j" t6 f3 o: V3 G; A+ u2 d
addr = base;
1 t: K6 Q# _- U6 `7 z
sync ();
" ?9 A* m! Q7 N6 O# I
save
= *addr;
+ d2 F2 U0 E# ^
sync ();
) e( [9 f* N% n
*addr = 0;
8 A+ A3 W/ B$ p' W5 h# ^' M3 ~
! h; D% K' Q8 z/ q
sync ();
! F, l O, W. \
if ((val = *addr) != 0) {
: S6 e+ e( x1 U+ k" g
/* Restore the original data before leaving the function.
# M2 Z4 l1 m; N' j) F/ ]
*/
; u9 t# L5 F H
sync ();
n! w b' R/ C; z4 e8 l
*addr = save
;
) W9 C' L0 Y9 Z6 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: C4 a8 i2 R$ B1 H/ s- ~
addr = base + cnt;
/ |8 o2 v# t& O; i9 ]; @
sync ();
1 V& S z' K6 {: i9 Z! A
*addr = save[--i];
2 C' j: b! g; f; A) U6 j# D6 r
}
# p. H, D4 W5 M, l" j' M
return (0);
7 i: B- X- E) ^' F
}
" l8 b3 _# j2 i) L
O/ U) a u2 q% _1 D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! u# A9 e, m7 E& u: T, s$ q" y
addr = base + cnt; /* pointer arith! */
+ P; \" K4 D1 M
val = *addr;
7 h: r V, M- a7 G1 B
*addr = save[--i];
/ k9 D8 r5 ^4 Q% q5 k
if (val != ~cnt) {
9 i$ t5 Q& U* G( j% C2 H. n
size = cnt * sizeof (long);
2 S2 f* Q8 A7 \; a" y
/* Restore the original data before leaving the function.
. A4 ~" s( v% m% l$ b' U5 g9 H
*/
3 v- X" A$ d9 A* L6 N/ k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 S" S7 `/ Q G+ e( \' J) h2 x
addr = base + cnt;
2 n) a, D: |2 K0 E" r" J# j
*addr = save[--i];
6 }$ R' G% O+ g) T/ {/ h9 j, K
}
( z5 c8 |1 h. v: ^; S
return (size);
E1 w9 i. _' S( Q) b+ n- J
}
8 W" N C7 c: x' V% `) o
}
3 B4 `% ^. t* G- D
j1 d$ G* s! F0 K
return (maxsize);
" I, s' `) N+ ~ q. c
}
7 O! ^! n; i$ Q
int dram_init(void)
3 l: W9 \0 N- c9 G
{
* t5 w( S1 V3 y# f3 E
/* dram_init must store complete ramsize in gd->ram_size */
. o6 O9 q: [3 S7 D" \9 L' f( C
gd->ram_size = get_ram_size(
0 g& O5 `0 P6 E/ s0 G: k
(void *)CONFIG_SYS_SDRAM_BASE,
& B; _- g: P& j. I
CONFIG_MAX_RAM_BANK_SIZE);
* P6 s! f9 l7 k+ p# ~
return 0;
' d' L/ [6 J" e( e* ?$ @
}
2 A, e3 T* C1 m( B1 E6 _% n$ f
$ F6 j/ M! ^" B) M h+ F4 o
3 r# T9 Z1 c2 V# B6 ~2 G
5 |0 m5 \+ U. K" U, K1 N( c$ {, u* ^
@# z. h+ l& Y* j) ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 D/ Z$ j( r0 J# p. q
8 V5 O) J% U7 {
! j! T+ ]: l# p1 Z- F: S: F
$ G% }$ W/ |) c
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4