嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* j* j5 w; \, d; B7 }' r/ [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, K9 E7 ]: w; h: G( W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 J; [! ]$ @) Q/ g0 Y
. k; H' f: N0 m$ k! Y( ?7 y. ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: ]) }$ F6 m q& t# |
' K: Y% F4 c. u A8 o* n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 ^ P9 `6 |- A9 Z# p
/*
; e- i5 m+ X0 v; W0 v; |9 o6 K7 z
* Check memory range for valid RAM. A simple memory test determines
" ~$ S4 L- R4 D4 f; X1 C. Y
* the actually available RAM size between addresses `base' and
& r3 s. w! d9 X5 w% k% j/ r
* `base + maxsize'.
; @, c% O! _: c' O2 {. d5 U
*/
* p4 }3 o# K* |' `) Q3 c1 R& D
long get_ram_size(long *base, long maxsize)
4 u$ O/ ?1 X5 ?
{
* W; J/ t( D, G. C6 E3 a" h: j6 W
volatile long *addr;
5 B: o- B9 L1 S* V' z# C& _
long save[32];
( {" {9 F+ p9 o+ ~& T
long cnt;
' O+ N# ~6 b9 X; T
long val;
8 j& j& [6 r; |0 u( [; b
long size;
! o3 U: }2 U7 g- r; E% b) s) S, W
int i = 0;
2 k% R# v7 _" T2 C* B8 C
- F8 ?' n$ Z! w, c+ }/ i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 x% t1 C7 N% M" g, k; Y
addr = base + cnt; /* pointer arith! */
: g( i! b7 U, ^1 w
sync ();
+ K1 W% D% |( r4 i7 _
save[i++] = *addr;
" x L" s" d' ^0 { @
sync ();
2 `4 \ ?: Q! Y$ e
*addr = ~cnt;
c" u( o* k8 b' D# C: c# C
}
. t% f: T# u; a+ d
8 \2 ^# {5 u1 |) D5 X; K
addr = base;
7 o/ S5 E. ~0 W
sync ();
6 U+ N! k! \3 p1 m: r
save
= *addr;
! O3 ]0 o) S2 x0 M5 W- P' [" }0 [
sync ();
' n) y4 l! O' q
*addr = 0;
3 R1 K+ |% ?/ U/ N* c9 h5 J
: Q+ h7 P' ]/ l0 t, D! R- J; K! a
sync ();
) K. l W* O M
if ((val = *addr) != 0) {
# B* a4 I% l0 T1 g& T" \
/* Restore the original data before leaving the function.
+ P9 N7 E7 L2 i* D
*/
9 P& y0 U! Y& J0 t
sync ();
9 m/ W0 \, k L6 ]( W* w g
*addr = save
;
" c- j- X: u& e1 H: K* q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) m- a6 S/ u0 k- k+ g( E3 m" s
addr = base + cnt;
2 Q. E& |& c+ l2 g8 [% A" f7 r
sync ();
5 w3 T t4 G% k. U
*addr = save[--i];
4 [+ k# A- r% L
}
' a. @% N% K- F) s" _
return (0);
. g5 i! K; c/ V$ @6 ?4 }; Z, F
}
( v8 D" A% t. `( K* L" t' f/ }
$ H! Y+ O7 H* Q6 u5 R# o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* A# r1 v. h! n% U: [
addr = base + cnt; /* pointer arith! */
; R6 y: N" G: a% q
val = *addr;
7 r# u( ^/ a9 ^% S8 e n
*addr = save[--i];
0 `' _' {% J+ X% w
if (val != ~cnt) {
; B/ ]2 q8 s9 Y6 P
size = cnt * sizeof (long);
9 C; O/ |# D* g5 e, y( N
/* Restore the original data before leaving the function.
2 M1 Y) w# c5 H, R# r
*/
5 H% Q! N4 c! ^7 z' N' L% Y$ g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# W; V) A( A: A4 p: a2 L1 Y
addr = base + cnt;
) R$ q$ l! S: r% v6 [. `
*addr = save[--i];
' j7 L! ^) ]( t$ b. d; m& N) C
}
/ _0 X, k5 _8 d0 Q( y8 N- E
return (size);
/ |4 B7 z& |% c
}
K. E" W/ B/ I$ K1 U5 P9 P: Y7 N
}
4 J) b7 n5 y# B
! k- I% m6 X( }8 x! h0 P
return (maxsize);
: I7 m# [) I: Z$ }5 }! u
}
! _$ w% Z" w/ B9 t3 v
int dram_init(void)
- t% D: {4 s" M" C& `9 J0 C7 _* C' v! x
{
L( v2 U/ y8 c) N ?# @
/* dram_init must store complete ramsize in gd->ram_size */
" \- u+ f- o8 M
gd->ram_size = get_ram_size(
- H% t& L3 n3 ~3 l1 ]
(void *)CONFIG_SYS_SDRAM_BASE,
% n6 h, K* ?4 R6 a
CONFIG_MAX_RAM_BANK_SIZE);
3 t4 ?3 M+ F; s Q9 o3 _
return 0;
" n! A6 W- w5 F1 E: q. Q" ]
}
. n' A) q- o) j" \
* h" ~ ~/ b2 }' ?) H; o7 _. u
4 f% b' Y2 |7 g9 O2 n+ {2 F/ n8 t. Y
% l+ b, _2 k1 e$ g
6 e2 u+ H; H, Y6 ] W6 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: [; \, H5 L& T0 ~* _# J/ |
+ a b' ?* Y( E9 `% Y% c/ J
3 [ a8 V- J8 B$ Q
$ c0 u& |% ^3 ?; Y7 ]% _
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4