嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 H# B, h- f+ Y' x" U( w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ K) s' u9 P% y* R8 r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# y3 k; i# ]: O& m
1 R) u) L5 n* x& C+ j& a9 z5 i6 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 f1 D- M( W1 s
& @6 ~ Y; F1 m( V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. w; _ b. ?6 F7 Y" D. x
/*
6 |# P' n1 x2 U) e& a. S
* Check memory range for valid RAM. A simple memory test determines
7 b3 M9 Q _+ k# M* {5 L. x
* the actually available RAM size between addresses `base' and
6 F1 a5 Q; w/ i+ n' d7 b6 d$ S
* `base + maxsize'.
7 {$ V5 _2 i, m# x5 a, \% d# R* n
*/
. [8 N: J4 a2 L
long get_ram_size(long *base, long maxsize)
: o9 i: {( ]& E* h k# n8 w* F9 a
{
+ @# A& \2 G+ L) s! t( P
volatile long *addr;
# p; |; B- b G/ ^
long save[32];
4 y/ G; [( \! b* N4 R
long cnt;
9 y( ^, ~& X7 U9 h( z
long val;
& s6 q$ I: A% W4 f+ w
long size;
/ d1 [ }; N3 }2 U0 m
int i = 0;
) V. F3 m" Y8 W: a$ D$ ?) c! X
5 }/ f6 v! Q/ a! p" u( {6 ~6 A
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: q2 F8 J. u& @# R# I) X
addr = base + cnt; /* pointer arith! */
; j# Z4 i ^& E( ^; `) k) t
sync ();
8 `* w/ o- N$ f: L: C
save[i++] = *addr;
+ k7 z; P% e1 x- K& G9 E; R
sync ();
/ }, b& P! Q J/ ]
*addr = ~cnt;
. S9 N' \1 E5 i' V" t% t$ F3 ~7 g* o9 S
}
K: m& G7 O; o% I6 R: }
/ g9 `& E9 H( ?2 w' h# \( n
addr = base;
7 t; f- f D; T' T5 p |
sync ();
. W* j: ~) `2 F1 W, W7 K* R" p* Y8 B
save
= *addr;
|; V- o- S5 P* N8 y
sync ();
$ P0 I, J( C8 N z7 }! K& P
*addr = 0;
! d$ a3 C- W' ^ ]: A' W
7 l' o# O( c! i- J4 f9 A% e0 c
sync ();
( X: w, R( ^$ s9 r! P8 ]! F
if ((val = *addr) != 0) {
) R9 r0 @; K9 y- s' V
/* Restore the original data before leaving the function.
2 w) t! \: j' G* I7 E2 t G
*/
8 g. N1 t6 L6 o9 i
sync ();
# m6 [$ r+ A# A2 Y" W/ \
*addr = save
;
% M8 e1 r% s' Q2 d% h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 A3 |$ i- h0 s; ?$ l. m/ \: H& B
addr = base + cnt;
: B: {: `: m, \6 f
sync ();
% A; A; v7 @( l: Z! v) |
*addr = save[--i];
# J9 Z; X, ]; q- W& e
}
; R$ X0 M7 [9 ~. ~9 Z8 f+ b. I
return (0);
8 R) U* c7 K: J3 ?
}
' V9 T i- b, D$ l/ ^3 W' `, C; e
, K$ K9 B9 r4 \. |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& I( m W* t4 p4 {* Q* w8 w
addr = base + cnt; /* pointer arith! */
1 R& J3 y$ s8 P% d: t1 _! O# J
val = *addr;
7 \; y0 ^5 g: D* T5 L: d6 e2 P
*addr = save[--i];
' L7 K" } z, y$ Y- Z
if (val != ~cnt) {
( _, O0 R/ Z7 S
size = cnt * sizeof (long);
, L V7 N! F" u# X' O+ T& w4 ^! E( \1 B
/* Restore the original data before leaving the function.
6 B% H( i& e0 g: S" I7 Q
*/
& o1 m; V; B) x" [. m8 R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, f* \6 e1 T# w
addr = base + cnt;
5 y. W( w6 r2 k* n, Z
*addr = save[--i];
: ^$ f# W% d' H/ V. ?
}
6 ?5 m1 B3 F. q' ^4 o& ^
return (size);
, w: p: {) u9 t: k
}
h3 _! s8 m. q) k6 i; X
}
$ q. v5 z2 L4 m, r1 x" ?
7 A/ F" x9 a2 N: {; H; Q4 g; y g
return (maxsize);
: y* C! s# z8 D5 _! d3 q: K
}
" x8 {: U/ N8 o/ Q# J
int dram_init(void)
6 m; V; x* N, l
{
$ l, E. |: |- g! \* A+ j9 X
/* dram_init must store complete ramsize in gd->ram_size */
0 x( K" v0 S' B d# Q0 g
gd->ram_size = get_ram_size(
& M" @9 |- U3 t- l
(void *)CONFIG_SYS_SDRAM_BASE,
( ^5 d C6 a7 w0 Z8 x6 C2 k# R% p$ g
CONFIG_MAX_RAM_BANK_SIZE);
6 j% J, I# g% x1 G E1 G1 S4 w
return 0;
) c* E1 ` z) o& _
}
7 V1 f+ p! i6 ]. [$ U% d
, h' }" z4 a, k- F3 J* D9 M8 \, p
3 \% k9 S& {- \ X3 X& f$ i# U
% y4 ]: H- p( q7 k1 I
* |. p# `$ M9 k; V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 ~3 I3 b( l+ A, A0 H
/ B0 Y9 I/ `+ N2 O* V" g: D
! `; \; h- t6 i" h7 l) S& E% W
& h* H# B! K4 Y5 i! ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4