嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
O6 Z3 L# q* T; H; U
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 F5 c# {; T L& S% H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 i. b% D$ F4 K; A0 A0 A$ I
/ u4 V7 j/ o/ j$ I$ R- c5 _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, _' U0 B$ H4 b8 O/ l$ y
8 R% o; y. T9 b* V3 ]1 v* c! Q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ t' F. {" S9 w+ g* {
/*
$ ]; v/ N9 P) m0 }5 d9 o
* Check memory range for valid RAM. A simple memory test determines
, H5 p) Y8 V3 G, P/ u- X
* the actually available RAM size between addresses `base' and
& ~/ u9 e, H6 C6 @+ M
* `base + maxsize'.
" k ]% ?+ H* l9 a) T7 S& W! ?
*/
+ ?" Y5 [1 s$ H
long get_ram_size(long *base, long maxsize)
* a2 [8 M' v) ~1 F" @
{
/ H# Z2 o5 H: K A3 w; X/ q5 O0 `
volatile long *addr;
9 k2 ^9 O, K( G a* x- G
long save[32];
; |; s. i0 q& F V( T) E
long cnt;
% V( P! `" Z$ Y p+ _
long val;
2 P. v# I |2 N: ^" `9 g8 V8 l
long size;
& r) s6 U9 X, g
int i = 0;
4 E# v6 L) C; \
2 ?/ r7 f _. R& ~6 I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 Y* D3 [* V. x2 n& X0 Y
addr = base + cnt; /* pointer arith! */
9 g8 U/ ~7 R" |6 I# v0 E
sync ();
! ]* Q' x. Q; c
save[i++] = *addr;
2 Y. G6 i& X! e) ?7 @
sync ();
7 e* n, Q2 F1 W/ D% ]+ ?+ }- F
*addr = ~cnt;
$ X. P/ }# ?6 Q. Q* t- F
}
], \) b2 @& h
a4 a5 }2 t3 e& t
addr = base;
3 a' }3 f0 B/ X; a. K' m* }3 T {# g
sync ();
d6 X1 s1 _7 s( N2 `% g3 Y" d
save
= *addr;
b$ B6 `0 [$ J1 D4 V1 A
sync ();
; y4 Y S4 ^5 h( {2 L6 j3 j- v
*addr = 0;
3 f; m- n# u- Q* N- x- c
J$ }" X+ G- T. |
sync ();
7 p b7 {. S& q5 p, o
if ((val = *addr) != 0) {
# Q7 D8 D' ` j: I" }
/* Restore the original data before leaving the function.
' O+ f0 n& c( @! ?, ^
*/
2 J, S2 d' _( _+ t+ } n, [! y
sync ();
2 C; l( e, a4 O, X H
*addr = save
;
( |/ n4 W, s+ B. E5 a- I5 @, J' Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; _/ w4 }5 ]3 Y+ r
addr = base + cnt;
0 r0 O$ V+ _" Q- {0 d5 b
sync ();
( U4 J0 Z7 i' n- b9 O7 [4 h. u
*addr = save[--i];
& {" l: X V% \, ^; q
}
; g; {/ k2 D; x: N5 {
return (0);
; }$ \9 `6 a; h+ U$ s5 x4 u
}
& ]8 Q. L) E: p* C1 F
/ Q9 Q" ~7 e8 z; O/ C
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 V/ p$ \ k! s2 Z6 O R
addr = base + cnt; /* pointer arith! */
" ]; F% {1 A: U0 O! ^
val = *addr;
# M$ n! V [8 p4 l( i8 a( C; k
*addr = save[--i];
3 J( x: w8 E) v: P
if (val != ~cnt) {
6 }" J/ i* D0 N
size = cnt * sizeof (long);
9 s$ h" `) P3 ^4 }' ]8 s/ F# x. _
/* Restore the original data before leaving the function.
5 y7 R( X/ s* e1 T4 c( H( {
*/
2 G X2 c- q+ _, d! S
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ y- `1 p! C- i1 X% t7 t q& i
addr = base + cnt;
- M1 S |; c0 s$ ?& b
*addr = save[--i];
9 M) T2 G5 y3 ]8 u
}
5 `1 Z; `& M0 A4 b+ D: @7 t
return (size);
' `0 R+ v# m D; v5 J# D
}
9 k& O$ ` ]( C. v" t. q
}
9 B" w3 r8 v- ?
, q' D) H' _) G) { g
return (maxsize);
: N6 U% B1 r7 v; u
}
) {' T+ c I( ^' K, r1 Y# U0 H
int dram_init(void)
n1 K/ c, G' L6 ~
{
- c8 |, Z8 a' s, r' D2 ` O9 c* r
/* dram_init must store complete ramsize in gd->ram_size */
4 [5 `. _9 D3 _6 p. Z
gd->ram_size = get_ram_size(
( I, ~' ]- _" Y
(void *)CONFIG_SYS_SDRAM_BASE,
# y, k! v* K2 }( ~1 B
CONFIG_MAX_RAM_BANK_SIZE);
% M- C. i; w) a
return 0;
& G7 j0 U) Y/ d' c
}
! ?4 G; f7 j; w; p: R) Y
2 T* |) _# G( l, c# a
9 q1 }9 K8 \! ?6 Z `
2 x, i* j% K r" R8 f
$ E8 q' q; x- F3 K1 W- o" n, w' t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 z. _0 u! ?; G' A2 K |" R. `& }. t
% S8 {8 ?7 W0 h; O
U1 y% G: c+ P4 t7 G. ]
A, `" c3 q" [! N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4