嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 c' y- D( z4 K. @. O
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ `5 W" T n' ?1 v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! _ h( }9 V% ^3 p5 u
: `1 i5 g% {1 x. p. M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% ^* H, |4 \; R% o5 G
' z" z$ \9 V8 L7 q- H) I% y* Z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ T# r/ A" B6 Q) n6 V
/*
8 ?. i3 @ C- r0 @
* Check memory range for valid RAM. A simple memory test determines
/ W# x+ m4 \, N0 g2 U6 t
* the actually available RAM size between addresses `base' and
3 M+ `$ \. q, i+ r, D' q5 ^
* `base + maxsize'.
6 o$ M: I. i( U. c
*/
( Q ? q7 k0 ^$ ^8 u
long get_ram_size(long *base, long maxsize)
/ m2 @3 r, z* C. d$ R+ R8 j
{
2 o% U& U& K' v% `
volatile long *addr;
: K9 x" L3 j# q3 L5 z- I, z
long save[32];
1 h* W3 L6 R% J$ k. P% }% J2 S3 {
long cnt;
7 R0 d0 ~6 \& u" }, ~, ?- e$ ?
long val;
! H" P0 f! z- L( Y& H8 i& S
long size;
+ ?1 \& S7 {8 k7 [
int i = 0;
# i4 w3 c7 j$ Q2 k9 s
) R$ L8 i5 R- F1 ~# y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 G( Q, x! i; |% x. [3 O
addr = base + cnt; /* pointer arith! */
& k- d; M7 F( k* N/ T
sync ();
& g( N e; B5 M- p/ C- @% T
save[i++] = *addr;
, e6 b9 l3 w' A; A0 B+ T
sync ();
9 J" {* [* A' |; h% m" k; N, Z
*addr = ~cnt;
; o8 N. N/ H: R( |
}
( b3 O2 w, y* O
% B* ?' G- U1 Z' E
addr = base;
8 n7 z1 }! c3 i `4 d
sync ();
$ y1 N# X) f( N! {) U
save
= *addr;
9 v8 k9 u) U/ x' ]
sync ();
& j$ `! ^% X6 n: }
*addr = 0;
6 y& ]4 ]$ s: v
2 B3 K: Z. |/ O2 W% t& T" W0 @: S
sync ();
6 a5 v, W p2 y( U+ _
if ((val = *addr) != 0) {
4 G! t9 p; m7 |9 r# r- r( a5 q% [
/* Restore the original data before leaving the function.
% P) B2 v5 Q+ ` y& U8 b! X8 Y
*/
; h' E5 a' s# H" B( b! u& H/ r. t
sync ();
6 |. h" N( E6 w% [- T! b2 }
*addr = save
;
P% L( D, s2 @' S4 [" E& b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; N0 V( C8 U* g1 w7 M# V: g3 m) d
addr = base + cnt;
0 l) q" h7 `8 Z/ t, ]) E' c( y
sync ();
% N5 N( l) m- M$ l T8 s
*addr = save[--i];
6 P& e4 ~2 p9 D- H7 C( e+ Y K
}
/ {9 {# [- t6 b* v; R- i; q! i
return (0);
0 K# A' [# E+ i3 o! e
}
7 Z, N x @0 U; ~9 X
, e: H/ G" J4 M& m% _# W6 Q6 W, i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& T) r, p6 K. G! Z
addr = base + cnt; /* pointer arith! */
! s$ f* D. |& C5 C( M" |
val = *addr;
! V; I4 {. T! D# x8 e
*addr = save[--i];
( z* @( Q6 y+ d" s% H
if (val != ~cnt) {
2 K$ K# t5 y( z8 [
size = cnt * sizeof (long);
9 H: D. n% z; F6 i7 {
/* Restore the original data before leaving the function.
/ ~$ i9 e/ Y% n0 C3 x6 {* }
*/
( K) C8 a- u8 `9 z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" i/ p/ Y/ N% b8 U7 W
addr = base + cnt;
1 _$ \: M3 R0 a2 |9 M# d( R8 Z3 M
*addr = save[--i];
$ v, \) ~* N- V* u& X8 N$ i
}
4 H7 {4 z, B2 Z! V: T) i/ k
return (size);
5 B: [0 o4 B" o/ A
}
9 ^4 y7 m: g* s
}
* ^5 m5 H3 _& [ K: a# v; h
2 h1 h- f1 Y! y/ i! c$ r3 b
return (maxsize);
2 d! ?( _3 e& \; i+ C# d8 P
}
4 V6 p) \; v; E* b |
int dram_init(void)
, w5 a5 [$ G* H5 \9 A" y& x
{
* ^ ]! u" T8 \8 V
/* dram_init must store complete ramsize in gd->ram_size */
2 e# X( w8 S) {! `5 Z
gd->ram_size = get_ram_size(
( H$ }) h. O" I$ d/ E2 j+ _0 ?; i
(void *)CONFIG_SYS_SDRAM_BASE,
( J2 a' Z5 ?+ \1 Q# s$ ?
CONFIG_MAX_RAM_BANK_SIZE);
2 i7 {4 h7 k0 }( ?6 I( i
return 0;
4 q7 r7 M; ?" q4 ~. t# A( U4 ?9 M
}
. r( q; W. d8 o" P
! t" j$ Y4 \ Y
. h& M* B* g c- l8 T7 F
1 o" L/ ?7 e* [8 a3 M
6 o" K- ^8 J4 K w* C" _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( X3 R8 ?, o: d# O
, x: ]! h; n+ U4 {$ p
T/ `1 Z- ^$ m V. Q
6 Q$ Q- D6 L5 s. J- u
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4