嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! ]# e7 C6 R/ y) }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( {# Y3 ~( d) b" m R+ M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- p" p$ r( T3 c+ |2 [" d" r r
5 O a1 @3 i7 D3 D7 d ]3 {3 H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) V% S+ q, O- X* p
* e; @% l6 x- _ w H8 S9 {
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ u/ J7 O7 |! ]' O, B
/*
) h. ^ {/ |. A' k* K
* Check memory range for valid RAM. A simple memory test determines
& L, v9 g5 `$ i3 O) E% q
* the actually available RAM size between addresses `base' and
; }7 o8 S( ~0 d8 A0 V$ b
* `base + maxsize'.
5 ~$ ]2 f' V# W) v7 z" U3 Z( t
*/
, ~! b& v/ r+ j
long get_ram_size(long *base, long maxsize)
' e& d2 [5 a' [& K1 k' e
{
0 r; L4 }8 E' A
volatile long *addr;
' s& n% \) \0 T; q
long save[32];
; u' I7 Y* @+ \6 s: L; T
long cnt;
: d8 W+ H z. p- V [
long val;
0 ? W J/ Q! W- C2 K
long size;
0 W. w$ S0 G/ `7 R* _0 {
int i = 0;
6 c8 @" T* T- P$ C* i& {6 L6 z, k; R
( O0 O& H/ u4 r; a \7 X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! U9 o) J5 O- q* P6 W& u" p
addr = base + cnt; /* pointer arith! */
$ J& I: a0 ^3 I Q+ [% P
sync ();
6 y- M. w+ M7 V* m1 ?
save[i++] = *addr;
* k* Y6 e* {# F$ z. r$ T
sync ();
- e. B* O* D0 y O
*addr = ~cnt;
- k6 k$ v) s& \, G: h$ \
}
# S" W; i6 `7 c1 {
! ~( U0 n+ G7 J P
addr = base;
. I# r2 n8 V/ S$ P( F: @
sync ();
6 W7 [1 n1 R& N2 _5 q$ P) x5 Y' n
save
= *addr;
% r3 u% |1 M: D& V1 h( w6 x
sync ();
( ], |& c" v) i' ^( D: |
*addr = 0;
2 t w. i7 g( D! Q3 M+ K- p
! a: E7 p: h* V4 z r
sync ();
! {" N, B4 r4 \% D
if ((val = *addr) != 0) {
9 F4 w5 @6 a* l2 t$ ^# z
/* Restore the original data before leaving the function.
7 M2 }6 O. l( E' F+ ~$ n9 N& W9 O
*/
$ ?* a5 z I5 k
sync ();
% l! {! |4 _ U/ b/ a" W+ G
*addr = save
;
2 ^6 O! ~8 R* n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' O R. V+ K/ b
addr = base + cnt;
* }: ?3 r; d, a# I: M
sync ();
1 f5 O/ g" X2 H6 \8 _
*addr = save[--i];
' U+ s1 L) a( k. G7 X; ^/ h) `% l" F3 ?
}
) l3 {" v$ A; q5 B
return (0);
* f7 a6 N* U T2 j+ L
}
4 K1 E" ?0 c/ B! ~& p+ I0 b
; f3 K3 |, I$ z' {0 |- s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' k6 J' n3 D6 q, l
addr = base + cnt; /* pointer arith! */
# F" `% e( f# H& b
val = *addr;
+ O( w. v+ X3 ~4 }5 C; j
*addr = save[--i];
4 g9 x4 a4 n; J5 [- ~; t1 m& [
if (val != ~cnt) {
' o: E7 [$ X7 U4 }& B% K& a2 {
size = cnt * sizeof (long);
! k, i. n) o; o1 t; k c
/* Restore the original data before leaving the function.
* V( f" p: U Y' f4 \8 I d: |; t. g
*/
/ ~1 ~. Q* L2 @2 r d
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 H( b1 w$ ?2 x
addr = base + cnt;
0 V6 d: ^+ z! i3 s U+ Z! [) q
*addr = save[--i];
) [8 y! |; e+ l
}
4 F; U6 m+ e" m4 }
return (size);
( |4 O0 N" ~, r9 X
}
- Y( G/ F a( a, e( h* e2 P3 n
}
2 s2 z! K& W( H* r- K9 _; _
. t2 H: ?% i0 }2 c
return (maxsize);
' M. S1 R+ o3 P. E
}
7 p6 v3 j. n, y9 H5 v/ E# U8 f9 w
int dram_init(void)
) @: s6 s% F" Y% [, n
{
4 v$ Z6 g8 y7 N: A7 _
/* dram_init must store complete ramsize in gd->ram_size */
; z$ l D* g6 L
gd->ram_size = get_ram_size(
) H% A* X) ~: o+ S2 Y
(void *)CONFIG_SYS_SDRAM_BASE,
h8 x- F* {" l! O! F5 B" e6 S
CONFIG_MAX_RAM_BANK_SIZE);
( ~" q4 Q# @5 d5 n) q
return 0;
' w* M1 g) p# ^1 t( O" _
}
0 k$ e L( d4 x: t5 I% \- t
9 f, ]8 y( B' @- A* y! o8 g5 O# z& r
* h% d+ a+ }' }1 }) y
$ v1 P9 j% T/ @8 q
8 L- U% k9 U9 h* |2 ^- `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, i% U: K+ u* c' o
# b. y) V, \, W
% T5 C( _& _# U
/ [2 R+ ^0 P* P8 e4 L' S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4