嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 G1 a7 w. m" F* b- Q$ \! z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% L, n! o; J& n" m7 x6 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 w2 m- i7 p l. Z( {
* h! U. j" R; {1 [1 A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( R. W; |3 L* W/ z3 _7 H
. F; H% j: g1 g$ h. M9 q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. J9 a3 s9 \& L# B5 h; F0 N8 d& Q
/*
* `8 q9 x* b3 L( b
* Check memory range for valid RAM. A simple memory test determines
: B! b# S! ^+ G! k$ p2 _
* the actually available RAM size between addresses `base' and
6 @ ^7 K3 B. x! |+ E$ y# W* @
* `base + maxsize'.
2 A r9 m) j- j! s: J& g9 n
*/
5 C3 N: H9 @0 J k8 \& y7 k
long get_ram_size(long *base, long maxsize)
4 w& [! \5 e! R
{
5 P* a0 n. C% ^1 f* i3 d0 R# j
volatile long *addr;
2 j& I% w# `* _& \
long save[32];
. O5 o+ n7 z% b6 P
long cnt;
% A4 L+ ?! L0 Q ?$ i
long val;
9 a/ x3 ~5 n" O9 U7 `
long size;
1 a) r+ l; I4 \, g. \
int i = 0;
8 D m" Y9 m9 [4 s1 {/ n) S# ~
1 j1 M$ J4 L, Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ W+ n2 C* R: U1 b7 N' `
addr = base + cnt; /* pointer arith! */
( k5 q' P9 {. \3 W, r1 S5 c+ I
sync ();
" a9 U) ]; I( [7 L: g: P
save[i++] = *addr;
- z* P9 |7 g% [& t
sync ();
6 M% D8 a1 c6 O
*addr = ~cnt;
+ F- W- R2 {. F2 F& Z! c$ G% ]
}
4 v% k6 r5 ?' Q, E: ^, v
- S7 [' y8 M4 m6 A/ n4 L- I# h$ V
addr = base;
: y$ T2 @9 b% e3 }! J" F& T+ d
sync ();
, V4 @8 r4 E$ ?" j# o
save
= *addr;
2 t. q! z- N2 T3 @9 ]
sync ();
4 `5 z7 V% X1 k0 K
*addr = 0;
/ @- k8 j( m$ S& `
: |* |$ A# v1 S# U5 t E
sync ();
% M+ h- }- P- L. p
if ((val = *addr) != 0) {
4 U/ P8 O# ~; ]* `0 ~ s0 |3 a" R
/* Restore the original data before leaving the function.
* w( K2 ^8 _7 q
*/
c; _+ _/ e: ?2 n& ?6 B8 x9 J
sync ();
% O- ^0 s; X6 ?7 S \# a
*addr = save
;
% V5 V" N* z+ o n- T& G9 \8 z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. P$ c& g$ V% I! s0 ]1 M. w! l+ z& ?
addr = base + cnt;
9 f |' i# M: _- v X" l
sync ();
0 o4 V h' L. V' `' l$ K
*addr = save[--i];
. w" S5 {5 _1 y4 ]
}
; X5 B' T; M3 L0 V2 r3 @
return (0);
% M% R- M9 k% {9 a6 x# f
}
# Y4 ^5 X2 Z% P! p
: `9 z. T4 a4 ^0 ~6 d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 v* }" f$ }0 z: f9 ]& q |/ m' Z
addr = base + cnt; /* pointer arith! */
# U& y; P5 y, x) J: @
val = *addr;
+ X+ t0 k- v/ _& Z) a F
*addr = save[--i];
3 O! w! x( d/ h# ?$ f7 b0 _
if (val != ~cnt) {
- z6 U, |! R0 V' O( r$ g9 Q
size = cnt * sizeof (long);
; i6 K$ C) w/ Z
/* Restore the original data before leaving the function.
6 ~6 S$ V* i" A
*/
3 u& U) _ o- R9 H1 o5 p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 Y W# a, U. p w! w+ m! ]/ M
addr = base + cnt;
+ h1 Z0 i( S: z- d9 X; }
*addr = save[--i];
* T( J$ q# j- y; R& e6 ^
}
7 t ~: l! \, [. \' b0 h
return (size);
8 n0 Y" j! e5 z& o+ f2 J
}
8 S$ n% G$ k4 y! z
}
& U9 z. A2 U3 L+ L1 |% v
9 r( g: J" A8 Y+ j2 B
return (maxsize);
, T! L, Z5 t8 Y/ T
}
% c0 |, h4 @( [" X& j3 u
int dram_init(void)
5 S9 K' b" n. n& Y
{
# V S) K3 T: k6 v5 J+ z
/* dram_init must store complete ramsize in gd->ram_size */
' G c. U" E$ n1 l" q
gd->ram_size = get_ram_size(
; G4 ?& X/ J" x4 ^4 u
(void *)CONFIG_SYS_SDRAM_BASE,
u# T6 \ w! w& Y7 }# ~
CONFIG_MAX_RAM_BANK_SIZE);
0 G, t% }0 z: {$ w" ?
return 0;
" |, a1 J8 f: ?! I2 `; Z
}
z4 R: n- D) @$ V& e1 g
# M3 f) L, ^4 j- N& k- R% Z6 h. j3 G
7 u# _1 Y, |: M u8 ~
* K, S) @ k# v; w8 D2 E6 j; D8 |
* Z- @4 ^" L. R0 l+ d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. d/ i; |2 l2 P
3 s7 w' T) U% A- m
. y7 t S( b7 h- i' F8 I4 b
$ \5 b$ f& Z) ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4