嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 O& W1 D; b+ u, U+ P# ]9 O
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 L4 s( a$ I$ O: p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. n% |1 }$ v+ B, b7 t
3 F3 ^- R- C! _4 a& [5 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# S6 L& b- d, Z7 \4 D5 [1 g0 [
4 M# B" z G! V( E0 }' i
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; f( C, E! w: O* a5 y% j
/*
0 h; B0 ]/ G& _) k2 c
* Check memory range for valid RAM. A simple memory test determines
2 I/ h! Z. a$ H: c( ^- d4 C
* the actually available RAM size between addresses `base' and
: \ X/ u# y H# z- W q/ b$ F
* `base + maxsize'.
1 r: M) u# s/ g2 J) L+ n7 t
*/
8 h: ~3 e4 |, \
long get_ram_size(long *base, long maxsize)
! U4 T l) P- ^ s
{
5 W+ o3 e8 Q0 @
volatile long *addr;
! ^* s$ J/ j; X( G3 K3 D
long save[32];
! i& J) ~2 t& B
long cnt;
2 {8 u5 z6 B' P( ?, c% Q$ C$ a
long val;
3 E* {. D. v3 G, n* f8 g
long size;
! f. c+ e$ ?! j( b! m
int i = 0;
: Q, |. T6 e6 {8 I
* Y$ T; s' b: |0 `2 _+ X. R! ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& Y- M; g3 t! F3 v/ Z8 |( T
addr = base + cnt; /* pointer arith! */
( E* U- n$ j( h" O Z
sync ();
& o9 d$ Q2 I- ^) c
save[i++] = *addr;
7 u( h: u. H, _% c' ]$ \1 w
sync ();
5 b2 [( h: f! S
*addr = ~cnt;
|0 Z* \1 p0 P( I8 v
}
' \! k; {' q/ T6 a% R/ N5 v
8 b& Q" h4 v2 M* {
addr = base;
/ {/ G4 [; r/ A' t" X2 g6 @, u. M
sync ();
/ L% r" g' H: P( B
save
= *addr;
1 l: n- U% I9 f# t3 l6 O
sync ();
/ s3 u# u& ?% }$ [3 z5 v% R$ P" E
*addr = 0;
1 |$ F# q) X" R5 C' k
; F; j' A' s* { s6 C
sync ();
1 p4 o# [" X* J, L$ A1 k, r: Z
if ((val = *addr) != 0) {
& n# R4 B7 G( a' R3 w; r
/* Restore the original data before leaving the function.
5 I' J6 S+ ~0 F
*/
! I) \% Z+ d- C' ]
sync ();
( o$ D3 R2 o2 K' X- I
*addr = save
;
9 O9 y" q& s0 J: m& p( E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% A( |/ Z( e, ? Y: f
addr = base + cnt;
. ?4 G+ a; A2 @" k% L
sync ();
' h0 Z6 L8 s; }# V( u. t
*addr = save[--i];
5 F1 Y8 V j9 i; E7 c( O+ M% U0 I
}
& ~1 r/ j% @6 G. k$ {+ x
return (0);
) ]6 X3 M1 i$ j v1 I% K; J d
}
u# R- {& K9 l
% n, U M+ w* }$ r9 S* U z; ]5 p
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% G9 ~$ S* p0 t8 M! p
addr = base + cnt; /* pointer arith! */
" E" A, s+ R6 h; R; ?. X; X% w
val = *addr;
& I' d. G1 j3 e \2 x
*addr = save[--i];
% z% o6 f/ ~: O- W. }
if (val != ~cnt) {
8 A, ^. c: L. b* ?
size = cnt * sizeof (long);
0 H% o4 F1 `: G7 e) b% f6 r
/* Restore the original data before leaving the function.
; t6 M; \% r8 f
*/
6 ? P4 Q% _$ J" ]% k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' P/ x4 \( _) x, [& p
addr = base + cnt;
( @0 p9 J7 b- w5 X$ v, |
*addr = save[--i];
. o' I% _& W5 \0 i5 K
}
( ~2 ^6 v4 m$ M$ u( n
return (size);
* C" c- J- X3 [. i' D0 W/ R x
}
/ C) j( ~; I: W
}
/ F* _0 ]3 N8 V
3 D. A. v$ N9 t. C4 i! F+ y
return (maxsize);
! u z* A" X) b! {/ s" y8 l" g( _) j
}
, v* @3 H' [3 V3 H: n/ U9 g& c
int dram_init(void)
( i# N' ~* \' c! B- \
{
# k* q5 O" ^$ J0 a4 Z
/* dram_init must store complete ramsize in gd->ram_size */
- _7 C- q7 R9 i
gd->ram_size = get_ram_size(
9 H% d! x, i- S4 ~: p
(void *)CONFIG_SYS_SDRAM_BASE,
3 U t* h' t7 q) u) \0 H* O" y1 I
CONFIG_MAX_RAM_BANK_SIZE);
6 I+ U! u0 g% F* {) ^& e
return 0;
/ |. K! Q1 {7 x
}
3 N/ Z5 c, L2 D8 |0 s
4 @1 e& o6 F/ o; N& }0 b# L2 [# G* c$ K
9 M$ N a# q9 F( G5 ~
! D& Y1 h$ I8 y* q" m4 E
3 K; |# R' T$ y: W* e5 H) Y$ @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 m( E- n' J" d0 h4 n
. K2 Z) b7 a1 G/ L q2 L
6 r$ [0 i7 a- }0 t' D: G% |( u
1 ~4 D8 g) R/ z9 G* O4 _2 l
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4