嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& R- ]" Z2 F+ f k$ \9 u4 `2 q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' ]3 o. n J0 g/ U Z7 `, v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 G: C% M" q- K0 c' o
- m$ n. L' g7 `$ Y" @% i2 Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 G l6 V7 h/ O) \6 D
4 J v/ D: h) F3 ?: m! a; F, g- { V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 t! c$ y0 u. \3 u+ P: y4 H
/*
9 y2 d, ~; R) X x
* Check memory range for valid RAM. A simple memory test determines
! P/ \. m& |7 z8 C. K+ Y' g6 `& }
* the actually available RAM size between addresses `base' and
' ^2 L6 G9 ?7 \+ n8 g3 J
* `base + maxsize'.
1 R8 G2 Q9 P% h& [! ?; _$ _! N
*/
" P8 x+ {" r% o6 r
long get_ram_size(long *base, long maxsize)
' \8 \7 d4 ?5 N$ f2 l! L" U
{
6 R& j! i5 A! d3 i# R
volatile long *addr;
. i0 F, }' d, i% u6 `7 W6 F
long save[32];
# S8 @7 I, p8 ^5 o8 q0 |
long cnt;
+ @' m# }) b% `2 [$ V
long val;
- x: D5 f, B5 y4 {' [9 N
long size;
. A e* a2 \7 i: c% m9 J0 U
int i = 0;
" m1 z1 t/ \2 ]" l9 s: ]* u
1 |7 B2 U' M0 j( F" m) x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 X' h0 w( v8 t
addr = base + cnt; /* pointer arith! */
# V0 k) _1 y& `0 `
sync ();
9 N4 q% G( w9 s
save[i++] = *addr;
% w8 y4 |. K: v, N( \3 g
sync ();
3 S5 o/ E; Z _$ c" w8 A
*addr = ~cnt;
, o' _2 n, O1 g8 b
}
4 F* D+ [6 m0 y) `# P# _: M
6 k# m. S. K7 i; C7 T
addr = base;
# x9 c# a0 D* v2 h1 Y
sync ();
/ i$ `0 h6 M; X- D, q
save
= *addr;
$ B2 {1 v! w( \& E
sync ();
. _0 \0 b' {- }1 U* L
*addr = 0;
8 ~8 I1 F/ A/ W) j) q' `) C
, \" Y% K' @0 ~+ e* m
sync ();
& |! W, k2 n1 u7 N; ?0 x+ B! h/ J0 d
if ((val = *addr) != 0) {
M# e/ l( a8 D. P, h9 S+ y( Z; l
/* Restore the original data before leaving the function.
. e- @8 i0 [3 i6 }
*/
. V5 A- X: B5 {4 o- `6 I) S; v
sync ();
$ P# P5 E) a6 {# ~9 O
*addr = save
;
: {- u, w+ u8 b2 J% x& a4 P
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" ~- ?% y9 p7 K
addr = base + cnt;
" U' G& @2 Y9 N- S4 {
sync ();
: w! g% V, H6 U# s2 J5 t
*addr = save[--i];
3 \& c9 v5 A j5 X
}
1 Z1 `' ?! m0 M# f, ~; U( ]8 _5 l
return (0);
3 M, u y7 T* A8 |6 W
}
5 a$ `. j+ g5 \$ x
9 s* ~( ]7 B! C% t/ N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) x7 ~1 Z7 e0 [3 k3 u6 k& }( A1 V) E
addr = base + cnt; /* pointer arith! */
* f1 N- d% f: W" U3 H) o0 A, J) P
val = *addr;
4 m( l: k' v/ _" D
*addr = save[--i];
$ e5 d* Z5 F& T
if (val != ~cnt) {
- i* O' p" L8 x) F2 ? B- Z0 \
size = cnt * sizeof (long);
, B( E3 v; k5 w5 Y; o
/* Restore the original data before leaving the function.
$ T5 U( a1 J& W' F( s9 h" ^' u
*/
6 k$ U6 o8 M% l4 q6 Z/ ]9 Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 s0 g+ J0 |- x4 \2 J- n
addr = base + cnt;
, z& A2 H0 ]( w% T
*addr = save[--i];
3 ?! j, L3 U# U- J; p" h
}
6 {* p5 X J) N- f3 {( J1 W, O
return (size);
* [ _* p( Q" J! z
}
" L3 X/ k$ e1 ]
}
9 h3 @$ J) b" o+ }2 H
" v# k3 C& |7 F8 R: [8 l
return (maxsize);
4 u! `8 Q8 \4 a2 b) u6 l" E. i d
}
4 g# B' F# X" L" o
int dram_init(void)
9 c) Y) G: I* w9 E
{
; j% u+ ]4 C6 t7 R) o) P& j
/* dram_init must store complete ramsize in gd->ram_size */
( p1 k+ U3 @' z! p$ d
gd->ram_size = get_ram_size(
; b$ b" v6 |" l) ^0 w' M0 [
(void *)CONFIG_SYS_SDRAM_BASE,
1 p$ e# ^# K( X2 X
CONFIG_MAX_RAM_BANK_SIZE);
6 O& x5 y( E" Y% `6 h
return 0;
4 o5 t! b c" g% ]' U0 X
}
' v2 Q! ?! h' w$ p: y; \ w, K( I
: G7 `$ X8 G% n: K2 F
- V! X% @& ] a9 m$ l# \( Z
' @' v* r) s% l$ a* X# G
5 J! v& {- N5 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* ~$ |: d, ]# T
5 A- ^* e" J1 e/ D
: Y9 j% s9 |0 x$ g$ |2 N+ ~) `. m; `
& p# N. W2 L: A, Y% G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4