嵌入式开发者社区

标题: 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' and3 I, l: G( a$ g
* `base + maxsize'.
2 r4 h! e$ ?4 g# y*/
& `' e. M" `* D7 {" vlong 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 Hint 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 k4 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