嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 a/ ~* R9 M# y2 `9 z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* _* y" Y9 S# k @6 @% z( N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% d! T0 n5 w( i) Z, Z
3 d1 V) Y% s E# _- A4 n3 a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( K2 Y4 m3 N) O9 f" j% \" O
* k% l5 x1 Y+ J) x" W" Y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 W4 ]* B8 f! S6 f: M
/*
2 t h$ w: ^+ N* w1 ?( n- H: a+ G
* Check memory range for valid RAM. A simple memory test determines
0 q; E: E- h5 S& U, O5 _: v
* the actually available RAM size between addresses `base' and
( f( n& Y: w0 U3 {; e
* `base + maxsize'.
: i+ ~ M1 }$ V- z3 P) Y" r
*/
! ]! q( |- U. { m, ?
long get_ram_size(long *base, long maxsize)
8 d6 M; W) O/ N0 E1 x
{
- Q! l/ M; l' u {
volatile long *addr;
0 W3 u/ N8 X/ W8 m1 u8 w. |+ L% C
long save[32];
% q5 G1 ?: {( i3 R4 e
long cnt;
o/ z( r4 y! t+ M( a, @
long val;
$ t! N! F1 K9 A F L0 P
long size;
! B1 e# K8 A5 _- N/ m9 h
int i = 0;
7 D* P$ H$ N: R- @
2 x7 w( T# P2 g1 q- |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ F: ~2 J, q1 U
addr = base + cnt; /* pointer arith! */
; i9 u D+ Z, U
sync ();
( I) H. y- w( W% f( |* R
save[i++] = *addr;
) ?) F5 p7 D) P9 m. U
sync ();
# {' t$ _+ i* H( F' p4 u
*addr = ~cnt;
; v+ ?, e: u( x7 o3 C1 l9 [
}
# p0 {' d1 n' \$ s
, J5 d4 n& Y$ g8 Z0 [3 _8 A
addr = base;
5 l; m' L j% g1 q/ f
sync ();
4 V/ z2 j3 l; t3 i/ G, K, I, p. j
save
= *addr;
/ N- h+ ~+ r5 b4 S
sync ();
, L4 N- D: o/ w
*addr = 0;
. q6 |7 c% d# W/ y; ]9 y! X, o, X* v
8 e% y) x' R+ c1 ]3 H! G6 k! S, |) |
sync ();
& T0 ~2 v" o. K* C' {1 u
if ((val = *addr) != 0) {
" U h- w( A% o# W ]
/* Restore the original data before leaving the function.
5 G9 T/ g" c& {
*/
* E- d$ `2 O0 n- C
sync ();
$ N0 Z- G8 i7 E! q
*addr = save
;
7 o9 b' S: n4 X6 O! N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* I' S r8 ]. r) c3 h0 S
addr = base + cnt;
7 \% w0 B$ K( [7 k
sync ();
" ~+ }4 {. {+ \" o
*addr = save[--i];
; R! ?) U, J- l: ?- i
}
3 v( y. X& d) }$ z7 v
return (0);
0 l1 d5 B. O9 v& Z# A6 d N% [ b/ ]
}
1 f; H/ ?# Z0 W& E) `4 x
' W, L9 B) W% O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ u8 e# j9 o+ M) i! @
addr = base + cnt; /* pointer arith! */
! r8 \, L- I0 u9 Q
val = *addr;
, z" p5 K2 |: d" a
*addr = save[--i];
. s# J- |) C: d& z$ ~
if (val != ~cnt) {
) c3 e6 K p9 V
size = cnt * sizeof (long);
' H. b) X: u5 a2 l" T0 d" E
/* Restore the original data before leaving the function.
3 \3 A* c6 ~( q+ z2 k$ l+ N
*/
) d5 s) s% Z _# r: h- t9 N9 p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# _. r: H0 \6 j) ~( N- d1 e
addr = base + cnt;
# U4 O! e7 ?/ f; l1 j& L8 ~
*addr = save[--i];
3 v! _# f, B6 h9 R! s; V2 u
}
& n. ~6 Q, n9 Y% a
return (size);
0 a9 S2 B9 N8 o0 C$ F
}
]/ w+ i- n, D/ y" C& d8 ?) R
}
2 n% r/ F4 t$ D+ Z. e& z1 t
2 G9 ^( k% H, ]- z6 M/ w
return (maxsize);
7 b( z5 {$ ?5 u$ ~. [
}
* L/ i( s5 \ Q0 N
int dram_init(void)
1 p. v6 {. e# X( ?
{
6 t- ^; e; v& a5 E7 u
/* dram_init must store complete ramsize in gd->ram_size */
S( N9 I) P! `9 s" g7 H
gd->ram_size = get_ram_size(
: n I+ W1 ?) C8 R3 v, k
(void *)CONFIG_SYS_SDRAM_BASE,
& h7 _& @# _2 a; u0 {& _3 r0 m- w
CONFIG_MAX_RAM_BANK_SIZE);
3 {5 f( q1 r ~1 Q, B) E6 e
return 0;
' c% e( `/ V3 @, H; r
}
3 E" ~" X8 c3 r) k- J
$ C1 C) i$ Y9 x
7 w: U# F* u/ B% P4 J
" l( H, _" |/ }8 \3 ?$ T
3 Q j6 o4 O! Z4 x3 W% v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; X1 V6 t2 i1 M. }% K
7 t: h& x! t; O2 Q5 _" Q& y
) [3 {' j x9 {3 D2 O6 A
# S$ j- v0 B$ w U! ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4