嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 K2 t) i3 H/ @( A5 i6 R4 z9 t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- N! l' C/ |9 O+ i4 Y; J0 H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: a, j2 X3 x8 [8 Q0 `2 D0 E
5 p: p- }* l/ t$ f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 U* C8 r _" O: \0 M' r# K% i3 @1 L
# @5 d0 L. \1 d/ S7 o# S1 ]! r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* I( T2 }! K& p! }% F5 W. m
/*
1 q {& {7 ? z1 O* z
* Check memory range for valid RAM. A simple memory test determines
0 w5 l0 s* q, v& Q! x# V
* the actually available RAM size between addresses `base' and
- t9 Z4 l6 _9 Z- x' \! \; N
* `base + maxsize'.
M3 d$ `5 N( o/ @% G2 n
*/
, T: u0 M) u6 P8 j$ X& f# m
long get_ram_size(long *base, long maxsize)
, t0 l4 ^* Z1 p: _0 }+ O C
{
7 i7 a' A& Z5 K+ D
volatile long *addr;
& Q& B, d! w/ {/ X1 j) N
long save[32];
( P1 S: q4 ]- \) @3 B
long cnt;
2 Z; R* U5 U2 B+ X& `
long val;
* j# j a( ^ O9 T; T( P
long size;
1 M0 |* M3 M) b* [; u. d" [
int i = 0;
7 V, m$ c; }/ Y. b9 O
) c" ^5 H; [6 @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' w1 P# o! \, _8 T
addr = base + cnt; /* pointer arith! */
, i2 o# ^6 V s5 d5 V+ h4 [
sync ();
# N* g6 U8 B' g; G3 R7 T
save[i++] = *addr;
7 c3 A, l2 v' ~& [: R
sync ();
4 d! x2 o" w: o8 O
*addr = ~cnt;
8 W! I, ~, h0 Q: j( p- p
}
' E9 g3 `3 O% r9 n$ l
% ^4 F# t) Z# n- g% C
addr = base;
* t) b' D( [3 {* [. q- `7 x
sync ();
3 k% m( X$ ~# M3 I: `: w
save
= *addr;
) h) s& [9 G; V7 _% s
sync ();
& x: U% x2 F; M
*addr = 0;
) F1 d0 \% c X3 X% d, Q3 O
, x, ~$ s# v3 r5 `; E
sync ();
6 w% B( Z% W' P% x5 V; p, Q7 h
if ((val = *addr) != 0) {
7 x/ D, x7 L3 v) |1 P7 ]$ ?
/* Restore the original data before leaving the function.
8 K) [/ _) {* u; @5 h5 T& I, G
*/
G4 z' E6 S" f5 _
sync ();
8 M+ B! [% b! q
*addr = save
;
: Y' F9 s8 w. e6 c( E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 ~5 ]5 \* ^% o$ l9 M+ X
addr = base + cnt;
7 I9 \8 a2 m+ j8 d" @' K" l# Z
sync ();
* C2 W3 ?- R! n$ u* Q2 w
*addr = save[--i];
- N! g5 F5 W$ a7 {# W/ {
}
% R% {' Q! c( c/ h+ b5 I2 w
return (0);
$ j, G5 N3 M1 h% z# H
}
* J4 G7 k* h; P, y
3 K: K: W: @3 j$ o! i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; P- {: j3 R4 o: {
addr = base + cnt; /* pointer arith! */
& f3 z3 L5 A: i; w6 \& q9 d3 r3 Q. J
val = *addr;
7 r& ?" B- I5 D; S! y
*addr = save[--i];
% G [ o7 Y5 u4 U, }! N% E
if (val != ~cnt) {
; A; ?' U) q9 A5 E- e) {9 u: L" C
size = cnt * sizeof (long);
! r$ F" N& y% M
/* Restore the original data before leaving the function.
6 L/ v. Y7 f3 f5 z8 b; }; W- V. K
*/
; N: w% [0 |+ Q/ K% E& V1 ~, Z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 T7 L% k! C. w$ L8 y
addr = base + cnt;
1 s* \4 d3 J0 T. ]9 q* f' }1 Y" Z, x( R
*addr = save[--i];
1 c; G' _7 D3 ^% [& c% J& p3 @4 K
}
! j- d- }2 k4 N" [) H. x) |
return (size);
. Z9 P5 s; I. ?' _4 P5 V' t9 ~3 G1 l* B
}
, k+ \2 L! l" e3 ~$ S$ N! U. w
}
# A4 c& n V4 g5 @/ ~: O
4 R h- g* k! w7 n# E" i" y
return (maxsize);
" R. V l" ~: Z/ [! A0 T
}
& v8 q8 B- Z3 V4 \0 d
int dram_init(void)
# A! j. x0 R# a
{
2 n6 I& A. D2 _, i* D
/* dram_init must store complete ramsize in gd->ram_size */
+ [9 h& p( A% y" N7 K2 k
gd->ram_size = get_ram_size(
' D" Z$ E+ O1 z8 D, P4 {# G
(void *)CONFIG_SYS_SDRAM_BASE,
: Y0 O+ e& V. s
CONFIG_MAX_RAM_BANK_SIZE);
- ~% w) m% c) R- N9 F0 m2 _
return 0;
I& w$ ]& [! K7 R7 g/ \" h6 o# x# @
}
! k9 a5 J2 U! [
* r' _5 X2 E0 l- L1 u! \' k5 y
, `9 t- c: @1 G. B
% S& T2 E6 c5 O8 w7 p/ e
! |4 l" t( P8 U5 J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ [( q! ?; ` [( c5 e1 b
g* e$ z4 G D/ T/ v' Q6 m* c& e# x
) I. R; c4 p% v6 i" |) ?8 ^
" N8 }. [6 k3 E' E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4