嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& |! z) }" V5 I
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  ^! D1 B0 p; u/ s/ ^& u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- B2 c7 {6 j( Y5 N7 y( S
- d9 R/ j: |$ W7 ]是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 A0 ]* P6 O  b9 q# [: y$ _! |/ n# u

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. a) ]0 s! ?$ N" W5 a2 Z' K" e. Y/*) Q2 c7 O% v* R3 Y% H
* Check memory range for valid RAM. A simple memory test determines
1 i6 `, R& ]& g! e0 U" n2 w* the actually available RAM size between addresses `base' and
% d- t+ Z" N( v: T3 v; w0 M1 |7 i* `base + maxsize'.7 L+ F( v& k/ T+ m
*/
  i& B: G3 m$ m4 D' @6 jlong get_ram_size(long *base, long maxsize)* @/ H8 c3 O  L* S) w
{4 w+ F; L- K. j; H
        volatile long *addr;
) B( ?2 x' p/ Q# a. d" e' @        long           save[32];3 y! _* N% D$ z5 _: A" S9 T
        long           cnt;
3 K& x6 c  x3 c$ z* \4 K        long           val;
6 ~9 M8 j7 D8 [$ W' Y; u$ t8 d        long           size;
& U' p: Z# g" L1 ?* ?; Q7 Q        int            i = 0;9 u& X' R; Z2 c
: u( g/ V- N7 `0 o+ `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 {" G; T) q2 y/ t1 j" f: N5 F6 k                addr = base + cnt;        /* pointer arith! *// g" v/ Z- ^4 t/ |& E3 q
                sync ();
0 R  E+ p  F6 u& ]# y, f2 K; A5 c2 j                save[i++] = *addr;
( O( h2 }3 X% T! M3 [0 Q                sync ();
1 z$ V: d4 ]2 w+ X- S2 i/ _                *addr = ~cnt;
% w+ d1 L2 C# q( D$ p1 t5 S; v8 ^# S        }4 H7 i+ ]1 S) E2 f2 [+ y

8 G! X0 t, R6 j- W9 O& B        addr = base;
8 M4 `( n( h! X1 [+ g, E        sync ();& u2 }& b, h& s; l' P8 v3 r
        save = *addr;
8 o+ M+ q$ l: F6 h  P& X# }        sync ();
, o6 _0 d: |5 G* A: L        *addr = 0;
% u. [5 P# e: x$ q: f
, v$ G! }. W$ B- P) m, s, ?% }        sync ();
+ o& w( \( ?7 P        if ((val = *addr) != 0) {2 d) Q  h* b4 _" t0 A8 d
                /* Restore the original data before leaving the function.
- O0 y' b: R: W; x; e4 ~                 */4 {" i( B$ [7 N, i, C
                sync ();) m( I$ r7 \- i1 @6 w2 R) {
                *addr = save;$ v6 a$ P0 V/ a. e9 {  O" T# N1 u
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 _( j% x5 |1 r                        addr  = base + cnt;
6 A# W) E, W; S6 \                        sync ();
3 A- h# M! f* |" t8 [                        *addr = save[--i];
: g& M: e" f* I7 G3 t                }
  H  W. v( z4 u% c* @! i$ s2 j" u                return (0);( h+ x- j% R" n- N  o5 O1 H
        }
2 L; v, e, [7 W0 Z6 _+ d' |. M/ F$ @) P& w, \
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 [) [( `  t5 N" m                addr = base + cnt;        /* pointer arith! */
3 e  x8 D) P9 {( g0 X1 Z; T$ p                val = *addr;
9 ]5 P( F: \5 @                *addr = save[--i];) X- B; v$ i. U* m$ l" q; T8 v- J
                if (val != ~cnt) {
9 o4 B$ Z" I7 A4 i: V0 r7 C- |8 x                        size = cnt * sizeof (long);! F8 D: k9 [1 j! e' e3 g# |! n
                        /* Restore the original data before leaving the function.
( [  P3 d0 ~9 f% R6 N                         */% F% n. {, N/ h" ~) R
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& D1 W  w0 w7 N2 J5 Q, e. U+ T" n; F
                                addr  = base + cnt;8 _: |  N9 Q8 {8 ]3 m. h
                                *addr = save[--i];
, P- q4 h9 E1 p; S) l: v8 w0 Y2 @  K                        }$ f' K. \0 @; Y& j
                        return (size);
! M' p3 t( Q" b% i" _: o0 l2 L$ h/ k                }& l2 Y' n( b* B3 X& K" h0 c
        }" j% J& m0 [/ X! F1 w0 l

0 Y9 S5 o+ U" `) @* T! _3 F( c& s4 U/ p        return (maxsize);
; b# r* R' w' E5 y  M1 l}1 C/ K: E# E) v9 j, S% G: v
int dram_init(void)- S' z& p( _/ T4 ^2 _  L
{
; Z# |2 X) @- n1 {! I; V0 L$ z0 @        /* dram_init must store complete ramsize in gd->ram_size */: W3 a1 p$ e5 s! {! W8 r. Y  K: u
        gd->ram_size = get_ram_size(2 U* t1 i5 A0 d: o: [  u
                        (void *)CONFIG_SYS_SDRAM_BASE,
) \) h# K- ?% X8 a                        CONFIG_MAX_RAM_BANK_SIZE);
; K/ a4 J& `/ I, J% }( s+ u* {        return 0;& P; U' v! z; g1 s
}
& T2 z3 J" J4 C( A1 p; J
: U8 I4 d. A; g) W+ G" Z  P2 L1 Z: ~0 r$ ]8 k+ ^( O/ A- t! v
' Q4 w" ]0 I; ]( k3 N2 ]
9 I9 E8 l& e0 w5 Z: W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ D  q3 I+ ?+ d, \# p: c
, n% Z7 s5 k0 k) ^6 z7 K6 D

9 Y. n/ C5 E: C' p
" o2 h; ~9 Z+ x





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4