嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 `/ {! X4 _4 G7 L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 l% c' U1 _4 D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( N H' P9 _. ~: X1 W: h
0 ~. S$ N3 F/ W `% p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 q1 q- Q; K% U
3 @8 J6 p7 j" j8 l V: Q0 V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ w W* `, D9 Y& J: l% g6 `
/*
6 h# ` O, ~: G$ g2 O% Q
* Check memory range for valid RAM. A simple memory test determines
" _4 r; l' ^) _3 k
* the actually available RAM size between addresses `base' and
) w K+ C4 B5 V1 I
* `base + maxsize'.
# u5 T$ l' |1 @. _
*/
2 ~& u0 L8 B/ l7 |
long get_ram_size(long *base, long maxsize)
$ [7 a- l4 n) h% y
{
7 f' V% ]0 b& n( F% \( L# Q
volatile long *addr;
2 l; @( N* I" B
long save[32];
/ X h7 P, y [! f1 n( H& a8 t
long cnt;
) T4 @$ F }' l' B
long val;
) I2 w; h4 J5 Q4 Z
long size;
& Y5 ]2 R! b# m8 L# r. ?; l
int i = 0;
2 x z6 U2 _( C% e5 R" t/ O U1 o
9 c& p: Z4 e7 ?) w8 F% g0 k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% i8 ?; I& d% u! v1 ~5 O) n
addr = base + cnt; /* pointer arith! */
0 s4 ^- i; B7 ]: \5 _
sync ();
$ C- c& K. Z7 N9 z
save[i++] = *addr;
$ U/ U- g" b. W9 l1 B7 G* v% M
sync ();
; B' p; Z! z: K6 Q
*addr = ~cnt;
% b7 u& A$ V$ R" K. ^ Z9 y
}
9 k0 l3 K0 \9 o' Z- R8 P+ m
. } q6 R1 m4 W3 O6 j& d( {
addr = base;
2 d9 g$ ^% \2 ^2 [
sync ();
4 L$ T5 z0 T, x+ R0 ]" }$ a! u; V( w
save
= *addr;
5 A M# w) \( M O; M1 ?
sync ();
9 C9 X9 ]' ? {
*addr = 0;
) q1 P% G4 V/ M2 H, X
7 ?" M; T2 L. c, C
sync ();
+ v, i) b' z [
if ((val = *addr) != 0) {
0 P O. t) ~! U g, J% ]
/* Restore the original data before leaving the function.
, h1 F; d: P3 k
*/
( d& g% j! Q3 q; Y j' m8 ]
sync ();
2 A6 o, D# j' b* r. M: \# H' `
*addr = save
;
8 ?! ?+ x3 g8 Y' h& F# j ?9 Z4 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. k/ Z% X q, }0 X! c/ a0 P
addr = base + cnt;
5 v, s, I3 ^9 b. [3 {
sync ();
( c7 e1 s u$ [9 t
*addr = save[--i];
- i. U H0 |/ h1 v3 ~ {# @
}
4 P% ~" S5 I: ~- n+ r* H
return (0);
0 c* B5 ~& r' i1 b3 p
}
- b4 Q1 B3 S6 L" q% r3 |
, A' o$ }+ r7 p+ u( U+ H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ i* F/ h' o$ Q! R0 I T) y$ m% P
addr = base + cnt; /* pointer arith! */
0 }! U2 }$ H, A/ g
val = *addr;
: C+ K+ f( v& ?) ]4 Q3 ^
*addr = save[--i];
$ V7 S0 L1 q5 E5 L
if (val != ~cnt) {
% }8 @# m- ]8 O4 s: \1 r
size = cnt * sizeof (long);
# F! Z* Q: x5 J
/* Restore the original data before leaving the function.
# t9 L1 K1 t# z5 _
*/
$ q% s* J. _( F
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 B: l% M' ?/ ^/ F. n; G S2 C8 B
addr = base + cnt;
2 Y0 N& ^; J' z* b# @) l( u
*addr = save[--i];
+ d+ R: r o( H$ L
}
8 S. y( A' \) y8 \/ z! n* A% R1 ?5 Q. s; z
return (size);
! @' c, D+ `; b7 H
}
b: o* Q" T+ c6 a1 Z
}
* V" B, f+ M' q
9 e! `: D& }5 F
return (maxsize);
& K5 `4 V9 O+ g; l! U. a
}
4 P1 r- n, f+ M" c( n2 j6 K
int dram_init(void)
4 I! L4 p. P* L# w: D8 r
{
0 @4 \; s- X5 x5 X3 A
/* dram_init must store complete ramsize in gd->ram_size */
& }9 b5 ^8 R/ f) R
gd->ram_size = get_ram_size(
- Z. k) f h# x( o
(void *)CONFIG_SYS_SDRAM_BASE,
5 P* R% W3 P; a: X; E
CONFIG_MAX_RAM_BANK_SIZE);
6 J7 h0 S1 o$ m* d
return 0;
! n9 z; [# F! X9 n9 ] ]+ z% }( C
}
5 z% @0 c1 Z, J! x/ b# U4 y
6 @" U5 W$ h) w( S9 b4 A3 S- A$ y
3 c8 f) z% ]! M: ^% U# E' q
Y2 Z: g( f% R* L# d. G) [% s
( B# I% X; ?, U! i( G% H# N ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
l1 d( f4 X8 ?2 b p' V" V* w
1 i+ F" U( T N5 M5 S C
! ]; T4 O& W# N+ z* A: A) {" R' ]
# ^0 A9 W+ v5 b2 U8 h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4