嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* F! W% S6 s7 @# p+ S
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# a5 T5 R! l' {- D. P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 s4 f5 K6 v4 j h# O3 n8 c
5 b: o" r( v- ~/ |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ n7 P: w8 i9 I2 S5 R+ Q
2 v1 E( M+ | M
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& |% @0 C& M( L
/*
& O9 l- L' Q% L7 {
* Check memory range for valid RAM. A simple memory test determines
# C: J+ r, O3 }
* the actually available RAM size between addresses `base' and
p! n: c8 d* B
* `base + maxsize'.
+ k2 t/ z# N$ H. e. l* g
*/
5 m3 c6 H& G& K& a" v, i9 |/ |
long get_ram_size(long *base, long maxsize)
2 ~) {6 `, j6 d- `5 S( b! |
{
2 l, m ]& Q; G" G: P
volatile long *addr;
& f# z4 ]& `% r8 H) f7 ]
long save[32];
8 K2 i! x! d( i G: V" L9 `8 L2 w. n* d
long cnt;
5 V [: |' q5 h( Q1 {( I
long val;
$ D/ k/ b# N' ]- p1 c! a
long size;
! _; Y$ V4 T" y
int i = 0;
/ B9 S5 W1 e s+ f4 ^5 I7 L6 L
4 [- F7 w: F% h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% r# ^( u' { t w( p- q& v! [
addr = base + cnt; /* pointer arith! */
! \# n. m, k) x2 j! D
sync ();
* I: b5 [- L9 y
save[i++] = *addr;
+ I: |# D+ `( O9 o$ x1 D
sync ();
6 z+ y0 q4 |5 L9 i7 s! S
*addr = ~cnt;
; Y( ` Y4 B& l# ~5 T
}
0 [& W5 ~% i: Q/ m8 O) V1 U
- m# ]! K* M9 \$ Z" G
addr = base;
& U5 w2 | @: v, p
sync ();
. y) q Q5 v8 u! { W1 | Q9 `9 B
save
= *addr;
+ X. ~' d8 q: X6 k! `# V
sync ();
" H% g; V; Y: s" c& C- r4 R8 f. j
*addr = 0;
* s& g1 C! t/ D2 v$ V) h# F
0 F0 J0 e0 y. z
sync ();
' E+ g$ n" \! m+ Y& M9 o
if ((val = *addr) != 0) {
7 s8 @: A( E# Q3 i s- Q
/* Restore the original data before leaving the function.
/ N% ?/ \* f1 F' q6 Z8 Z
*/
8 w) B2 o5 X/ s
sync ();
) O; ]5 v, E+ `1 g: t
*addr = save
;
, v' B5 A: w# [4 r4 Z4 _" [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
s1 o0 ]7 ^8 ]8 \ f1 e
addr = base + cnt;
9 t5 ?# z* T* a; \, l& d: r
sync ();
% l' l0 `- c! F- l3 l* ]
*addr = save[--i];
) x8 P0 ] ^: M( m* P2 }; M. x* f
}
5 f+ i$ @( u2 ]" g3 i. R
return (0);
* |+ K# e6 v. [! p9 `7 |% X9 w2 R7 ?
}
: W- Y; C5 K0 a% x) j2 @4 @
3 a% E, Z& f2 }3 P! t% ?/ s) {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 q) v0 ]5 R. C" t% W* q3 o+ C
addr = base + cnt; /* pointer arith! */
+ x$ m% y$ z5 Z! |7 `
val = *addr;
/ j2 M7 t' J O4 L& m0 i
*addr = save[--i];
3 V9 C1 {3 p2 Q
if (val != ~cnt) {
# B' K( F( o+ L& A$ k
size = cnt * sizeof (long);
: w3 D2 W0 [) r3 k& J; h
/* Restore the original data before leaving the function.
3 ^7 y! o: j: y
*/
6 k8 {# J# G8 ~4 J# F9 [5 _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ q" l% B4 E' Y# g6 {, T9 C
addr = base + cnt;
+ Y6 N7 l/ k6 Z' G
*addr = save[--i];
6 v- k8 x$ k5 `0 A
}
2 s/ a, c% l3 R( l: K1 M$ a
return (size);
* `* `( Y' K2 [1 m
}
, X, i+ Z. O+ f* T4 h
}
6 Y4 n6 H8 J* T( s8 Q
+ v& j4 V6 ~% ~' M( O$ ?: V
return (maxsize);
3 f- o4 ?. X* W2 ?- d
}
& ]* [" L( ^2 N$ r; K; n
int dram_init(void)
$ s# s( {+ r( R0 g$ k
{
7 Z/ X5 \; M. ] I
/* dram_init must store complete ramsize in gd->ram_size */
( [9 V5 f$ ^) Y: ]
gd->ram_size = get_ram_size(
9 R) o1 K' ?- y+ C$ P
(void *)CONFIG_SYS_SDRAM_BASE,
$ b" g* l' e# W4 m( ]6 M6 K- r4 K0 h
CONFIG_MAX_RAM_BANK_SIZE);
; ]" D+ |6 |% u( w0 d( n3 M* M
return 0;
C+ M0 ~4 q" h; S6 N
}
+ i; \) P. x4 ]
3 ~0 j# W" K1 U2 Q- O, @2 R" B' _
" U) X% L) I+ X8 U! P! Z4 G
$ Z; I6 x( h* U% d
: O# T# r0 Y; v4 u F7 z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# |7 Q$ U+ g/ ~" ]6 r
6 X7 m, [$ S& ~) [6 {5 D7 C0 U# ]
* Z* j0 a" V+ R$ H& k# {& p9 I
6 A. @* S9 W1 U" j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4