嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 q, k& Z* w4 V2 t, e
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 t7 I" u; _# t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 |3 T* k( d0 `% l
& m1 K) d$ D% X ]8 k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( @( ^( N( _0 M- v
% P( b$ V$ E& Z h9 T+ k
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" s2 i* m* v7 }4 w7 Z7 S1 P
/*
! {' y' ? Z! h2 G/ _/ B4 ~
* Check memory range for valid RAM. A simple memory test determines
# L% @) I, ]% ]' Y/ ?8 S
* the actually available RAM size between addresses `base' and
$ {9 H) C: p5 l2 r1 i$ U8 Y- i
* `base + maxsize'.
5 d7 t S) V% o
*/
* g/ c6 ^. y: r
long get_ram_size(long *base, long maxsize)
' l! n2 z. e# a8 h1 c7 i
{
- h- \; }, ]1 ^2 t V
volatile long *addr;
_1 J0 o# S6 S4 ^2 l
long save[32];
5 b" K$ v7 y! j5 @$ F8 d
long cnt;
+ }: a& y6 [! Z2 n! |% w9 s
long val;
+ w& a7 B3 @8 V: f+ V' I/ x
long size;
0 y1 g6 T+ a0 [+ C, K" S' z
int i = 0;
- D1 F/ D" k' C1 [; H; M
9 l3 w7 n/ B) l r% V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# R# k8 t; g- z. |) Y+ L+ C& K2 q
addr = base + cnt; /* pointer arith! */
& m3 N) j7 w# h& w: k- k1 Q
sync ();
! C: z5 @! n+ c9 W" g9 X$ s
save[i++] = *addr;
; O9 p8 b w3 S% ]6 N8 l- [) |
sync ();
( V6 y6 J- N: T' v' C, V
*addr = ~cnt;
3 _/ L3 V6 Q& P. C$ T$ o
}
3 Z6 D8 f9 C; h) J; f+ u
* a8 M- V" f5 U- _
addr = base;
% v1 d c9 O6 r+ _$ S5 s
sync ();
4 {8 V5 b" A: \8 p& z; j
save
= *addr;
! O/ Z1 @ q9 L4 _7 @' n Q6 R
sync ();
' ~) @6 T, l$ m' m
*addr = 0;
' y: t6 B r7 U: M' {
0 g6 O& y4 h: x% p2 N) c
sync ();
" p# c2 r8 {4 c
if ((val = *addr) != 0) {
8 \1 ?$ s6 ?/ k$ y. R; V% Z! j
/* Restore the original data before leaving the function.
* c; n/ v$ L; ?1 v3 O0 {
*/
X6 {6 p$ N& [# |4 z; z/ @! |+ y
sync ();
) ]6 x! r7 Q$ N
*addr = save
;
; G/ g! c6 x) C- x7 ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 k* a, |: ~% g* C0 }% S4 }. x
addr = base + cnt;
& H4 P. ~ c8 n' [3 B$ y) n' y; P7 [+ Q
sync ();
+ b' K& d% D8 u9 R' Q3 I+ n$ t8 f
*addr = save[--i];
% Q1 c6 N8 w- u' q
}
8 D+ {8 w. F+ Z
return (0);
' }* c Q, F9 G6 z
}
) H" X4 p1 J; d7 c8 h Y! ~
6 n6 D* `1 [; V! x+ }* P7 s) q" E. V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ R5 x% M7 |) h6 x ^
addr = base + cnt; /* pointer arith! */
- A. I# d7 \: [: ?6 p/ z
val = *addr;
: D0 r9 G0 R6 I
*addr = save[--i];
. Z6 v/ c& u6 L0 }& B) c- ~
if (val != ~cnt) {
6 v; i& e/ p$ a2 x! Q; y& I) W
size = cnt * sizeof (long);
' R6 ], l# T* I8 j t9 N
/* Restore the original data before leaving the function.
3 }6 h+ U% ?( u4 E6 m) p" f
*/
2 ~* Q6 P; _) q0 K; g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 c2 I# c: n0 v
addr = base + cnt;
; G6 b+ ?; N# m7 X/ [# a3 T
*addr = save[--i];
* H* n9 V7 |# ~# c4 i
}
# y4 Q2 j9 a2 {" b+ W
return (size);
6 v, g( N& `) n: {. M
}
0 B1 e. N8 V* @ T5 j" h' J& k+ J
}
3 Q) ]7 ^3 J- e9 A- O% k
+ [* Q6 j! J9 l9 J g) H
return (maxsize);
, h, M8 S$ _) X8 I$ c
}
, W' i- Z; t& R6 t1 q9 ~$ c* @
int dram_init(void)
6 ?- G, W6 f X
{
* l1 R5 ~0 ]8 k7 O0 z# t
/* dram_init must store complete ramsize in gd->ram_size */
" j2 F4 ^5 U3 a5 j2 ~+ G$ l( ^
gd->ram_size = get_ram_size(
1 k$ h& o' W( ~. Y4 ~
(void *)CONFIG_SYS_SDRAM_BASE,
: y* X9 ~6 z4 m9 Q, F8 l' S; n
CONFIG_MAX_RAM_BANK_SIZE);
! Y. H- M! j W+ U- T
return 0;
& P2 _; B* a0 v* M! \ M
}
% B6 [0 x, I* y/ L s' n
, O; [" ^6 K! k3 j5 l+ @4 M* `5 f% I) ~3 u
. S" m, G z" @ b( i5 E8 J. X+ k$ U
- {9 k9 ~% m9 H4 g5 C# Y8 G
z" L" V, a! T7 C1 m3 Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. I* Y$ N9 y7 Z6 n) ^8 P" Y+ Z
! c$ U0 E0 |; [% B
- ^% b! m! X7 j& h; j9 C
/ {9 W, Z% ?8 a
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4