嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. E& e4 l. p! i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 G5 ]% q: U4 ?7 {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* @ y! {6 X3 `
- M6 h/ n5 z6 ^/ Q' d; P; O; B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- v) k- ~4 G) Z6 Z( n( C3 v
% J* n# h: g9 q" {
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
O0 J6 n* Z& K) M- A% E
/*
+ x( ] K( @6 \2 {! e( S
* Check memory range for valid RAM. A simple memory test determines
% ]* g: z+ \0 |2 ~( S
* the actually available RAM size between addresses `base' and
' k1 Z* Y5 }8 g$ J) k1 ]% |: U
* `base + maxsize'.
# A" b7 U& n: r$ U
*/
7 r9 x6 {+ Z! K6 N
long get_ram_size(long *base, long maxsize)
, x% ]3 }2 z0 O. e
{
( L! j4 v4 Q! [4 ]: g
volatile long *addr;
6 i( z* _4 l, a. k. e6 e8 q1 J4 J
long save[32];
1 `1 O. V+ W3 R
long cnt;
& K, Z5 r! P- ?% c/ P' l
long val;
" P9 i2 _! z3 S) D
long size;
4 c2 A# F* C. E2 |! z/ e
int i = 0;
5 R, v/ p+ z6 R g' N, i- K
2 x( M- O0 `, u+ I q( G: t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- ^( F$ s% D0 {
addr = base + cnt; /* pointer arith! */
; Y$ {1 P' d8 o. `
sync ();
! V3 ?7 b% Q. b6 ^3 H* y, B/ F( B3 P
save[i++] = *addr;
# g" B0 R' [7 r* ? ?8 }8 C/ F
sync ();
9 E1 `5 g6 C! @0 D: A
*addr = ~cnt;
S/ p5 v# Z6 }! _% Z, W
}
" w* q4 }# G' z. p
/ A1 y8 h. B% S9 C6 a5 a) i
addr = base;
- C* o8 S# s% {1 D0 y% o
sync ();
- X" o$ e% S/ {; N6 o2 ]) ]
save
= *addr;
# \! [) v3 }7 U" t3 w* |7 \( v
sync ();
- p8 r& v# _/ ]: l9 J
*addr = 0;
" n- v$ b1 N1 |; H, i: M. H
; s2 ]9 W* ?1 q; k
sync ();
& X |9 F" g* t, X/ {/ x Z) Z! `
if ((val = *addr) != 0) {
! N2 a2 g* _6 l% m: c f
/* Restore the original data before leaving the function.
* W: h$ p& J4 A, d
*/
8 L* y- x! g1 P! B* K
sync ();
, c, \ @$ t7 N: m7 [# G9 _/ S
*addr = save
;
* T' y% O0 ~8 B% l% U& A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" E$ f* p) x5 I( K1 U0 O1 L* w
addr = base + cnt;
3 D P7 t1 h* g) j+ h
sync ();
- D+ e9 A" {& m
*addr = save[--i];
7 Q+ h; u+ k% o9 w
}
; S6 R Y0 s, q+ E0 B2 Q K
return (0);
( v9 B% U* e0 k+ K' k
}
" B4 E6 |4 p8 t) ^* V
) b- T, s/ j& v, t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 l1 m \/ k. J5 C' I8 r
addr = base + cnt; /* pointer arith! */
4 R+ U$ {6 o5 }; c' y; i( g: M, l
val = *addr;
( y" X: A: E. @- c' G
*addr = save[--i];
1 A9 m; p5 g' X" v9 a/ D" \
if (val != ~cnt) {
/ x: K3 P( \! }
size = cnt * sizeof (long);
, Z+ S$ |+ C9 {* ]. M4 \ B
/* Restore the original data before leaving the function.
9 }" f4 ~! N: \
*/
) @( n: r" w) I M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: ]. L2 B- k0 b$ }" @9 H' G7 |
addr = base + cnt;
7 z, V' p2 ^" W: W' O" J) p& J, X
*addr = save[--i];
" p/ ]; G) j4 S: R& F
}
2 e/ s' m! n8 Q4 m5 ]$ o3 x I
return (size);
2 {' S6 D/ |4 L! o
}
. ]# D2 \) y+ P k" S. u7 {$ F9 x
}
% d" G' `1 d' _7 b, _
, c3 X4 o" ~8 C e/ f' u, f1 {- N( R
return (maxsize);
0 v$ c3 d" D1 V9 k1 Z# J9 a2 z
}
* {' @6 M, i# c+ A5 I
int dram_init(void)
1 Q; Y* L* T, i; [. e, O' i/ m* x/ j% i
{
4 Z9 W! X% `' C. w7 d
/* dram_init must store complete ramsize in gd->ram_size */
8 H1 P$ T' B5 O* T
gd->ram_size = get_ram_size(
: g C( @% n3 k3 E W; C6 j
(void *)CONFIG_SYS_SDRAM_BASE,
: J: n, B# B" |3 x
CONFIG_MAX_RAM_BANK_SIZE);
$ e$ Y5 \/ r+ ^5 }: g0 ?6 t# I
return 0;
' X; Y) A3 _/ i6 D8 X3 T
}
' U0 `3 E1 k g" \, W
2 S/ z6 L' U, V6 B
* N% Y0 H$ i9 C2 g
$ C' L3 S. ?' _) O, c1 [) `
3 E# A$ u ?! \; w7 M# }& q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* K3 m( l! o+ X+ }' h I* I
d' [1 v8 C$ b/ r2 \" l+ P' r) @
' {* E# J& M( f& a% h, W- ]
: h' f" n' V9 T( q9 @
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4