嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% i5 p5 _6 u7 I6 c- c t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. E1 C& W1 T# d5 h5 y- t' U7 B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 ]" J, o5 ?, Z2 c7 [1 W9 x: U4 H( k
) L+ P9 A. j b$ V9 E5 J) O6 H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 S+ B3 U: u- [ A4 X* e
% i5 i6 R: y( @4 {7 ^6 U& J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( G, J( S% j N$ z6 T: g. _
/*
# e2 [' w+ k; K/ ]+ e: R
* Check memory range for valid RAM. A simple memory test determines
* i2 R- B* k* s% D$ r) x! W" V
* the actually available RAM size between addresses `base' and
3 I, l: G( a$ g
* `base + maxsize'.
2 r4 h! e$ ?4 g# y
*/
& `' e. M" `* D7 {" v
long get_ram_size(long *base, long maxsize)
; ~' b3 u+ G c' Z! j( Z
{
. k: `5 J7 o/ D& Z
volatile long *addr;
/ Q6 n/ V8 \2 r4 B3 w
long save[32];
; H4 {- r( P- M1 z* d
long cnt;
7 a& W% ^/ e8 O0 Q
long val;
% M8 a& O- R+ v
long size;
& z7 o+ ?5 A6 F% G7 w7 e
int i = 0;
o$ I; @& @, t3 u
8 f3 Q5 f: T" M
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ ^: l" V0 |6 j5 q0 f) v
addr = base + cnt; /* pointer arith! */
( g# @0 q( @- ]# M
sync ();
" K0 n9 N6 L) d- M5 q T" M
save[i++] = *addr;
; r8 ]' O0 b6 a) f: G' N, S/ }# L
sync ();
! m$ ^) K" y" a* i) X7 c
*addr = ~cnt;
( V) X2 i3 B7 b
}
- Z& a& L& b# G' G1 B5 [
) C& K4 t. f6 ^/ r' c2 }% P- d. A
addr = base;
. v2 ]& @4 t! P
sync ();
; e( L# N9 n9 R# ^
save
= *addr;
0 x9 ^' Y( s" u; G" y5 T" o% I
sync ();
2 U7 C0 |; w/ Q! X, U7 a3 G, d
*addr = 0;
. e, { j; C8 D/ e
# {% x% f* X4 H4 W6 z& j
sync ();
* A9 a, ~: `+ V) b, {# a% w7 `1 q
if ((val = *addr) != 0) {
# T) o, m1 Y# i: v
/* Restore the original data before leaving the function.
O# C8 X1 c- G& X3 _+ Y
*/
5 }9 p' |6 t2 E( z
sync ();
3 a5 c. ^7 ~/ B: e! `% J4 U% [+ W
*addr = save
;
$ y7 m) X+ A: Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, O2 c! A, U) ?0 H
addr = base + cnt;
/ ]6 ^: j7 V) u
sync ();
& s4 ] N+ a# ]4 O/ R6 J
*addr = save[--i];
; p7 v& {" C6 |& U% ]
}
$ p9 F, c) ~1 d3 N; n
return (0);
. p z3 T- J# v, |' |5 {/ c
}
" b2 R9 e! F2 s1 h
; v4 d- Z. [' m8 C( w* k; W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; B; a* }4 u& v9 e4 O
addr = base + cnt; /* pointer arith! */
$ S3 T# o/ E K2 n1 y+ E' B- R
val = *addr;
# k1 O" P" U3 A c7 ~
*addr = save[--i];
# H3 O+ g7 S* x$ b
if (val != ~cnt) {
* B9 N$ G' L f0 V7 x4 z4 }
size = cnt * sizeof (long);
7 e$ O2 k/ `* F7 K; T4 ~; s, x
/* Restore the original data before leaving the function.
- s2 I8 e# A, G0 {- [0 I% A A7 g
*/
4 O# g& t+ h, ]1 p# s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
_# Q8 p% _' E8 p/ e
addr = base + cnt;
+ W; a5 B9 |' w/ i4 g7 L8 H; |3 u
*addr = save[--i];
* y5 {# s( K9 X' p; j
}
/ C( A2 G8 C) ^3 k
return (size);
* [9 N" v( y) O" o
}
- e( @! s& c b1 r- ^. V
}
0 F& _% K5 V% R5 f/ M
: L( O. U/ r' k* |+ y
return (maxsize);
4 N4 D: l5 ]3 F$ A# a. \8 s. v
}
' w# M" N0 T% ~5 H
int dram_init(void)
7 Q/ t- Q# W. X4 ~# L
{
/ Z& d9 e4 s% V% {: N
/* dram_init must store complete ramsize in gd->ram_size */
- R& d3 v! l3 f, p" z2 {$ H$ k
gd->ram_size = get_ram_size(
6 z; E& U5 h, V( L/ [. B
(void *)CONFIG_SYS_SDRAM_BASE,
9 `+ D8 t; p) `; C, y$ M& S
CONFIG_MAX_RAM_BANK_SIZE);
# Z1 k/ Y: S0 l7 i4 G
return 0;
! }" C, }: r& _' Y7 l
}
6 Q! A9 _0 J/ w9 `7 _( \
8 [+ z- S) l8 k. ~) A/ ?% U
0 n% h; F7 X8 j4 W
" {; X0 H9 D& V# B4 k
4 s& h; J6 T) z6 c* ^/ t! v0 R9 Z3 G" P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ J* Z+ j( K9 _# [0 Q# y
( H- T2 x' y$ i8 j
# D; f( r5 s; e i* O+ A
( ~2 A) w% n1 [* N2 U! B
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4