嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) ^7 |; p7 {, S$ L _
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ v+ |8 T. s# b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 b/ y- q- y Y( g, \$ R& @
, O7 T! A+ F% n3 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
v# ?& G3 p3 a+ M
4 Y$ U1 ?: a4 Z, `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ k H/ y9 I7 }
/*
; J4 j; H5 [: S- V/ B! x9 W
* Check memory range for valid RAM. A simple memory test determines
4 E8 F2 A$ j+ ]6 h
* the actually available RAM size between addresses `base' and
. \# I: ^( P% f
* `base + maxsize'.
# r( L/ J/ k/ N/ f# G/ O
*/
4 t2 y( ^4 s; o6 ^: r5 `. L
long get_ram_size(long *base, long maxsize)
# M: u8 ?( w5 p
{
: @4 o8 r2 Z. C- Y/ z R
volatile long *addr;
7 T( R$ p, t( u7 k1 w' e, N
long save[32];
$ D, _/ Q* ~8 `2 t* F
long cnt;
0 P! P+ M+ N" f; q$ I% k
long val;
$ b: Z! i+ ~- U. b5 n
long size;
. n; @, B$ K1 u: [. _
int i = 0;
) F. K( }; W7 M# D) ]7 F/ N; r
" T, k" w$ Z6 p, H, m) Q+ P) t/ k r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 S) A4 Q2 W a* h# c4 {8 R
addr = base + cnt; /* pointer arith! */
/ _2 u% \* T: I: R- O' S2 v
sync ();
3 N1 r3 V0 H$ Y! q" P( n+ O9 ?) C
save[i++] = *addr;
- N" ]8 n# \2 C) k! N& u
sync ();
; A; n' u/ u) E; ]7 n3 A' |. c
*addr = ~cnt;
9 G& [5 z2 W4 M* F
}
& I! Q$ v. O% M4 ~9 U
E9 |( P. S: k4 G- t
addr = base;
' i* \$ y2 U6 W: x/ ~% ^: N; Z" g
sync ();
# R, w& B6 ~5 h$ [# B) [
save
= *addr;
; O- G9 S# s6 L- Z2 Z2 z
sync ();
! B1 I b- \( O# ~
*addr = 0;
. q4 q2 Z' j( [' }2 g" P- m
" U+ r2 a# }- |5 R4 T: x0 o
sync ();
9 w- j+ M- V" {. q ]! w. j0 e
if ((val = *addr) != 0) {
9 i+ P0 @0 }' ]7 k* Z
/* Restore the original data before leaving the function.
1 B( w. y' u# Z9 K; Y
*/
% \3 [8 k& A4 k5 Z; P8 H0 ^$ }
sync ();
& k7 N% r- z) \2 U# R0 }' N0 g
*addr = save
;
: j2 D* p- j! P$ g+ J' d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, Y3 u& u& _, Z; M
addr = base + cnt;
, o6 J8 ?6 m; z# z
sync ();
- N( r% w0 g7 G) k
*addr = save[--i];
# L8 O6 c, ?! n" ~
}
( M0 n; R4 Y0 F" y
return (0);
1 _9 b2 A7 d8 ?% x
}
3 L& _8 e9 R [% h3 I
^# M9 N" ?9 M' K3 T( o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 ^6 r8 ^- t: G* I4 W
addr = base + cnt; /* pointer arith! */
3 a1 _* w- S1 i; E" I4 V
val = *addr;
" F! ]- _! t9 m; D& y0 L1 y8 I
*addr = save[--i];
" }8 m5 Y' ?5 K% \
if (val != ~cnt) {
( \! M) V1 }* u5 i
size = cnt * sizeof (long);
! r4 H! R D* A: p1 ?9 F
/* Restore the original data before leaving the function.
: X7 U( [* u. H& |3 |2 S2 ~
*/
4 i2 p0 x0 u$ f+ M6 I1 u* Z! r% E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 s0 h! J% s$ t4 p0 m
addr = base + cnt;
. I2 Y" ?. h# d6 i o' l
*addr = save[--i];
5 u/ c8 r& ?! r1 l d& e
}
- H' l7 @& b8 @% d! G
return (size);
a& @ ? e& x7 K0 p2 {7 S4 U7 l
}
- D/ B* \1 R7 ]0 G$ g' m2 v3 F
}
* ?0 b+ u- e5 [
. n2 A; e/ o. i) O# m
return (maxsize);
! k0 s, Z$ ~, x, v; I
}
- E! \; Y# P/ r, R3 ]
int dram_init(void)
" R& @! a9 D* i) h7 k0 F# F
{
8 n# [' {1 v5 z2 i' Z- i5 g
/* dram_init must store complete ramsize in gd->ram_size */
- I2 N6 ~0 r$ f$ O" |
gd->ram_size = get_ram_size(
* B' j, L# N' ?7 T' Y) G
(void *)CONFIG_SYS_SDRAM_BASE,
3 X4 u0 ?0 H5 z2 V0 ]
CONFIG_MAX_RAM_BANK_SIZE);
6 s, b) E! g8 }6 I3 e
return 0;
9 G* q) L( g/ V6 X. r
}
" Z, H4 X; M9 [7 m8 I2 M8 n
. x0 U5 \* f- K" A! a+ \
* I# l4 d9 } {3 L
3 t* d- @5 f. \9 g+ ^) g1 i( R
& b' t# p5 s; h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( J4 y( m1 F2 k: o. f1 O# k6 U: Q
+ k- f2 L- t, I9 |
: p. x# @# c0 }- L: G
. D: W3 q9 f7 G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4