嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 z5 [" ^$ J, |4 n W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# g8 I# W5 ^. `( @2 e9 D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 J* z" H& M+ B2 |% p) l
) A, K% L8 |9 o% A& ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% T( m! h: W. V1 v6 j
# \8 A! C0 s" G9 x, d; g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ R0 B& n) n" _- k0 S
/*
0 u$ ~' W! s; j4 l
* Check memory range for valid RAM. A simple memory test determines
4 p0 K) x0 O- j- ~
* the actually available RAM size between addresses `base' and
. A5 K% J3 j: C$ y/ }
* `base + maxsize'.
' e* |9 k2 q% ]
*/
9 o+ ^: \ c: d% k, X
long get_ram_size(long *base, long maxsize)
; B; \0 l5 v* W* u
{
2 D, i6 d2 h* t- A7 j, f5 p8 T
volatile long *addr;
6 k/ ^" S# }. a$ C6 }
long save[32];
. m% s. A! ?5 I) g: W0 Y
long cnt;
+ [7 q* ?2 g, u4 m4 t I# d3 _! g
long val;
1 {' l9 [3 ~8 |' _! u7 F/ B6 s
long size;
* J( ^/ R! D/ J! j
int i = 0;
# w) y) K& N; M5 e: n0 n4 t
, O' Z) \" P% Z3 h# f- h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ o) W; U6 H8 w3 C
addr = base + cnt; /* pointer arith! */
- C: |5 B! B6 z& ]
sync ();
9 b2 ^3 o7 A# O. ]0 d3 r. W/ d
save[i++] = *addr;
: o; K" V; U, b9 n% u: t9 L- w
sync ();
! R+ N5 X+ l$ x
*addr = ~cnt;
! K$ B# K4 g3 p0 O4 X2 k
}
; }* ]! `6 ~8 o
$ h. e6 u$ j# x) y
addr = base;
& u5 c+ O4 ?; F% c
sync ();
( W' x& H9 z1 `
save
= *addr;
9 o9 Q; y6 O3 m& S4 @
sync ();
9 j& U q P$ I: |2 x
*addr = 0;
4 y4 X D% n- T4 U/ z% P
! J9 B1 }0 ^- W0 L( }$ J' y
sync ();
" w4 N) d& V2 f1 C- N7 t a: K
if ((val = *addr) != 0) {
% B* s ]" V+ h0 N) f
/* Restore the original data before leaving the function.
( L( X5 }8 ?3 M. ^
*/
0 f7 a8 [: a: p, r/ V1 w/ f7 d$ h
sync ();
: }4 g K. C/ }$ q6 }* {1 @* {8 o8 Z
*addr = save
;
9 q7 h6 L+ Z. i: C L& d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( x5 b. }, ]; t+ ^" a0 u
addr = base + cnt;
# q8 y+ s) W& \( T* q0 V7 F& f
sync ();
, t* @; \8 T+ x# W' f) a& {
*addr = save[--i];
* [ }6 b @6 u( w% I0 L
}
0 d0 |+ S3 l: {/ J
return (0);
* ?* |" F. U% M1 h% H3 }/ \
}
& H/ u- x8 G! D6 |4 I5 H% B
' i6 t! f$ V' x( d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& l3 v6 t3 I4 |2 C
addr = base + cnt; /* pointer arith! */
) x: P7 I) a0 |: J
val = *addr;
, s v6 x# W; L& \! @- |
*addr = save[--i];
9 ? S5 d `" _
if (val != ~cnt) {
3 @8 I+ Q& M9 c9 u( I- s0 k, F
size = cnt * sizeof (long);
/ c! k( m' B* J) _
/* Restore the original data before leaving the function.
# n1 |. \8 H3 e1 V: l5 \
*/
3 P' v, s7 R& J4 e! e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 ?$ u' Q5 d: _6 n& ^1 S' V; l8 ~
addr = base + cnt;
' A5 M, o9 c# L$ z! ?2 i% K9 d4 d
*addr = save[--i];
% x8 w* M1 |8 O0 T* _; A; Q
}
( `9 d- h9 T" Z
return (size);
" ?9 @. R- T! r" p \! X
}
6 Q" Z( N1 v. j
}
* Z0 q+ m: i8 o, Y& q
7 ^0 ]4 {2 M, [% F
return (maxsize);
1 F) r/ Z& R% F
}
7 l5 ]' d- w2 y! V$ ?: g, {- Q
int dram_init(void)
e0 H: _* Q; g) o$ ?. K) J
{
/ Z$ h# P- ?/ S, m
/* dram_init must store complete ramsize in gd->ram_size */
! I8 q; A5 [) O6 F% ~! ~8 o4 T
gd->ram_size = get_ram_size(
; x/ T% r# U7 u0 n; m e
(void *)CONFIG_SYS_SDRAM_BASE,
8 R. K+ G+ s, K- P
CONFIG_MAX_RAM_BANK_SIZE);
5 |: P1 [" p9 v# H* }
return 0;
: w4 x6 R. e0 B% a+ ~# g
}
. ?% Z; B/ f$ ~% w3 u& u) u
! ]( p+ H5 |+ n/ \3 i3 c& y
8 k4 e0 @6 c9 J5 c/ [
7 k, r8 A0 t3 l& |
. b& |0 J3 j' p! K( i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: D* d. Q) g: @2 S
& j0 [# e; f# `! w' Y
$ ~+ Z0 C# D+ ^$ e8 t
! R7 e5 E& g# ]! N) m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4