嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 f, i8 v. p' X( `2 ` u/ Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 v5 m5 I3 F) w. E" n# h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 l; {' p+ E( w A) M
- q3 Y' Q, k% k1 l) ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ?4 C4 P0 V& m* j* n
8 \3 _& B% j/ ]1 d
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 e9 t+ o8 X, \8 I, U/ {) l* o, H0 J
/*
' s$ y8 m, f$ G
* Check memory range for valid RAM. A simple memory test determines
9 S, O2 e! f3 D7 E; G
* the actually available RAM size between addresses `base' and
_; {$ L) F) L5 h! ~
* `base + maxsize'.
8 ^1 g* w5 q+ h1 L" h; K
*/
/ ]1 c" k% [$ x) ~: {8 e4 n1 k5 D
long get_ram_size(long *base, long maxsize)
& u5 u: A1 w# u5 A0 F1 s
{
2 z. G- I/ U p3 B) o
volatile long *addr;
+ A. F9 U% c U ^- R
long save[32];
2 T- G i' n+ l. B# S, a9 M
long cnt;
0 Y6 | L/ \, \! e' E* e1 U/ \
long val;
- H& j1 Z* m7 Z3 y* h+ b: O2 G7 B
long size;
n' m% D) a2 _6 U9 L! a
int i = 0;
+ m# c! d' G( |. P6 u- ~* z2 E' R
( m# C5 N# `3 n6 D( k7 n% \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: f& d: n! `% |
addr = base + cnt; /* pointer arith! */
# F. j. O! H$ l) C' B7 y
sync ();
3 r' L D+ d* `; j
save[i++] = *addr;
5 b- c5 j/ t5 j# _' h$ g
sync ();
3 \; p" n. C9 _; i7 \0 u
*addr = ~cnt;
" l% j$ U% O! q1 V8 \" e
}
: C U9 N) F9 O7 m
; S0 D: }3 R u8 S# a
addr = base;
! v, y; |# N, l
sync ();
) D8 s# `2 a' g0 K# A6 n
save
= *addr;
$ L4 i2 y5 e& M3 t0 H
sync ();
: v+ b. N. p g: \ T# z2 p! k4 @
*addr = 0;
4 @4 q' l4 \7 ]! O8 x/ h' K
5 x* e$ W9 Q( g) v+ G) a$ c
sync ();
) l; L2 n/ X0 w' \1 i/ Y
if ((val = *addr) != 0) {
/ ?4 {5 X5 e# s5 m6 Y
/* Restore the original data before leaving the function.
: Z) r/ ~# }/ B
*/
) p0 x3 m- q, ^3 |1 D, M; ~/ v
sync ();
9 O, ^) ?8 v% e9 \8 u
*addr = save
;
* ?, e- s: ]; _2 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& \0 s7 s% O5 [' N' E t2 z/ m
addr = base + cnt;
7 i8 L8 C& k0 `4 U: a
sync ();
0 ~. g! X2 M) z/ w/ Y6 W
*addr = save[--i];
+ t- x4 O# {1 d( {
}
: B. {0 H/ ~) r' d, \3 L
return (0);
' i% S1 l3 Q ~2 e; H3 r
}
* G3 u" u* J. }. G' I: R0 B+ b9 r
- P; s: J" D+ b k" @& S; d4 r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' L( y5 E" |! f9 G* T
addr = base + cnt; /* pointer arith! */
& k( w N B( ~4 M3 c( u& t6 q
val = *addr;
3 H% u7 P+ N, P4 {5 E. s5 p
*addr = save[--i];
3 y; ^& H! \, u& c1 p5 b
if (val != ~cnt) {
5 k4 @' N; ~$ \+ c$ X! m7 m! j% I* U% C
size = cnt * sizeof (long);
3 U0 m; K5 I; y0 ^1 F P5 _
/* Restore the original data before leaving the function.
8 l, L. {' }! f7 B
*/
, O& f4 }2 {9 a; E8 [, T8 u6 ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 F' f% M- g* E, y" k, ^" X' z
addr = base + cnt;
: F$ j, `! A" F( |
*addr = save[--i];
5 _% l2 \* F( t, k! i: P
}
, P2 u$ B2 Q' {3 o/ P
return (size);
4 j8 ?4 M" p" r6 \9 N
}
' l( N% m/ J; [8 G+ v5 m
}
/ {0 u$ B: q9 H, p4 X* t! R- j
. \* D8 ~, h$ z0 y( x; K) H% R# W
return (maxsize);
0 C/ M3 L. {9 C) ~6 \
}
) C3 M, E1 v" j1 C' d& F" A/ i
int dram_init(void)
; J: n9 `$ Y) B, c8 Y
{
2 J" y/ a k J
/* dram_init must store complete ramsize in gd->ram_size */
5 T/ Y9 t5 c9 v2 C# P/ X p
gd->ram_size = get_ram_size(
+ c& \. `" h8 U! f b% e8 Z
(void *)CONFIG_SYS_SDRAM_BASE,
. c/ \ d- v5 i4 [6 \; j
CONFIG_MAX_RAM_BANK_SIZE);
; W4 m& W# ^: q( ]% `
return 0;
" [3 X, |3 P) M
}
- {- R. `) _0 ?( O
% |( n# e* g* g5 u$ W
& g' Q& B$ \# U* K7 Q# f
- L Y( y+ \0 y+ X
h. F0 t0 s* D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 W& T p& a$ U- d; Z
5 y2 R8 F5 k% B& e* m8 S5 w
2 G: [! n2 Y, E; b6 q- Y$ n% w
( M) p& X: V% L& J) @9 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4