嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 Z! B5 x" k1 c- D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 S0 U# C! O( j6 ~' V) G" T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" f& v" u- \& ?$ L8 [+ v8 a+ A7 O7 m
; |" d- u | l3 V7 O' q( G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& \# u# y# c5 v- D6 E2 _
5 m% A# |5 B5 C( C1 v6 U: g2 U/ f! T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# B- o6 Q! x7 [+ Q% t
/*
. @; N2 l5 F% {, @3 Z, `2 t' Q
* Check memory range for valid RAM. A simple memory test determines
$ k, p1 S R/ x# {: k! c5 U' l
* the actually available RAM size between addresses `base' and
* ~5 L7 B( i/ {2 K: d
* `base + maxsize'.
) i6 v7 s9 U2 N
*/
% i9 V/ s, R5 m' q- W& X" W
long get_ram_size(long *base, long maxsize)
/ \! k( c0 q* I+ h' }
{
/ C' W# ]. ~% ^; }" }
volatile long *addr;
/ }/ k( N& H" f
long save[32];
% g. Q u: l- R/ k
long cnt;
" c% M- z, T# ~0 Y
long val;
7 T" C+ C) Q4 A2 N: Y5 p3 O: w
long size;
/ {$ k2 _1 \- A3 | \# U
int i = 0;
0 U) A* m: P" b$ e% B+ X3 _& I/ H
" ?/ h" h3 i7 o, \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 `1 P. t( Y4 R4 }( @6 K- ^
addr = base + cnt; /* pointer arith! */
9 \% Z0 e: ~- t" K% i
sync ();
, e1 y# s5 d d
save[i++] = *addr;
/ _- _# ]$ L y2 Z
sync ();
6 P- x0 ^* h. n5 J3 d. J& P( p
*addr = ~cnt;
$ ^2 {; o7 s4 R; e& E7 i9 _
}
4 h) O5 o. }) V3 l e
; v6 ^6 a# W, k' R3 }$ @# ?
addr = base;
. _( P8 X) W& v, @$ T
sync ();
5 |# q4 d8 L* H" ]9 [- w5 `
save
= *addr;
% _$ D0 {, C, ?
sync ();
9 W4 y$ I! o1 G
*addr = 0;
& C" [# H8 K% R& X5 N7 W q* `
6 O, A5 V7 i. K8 Z
sync ();
( N5 ?% C5 E+ j# Z0 V) b. E' M
if ((val = *addr) != 0) {
; {; S) o5 x! \" G9 _0 C
/* Restore the original data before leaving the function.
. D) H& W, c6 G7 W; s) ^* A
*/
" K! s6 t `# ^, R: Y% D# d
sync ();
7 D& F) F% R* k
*addr = save
;
" Y0 s0 w, o, s" _: z Z' D
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; _: C6 R# z( t
addr = base + cnt;
0 ? I, }5 u |6 B7 W
sync ();
. C, M1 W+ f, k7 L4 `6 l
*addr = save[--i];
+ \; B4 K+ @- G! ]8 y, \
}
; N3 K- L r: {( j
return (0);
0 {+ n6 c* s; T
}
( C8 E6 D2 C& ]. q0 K9 I3 Z( v
: [: U% z7 p: ~3 m8 m. V/ B9 m
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) n! ~; t7 s6 f/ o( T1 X
addr = base + cnt; /* pointer arith! */
4 M9 ~0 X3 L# d3 `: x N; Q0 K
val = *addr;
0 B& T7 g5 ~4 p; [5 p$ Q1 ^) ^0 m
*addr = save[--i];
; U3 J8 U% i$ S5 E; a
if (val != ~cnt) {
& [: j3 r3 x- x* z7 o1 c
size = cnt * sizeof (long);
+ s. E/ {9 I4 n5 p( k0 G, y9 `
/* Restore the original data before leaving the function.
" E+ i. b" o% z& T$ f& g
*/
0 U8 e' z3 C* ~% w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 m. H5 Z" W+ h7 k A
addr = base + cnt;
0 ]$ `+ X/ ?2 l% z3 _: \
*addr = save[--i];
# h- A2 l% K0 S, @( f* {
}
+ T, B" y7 ~% n" x6 s7 ?7 @3 [
return (size);
# q! j7 y7 W! D5 h7 @
}
0 u% h) v c- E
}
! ~0 y/ q( U5 x4 R F1 q
@5 U/ [6 S, ]8 k5 Q
return (maxsize);
, i! X d! M" Z$ z5 E3 z
}
/ x1 I% y9 Q: z4 F- A
int dram_init(void)
0 r5 G, y" a a" }, ^
{
- [7 v% m$ a: V0 z
/* dram_init must store complete ramsize in gd->ram_size */
- Z; ^4 ^7 c5 _
gd->ram_size = get_ram_size(
+ k9 g" G% u' M4 ?2 D/ f; p
(void *)CONFIG_SYS_SDRAM_BASE,
* l" R! j& u5 X* @
CONFIG_MAX_RAM_BANK_SIZE);
8 u3 A# `# }! @ y
return 0;
/ X' G! B7 |7 q( z
}
" W4 Q3 E7 F; K- T. P4 l7 K
) {/ F/ N J& [ i
6 ]2 j2 `: s/ X7 q
$ ^4 Q' G; _1 t( W( B9 q5 p
/ g& W3 E% V& I5 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 E, M7 X$ y8 w6 v+ x
& U1 T/ N* f3 {
0 M, R4 z! A4 |: L7 H5 ]
' f# |2 t, c+ ~8 v$ j1 Q: [0 v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4