嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 o, S1 V4 g; {9 E) X5 m8 E, C+ C1 a
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 j# C: ^# M! V& F+ I% E# y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 q2 f6 y# k* Z( R
, \! m& b9 o' I' b) V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ]: e; O' l9 {0 X' ?
& t% W* J; K$ f1 t) f. \8 y* Z. f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 L* D5 `. a" r) f2 X. j8 a3 t
/*
3 l$ l! E5 R% Y2 s/ Y( |; ^
* Check memory range for valid RAM. A simple memory test determines
" {, ]/ F: I* {
* the actually available RAM size between addresses `base' and
% i3 J3 o" k" l3 M! R: L0 A
* `base + maxsize'.
) G$ Y) d8 z8 H$ }3 T& m
*/
5 o) v- o- X0 t* u4 E
long get_ram_size(long *base, long maxsize)
6 W! r+ H r9 D2 b4 Z" m
{
7 l! `7 z4 m- w/ ]& Y, S% @' h
volatile long *addr;
2 ?# N# w/ }; {& }* Z; I' D7 E; E
long save[32];
& d7 r1 ^" P- v7 L Z5 E6 p
long cnt;
) B9 X1 u! L5 @# l
long val;
2 Z; J7 Y `/ a8 h. n
long size;
' O% H+ w/ B" g" f1 K. z* _
int i = 0;
) @/ c! ]& g3 L8 V, L# Z
+ F Q- [5 t* O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 J3 a4 X( B9 \- `9 n; S( I
addr = base + cnt; /* pointer arith! */
( h$ t7 m1 \# C- j
sync ();
& R+ v* w( {5 w$ y3 n; H N& N* U" J
save[i++] = *addr;
* U* F# {# T/ P
sync ();
6 k8 E! ?/ ?3 D/ a/ G1 s- w
*addr = ~cnt;
1 C3 w. d3 M/ C) b
}
" e4 `3 D( ^+ r, i( K# E8 H3 B
' L% m- P4 [' B1 h
addr = base;
" W5 L0 K6 p5 R8 T
sync ();
% ^ s$ W8 m8 G' ]+ x/ \5 m0 E
save
= *addr;
' [; W) b5 B# e7 k% ?% |
sync ();
! F- H: f4 Z+ S& r. _8 L
*addr = 0;
+ O! e7 F q8 a0 q5 ]$ t! d$ N
2 d2 Y4 i, n0 a4 `% |" p0 @
sync ();
/ \0 g: R# U2 \2 V
if ((val = *addr) != 0) {
9 h) ~1 F1 I# |% R
/* Restore the original data before leaving the function.
8 }, a# }% V5 r" N8 z
*/
9 I+ p+ `5 \$ M! T5 l2 Y
sync ();
8 f3 G; u. I' x) C* n
*addr = save
;
4 O% g$ Z7 E1 S% }0 D' c7 j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ G( R+ t7 R7 K; a6 o+ R. M6 f
addr = base + cnt;
- |' q/ N7 B' c
sync ();
2 I& g4 [7 R3 }- D% G/ b/ U6 X6 ~
*addr = save[--i];
: |5 r3 E& G% h0 z, U( N* f( r3 R
}
4 d7 \7 l' ]$ L' J7 B" {) T* L
return (0);
1 z* n& b0 U$ W8 A+ @* I1 A
}
1 u/ A# Z7 w# y# ]* p
, x j0 \ ]% q7 H3 S- |9 d! L- J2 ]$ K% ?5 S
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
d# e2 Q6 z' V1 D6 K" e, N$ i
addr = base + cnt; /* pointer arith! */
& t6 n: n) |- ?* ^
val = *addr;
, ^* Q% ]5 s. z, i: m1 ^, q
*addr = save[--i];
' D! o# V) `: P9 q. M4 C9 O8 C* G
if (val != ~cnt) {
8 }0 O+ t; c. a7 x. \; n
size = cnt * sizeof (long);
5 h9 i$ [- G7 b6 q- g3 z% U2 b$ g# o
/* Restore the original data before leaving the function.
/ _1 g; ]* a% l0 y2 Y& g8 d$ q
*/
# ?4 O( f3 X8 z8 g' z, g" J
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 x. ?& B1 f& m- \
addr = base + cnt;
. `! [! C% N. Y' U
*addr = save[--i];
, C9 _ n1 h0 o. \
}
" y& G7 K; Q: U) O
return (size);
8 c) X2 b* x6 q) w3 G
}
/ \, L9 f2 p- C) c d' u
}
/ f; y& t+ V/ a
/ P# a) P4 v D# ~0 Z: _! h
return (maxsize);
) V7 {9 H4 c. v3 r$ l( [
}
; p% _, j5 W8 \+ B% m
int dram_init(void)
# z& R4 t! |; s9 O
{
3 a, o& ]. U$ H7 @3 i) R4 ~# k
/* dram_init must store complete ramsize in gd->ram_size */
1 S. F: C& [ U7 d8 \1 U
gd->ram_size = get_ram_size(
8 `0 f; n% ~; { w' {; v ?
(void *)CONFIG_SYS_SDRAM_BASE,
2 m3 e3 b# V6 i# q4 S
CONFIG_MAX_RAM_BANK_SIZE);
+ I$ `! o# v/ o
return 0;
0 ]" P* t& v* a# W
}
3 y( Y/ {& d2 |+ g! \
/ F+ l6 _& q# U/ |& a6 p2 I8 C
! R9 v2 A2 [8 h0 y6 T" L
% _6 u( N5 Z4 T- `% U' t
0 H# k( h8 s+ o* V$ q5 T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 e6 M& {, O1 j% `# L9 ]
! S1 }, _( G5 g
2 s1 M% g# b9 n+ j
# s! E0 f, m5 D- S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4