嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& |! z) }" V5 I
核心板2:DDR2 256M Byte NAND FLASH 8G bit
^! D1 B0 p; u/ s/ ^& u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- B2 c7 {6 j( Y5 N7 y( S
- d9 R/ j: |$ W7 ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 A0 ]* P6 O b9 q
# [: y$ _! |/ n# u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. a) ]0 s! ?$ N" W5 a2 Z' K" e. Y
/*
) Q2 c7 O% v* R3 Y% H
* Check memory range for valid RAM. A simple memory test determines
1 i6 `, R& ]& g! e0 U" n2 w
* the actually available RAM size between addresses `base' and
% d- t+ Z" N( v: T3 v; w0 M1 |7 i
* `base + maxsize'.
7 L+ F( v& k/ T+ m
*/
i& B: G3 m$ m4 D' @6 j
long get_ram_size(long *base, long maxsize)
* @/ H8 c3 O L* S) w
{
4 w+ F; L- K. j; H
volatile long *addr;
) B( ?2 x' p/ Q# a. d" e' @
long save[32];
3 y! _* N% D$ z5 _: A" S9 T
long cnt;
3 K& x6 c x3 c$ z* \4 K
long val;
6 ~9 M8 j7 D8 [$ W' Y; u$ t8 d
long size;
& U' p: Z# g" L1 ?* ?; Q7 Q
int i = 0;
9 u& X' R; Z2 c
: u( g/ V- N7 `0 o+ `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 {" G; T) q2 y/ t1 j" f: N5 F6 k
addr = base + cnt; /* pointer arith! */
/ g" v/ Z- ^4 t/ |& E3 q
sync ();
0 R E+ p F6 u& ]# y, f2 K; A5 c2 j
save[i++] = *addr;
( O( h2 }3 X% T! M3 [0 Q
sync ();
1 z$ V: d4 ]2 w+ X- S2 i/ _
*addr = ~cnt;
% w+ d1 L2 C# q( D$ p1 t5 S; v8 ^# S
}
4 H7 i+ ]1 S) E2 f2 [+ y
8 G! X0 t, R6 j- W9 O& B
addr = base;
8 M4 `( n( h! X1 [+ g, E
sync ();
& u2 }& b, h& s; l' P8 v3 r
save
= *addr;
8 o+ M+ q$ l: F6 h P& X# }
sync ();
, o6 _0 d: |5 G* A: L
*addr = 0;
% u. [5 P# e: x$ q: f
, v$ G! }. W$ B- P) m, s, ?% }
sync ();
+ o& w( \( ?7 P
if ((val = *addr) != 0) {
2 d) Q h* b4 _" t0 A8 d
/* Restore the original data before leaving the function.
- O0 y' b: R: W; x; e4 ~
*/
4 {" i( B$ [7 N, i, C
sync ();
) m( I$ r7 \- i1 @6 w2 R) {
*addr = save
;
$ v6 a$ P0 V/ a. e9 { O" T# N1 u
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 _( j% x5 |1 r
addr = base + cnt;
6 A# W) E, W; S6 \
sync ();
3 A- h# M! f* |" t8 [
*addr = save[--i];
: g& M: e" f* I7 G3 t
}
H W. v( z4 u% c* @! i$ s2 j" u
return (0);
( h+ x- j% R" n- N o5 O1 H
}
2 L; v, e, [7 W0 Z
6 _+ d' |. M/ F$ @) P& w, \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 [) [( ` t5 N" m
addr = base + cnt; /* pointer arith! */
3 e x8 D) P9 {( g0 X1 Z; T$ p
val = *addr;
9 ]5 P( F: \5 @
*addr = save[--i];
) X- B; v$ i. U* m$ l" q; T8 v- J
if (val != ~cnt) {
9 o4 B$ Z" I7 A4 i: V0 r7 C- |8 x
size = cnt * sizeof (long);
! F8 D: k9 [1 j! e' e3 g# |! n
/* Restore the original data before leaving the function.
( [ P3 d0 ~9 f% R6 N
*/
% F% n. {, N/ h" ~) R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& D1 W w0 w7 N2 J5 Q, e. U+ T" n; F
addr = base + cnt;
8 _: | N9 Q8 {8 ]3 m. h
*addr = save[--i];
, P- q4 h9 E1 p; S) l: v8 w0 Y2 @ K
}
$ f' K. \0 @; Y& j
return (size);
! M' p3 t( Q" b% i" _: o0 l2 L$ h/ k
}
& l2 Y' n( b* B3 X& K" h0 c
}
" j% J& m0 [/ X! F1 w0 l
0 Y9 S5 o+ U" `) @* T! _3 F( c& s4 U/ p
return (maxsize);
; b# r* R' w' E5 y M1 l
}
1 C/ K: E# E) v9 j, S% G: v
int dram_init(void)
- S' z& p( _/ T4 ^2 _ L
{
; Z# |2 X) @- n1 {! I; V0 L$ z0 @
/* dram_init must store complete ramsize in gd->ram_size */
: W3 a1 p$ e5 s! {! W8 r. Y K: u
gd->ram_size = get_ram_size(
2 U* t1 i5 A0 d: o: [ u
(void *)CONFIG_SYS_SDRAM_BASE,
) \) h# K- ?% X8 a
CONFIG_MAX_RAM_BANK_SIZE);
; K/ a4 J& `/ I, J% }( s+ u* {
return 0;
& P; U' v! z; g1 s
}
& T2 z3 J" J4 C( A1 p; J
: U8 I4 d. A; g) W+ G" Z P
2 L1 Z: ~0 r$ ]8 k+ ^( O/ A- t! v
' Q4 w" ]0 I; ]( k3 N2 ]
9 I9 E8 l& e0 w5 Z: W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ D q3 I+ ?+ d, \# p: c
, n% Z7 s5 k0 k) ^6 z7 K6 D
9 Y. n/ C5 E: C' p
" o2 h; ~9 Z+ x
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4