嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 a: o: h) ]% C" D) l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- h' O2 V1 C3 C2 \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 R0 f }, P4 o0 h* t* z$ a; R
" m* p& v" ]* i, F" \1 ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& b" p- `' f ]
! c" x5 t; D: A- I' \6 ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% t; s5 u. v; t5 u1 u8 v/ P
/*
# L# M3 |- ?) k; @+ S+ p4 _% {- {
* Check memory range for valid RAM. A simple memory test determines
. x7 S! S, z* ?+ U$ b
* the actually available RAM size between addresses `base' and
3 h7 b9 T* Z1 f
* `base + maxsize'.
* | z1 e7 f9 s
*/
( f$ l7 ~1 I }% R
long get_ram_size(long *base, long maxsize)
$ @1 O( d% f5 c- e$ L
{
& m+ Z( m# I2 U- y# I: m% a
volatile long *addr;
% I/ m) S- w' l: `
long save[32];
, C' o4 w& E2 M3 m t
long cnt;
: d0 R6 W' U! R* C* J; ~! L6 X, ~
long val;
2 O1 A) ^) ^, z \0 y
long size;
4 ?5 T0 U5 H/ Q: N2 x
int i = 0;
7 |9 A+ ?5 O: F3 N! r
5 {% c! a! W8 M7 L( N6 w/ R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! _( f% t2 X$ z( B# J8 ]( A
addr = base + cnt; /* pointer arith! */
/ b6 j. ?3 T; Z& w; j
sync ();
" m" I- p, a5 _! G: t+ K4 U
save[i++] = *addr;
5 u) P e9 u! K/ ^
sync ();
b* W1 H( N/ H0 c4 t
*addr = ~cnt;
/ x0 G- I+ v- r4 k
}
- {8 q2 z0 Z* j! v/ b& k3 X
1 U( `8 _0 P; U. o# I
addr = base;
, v: q( ]+ Q$ r. v3 o+ `+ U
sync ();
3 ~; X; _6 @9 E
save
= *addr;
! I/ b) M6 s1 |
sync ();
- b+ n, x, `- ]( D, v4 C
*addr = 0;
7 z V: O& [. Y0 C) K
1 k, n1 J: O& u9 V+ y% _
sync ();
# v5 h- e% H/ H
if ((val = *addr) != 0) {
4 e% V$ _% a% t3 V: `6 F* N6 V5 W
/* Restore the original data before leaving the function.
9 T- d/ M' S, x0 \' L
*/
! Z# }8 c" B$ T- k6 F* F
sync ();
# m, b- W: @/ u e4 z* ^. @
*addr = save
;
( n- p7 A% E+ Y% U! \9 d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; ? T0 V$ v e
addr = base + cnt;
`6 i. a8 ^ G* q; o1 f& {
sync ();
$ p& Q2 x& {0 A' @
*addr = save[--i];
; u4 k; |* J6 a% V
}
! t6 l4 K0 W3 W7 E/ u- T+ y) c2 a5 O
return (0);
9 \" ^7 ? N% c
}
% C% h6 X8 s1 H
. W: F0 H; _! X/ ^3 P6 Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( q+ S8 t4 W! d% U4 ]* d: h L
addr = base + cnt; /* pointer arith! */
2 j+ K" H" p% A' G5 E
val = *addr;
6 V0 g! ?5 o9 F7 Y/ W& x
*addr = save[--i];
* R5 ?; H% F1 g. x
if (val != ~cnt) {
8 b' H1 i( c+ w4 Q& N
size = cnt * sizeof (long);
2 m, {5 B+ H# K( R5 @5 r
/* Restore the original data before leaving the function.
' [- \( k! I/ \+ i& P' b
*/
% y g8 w; `6 _5 d/ n; L
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: C, O; w5 R* V9 m! t
addr = base + cnt;
- a: z q5 F2 L1 j) u p' k" E" Q
*addr = save[--i];
]8 v; E! l `$ \4 V
}
6 b- t+ V& T1 L- F! l
return (size);
% ?2 f' d# g- q- h# ?% }2 M
}
' e0 t8 i5 w. N0 s
}
E8 K8 f2 V1 [( ~/ V! n7 t
8 ^" Z( q8 }2 W8 d, O
return (maxsize);
1 q: @5 i8 z* _( j% O
}
: D( I" t4 |- p: V; G6 S
int dram_init(void)
* a$ D* d# [% \$ v6 {- k& P
{
/ c9 G, b, B; b, E0 q$ [8 M, ~
/* dram_init must store complete ramsize in gd->ram_size */
1 ^; a# X9 a5 O; y; u1 I
gd->ram_size = get_ram_size(
+ J+ Q" @5 c' W& n
(void *)CONFIG_SYS_SDRAM_BASE,
4 x6 G8 J2 l/ L# y4 M
CONFIG_MAX_RAM_BANK_SIZE);
" _; @; Z) S' D6 B: S" z
return 0;
5 d: I: F! Z0 ~+ Y) @
}
8 y6 @+ S6 j6 H# M o1 d
8 T) e0 @' ~/ e3 c0 j- @) x
$ N, t4 \: t1 B& s: J
( k. c+ k; j/ z( G4 o( Y7 \
+ t2 k- v$ x" q/ f2 o, a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( [9 a4 M8 K* @3 X
! B% b* h6 h# e3 }
! i* h5 h2 e; _$ t; }: E
% m8 t' i& S: }" M5 G' [% c/ B1 q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4