嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: j1 m# _! w8 m$ G# W核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 r+ l: h+ H! d! j, B# L2 F: k: P  H# }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 l9 E9 ~8 O) S# u- F7 p! X: @

+ `" V% I, v5 M: S/ P9 Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. {* T% I+ ^2 [  {+ H% K( k; j/ Y+ L

4 m" }0 V* Z7 {+ [  }* c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 a2 F' L/ s$ c+ X$ P* a/*8 |$ m" x# t$ b1 b9 t8 [& V
* Check memory range for valid RAM. A simple memory test determines, V- s2 y# W- g
* the actually available RAM size between addresses `base' and# I8 s+ d- u/ w0 S) _
* `base + maxsize'.& C( t. N( U8 d7 {. `% [7 F
*/
3 J$ z* O" M- u9 w* O* B; [long get_ram_size(long *base, long maxsize)$ J1 \9 G! c- |1 |$ Y6 V3 Z
{) q2 C* x4 z! y5 U
        volatile long *addr;
3 Z4 }7 E5 \5 f1 H9 n* J        long           save[32];
  `) _9 s+ a8 l1 @0 [2 ~" Q        long           cnt;9 j) `" W% i3 k' ?9 B% S  ]6 f
        long           val;% ~" o4 o# Q$ E7 W" u
        long           size;% }- N# G" F# I3 O9 y
        int            i = 0;+ ]1 q0 U. p* d: D" M
, p2 s" T: `0 I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" A9 u+ T7 N7 T' r0 ]                addr = base + cnt;        /* pointer arith! */
6 i: W0 V" A$ J6 q- k6 F: q                sync ();2 A9 ~- m8 c: h6 C8 t8 p+ }
                save[i++] = *addr;
% m3 k8 }4 s" K. E                sync ();6 C! w: b- F/ C: X; d2 j2 [
                *addr = ~cnt;, }* ]  M0 m! Q' [& K
        }
- l; X, ~  m9 U$ O2 b% j- r# n2 U' A  s* ]# M
        addr = base;
. u0 q+ y$ ^! [5 Y: P- C        sync ();4 Z# [' E& c. O8 G9 ?
        save = *addr;
$ d; E+ C& v; M& f        sync ();0 W% w4 {0 U5 }4 F" H4 _
        *addr = 0;3 N1 R: q1 X. y' ^/ v1 h- \

, X% @7 z' Y5 k# T! A2 _        sync ();5 m/ }* j% d0 L  G6 ]2 G
        if ((val = *addr) != 0) {
5 t) `/ J' i" F# d3 N" e5 @+ t. M& O- p                /* Restore the original data before leaving the function.
) Z- @& G3 y& Z; T. R/ ^  K" o$ }                 */
. W- |0 N& Z5 L# ?4 n                sync ();
3 V( D9 E+ y" c: H7 E, E8 |" ^+ Q                *addr = save;
; e  c5 [7 W8 g( p3 j2 @1 \                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, U" y) {# j: y7 D7 z1 m& E
                        addr  = base + cnt;
( _+ h9 Z* K$ n4 Z8 N                        sync ();
0 E) a5 V# i; N$ T" Q$ o+ w5 _                        *addr = save[--i];
2 E* g  [. }) S( A8 W/ m  X( v                }
$ F) \' h- q0 n5 L                return (0);6 C& i1 A: @% V( ~3 w+ L
        }
4 i. l( Z1 C% ~( q
' x9 d, B7 l1 ~# t        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 V* ]# @0 e( {9 O                addr = base + cnt;        /* pointer arith! */. f2 G/ q1 Q2 i* J% P! F
                val = *addr;
# g8 ~: f$ j6 V8 m; u  g  \                *addr = save[--i];- E) J; u' h5 ~/ A) H
                if (val != ~cnt) {  S1 R$ z, F3 t* t% ]( {
                        size = cnt * sizeof (long);
% T# U7 V/ J/ [- s                        /* Restore the original data before leaving the function.
# ?+ ]: X: k0 M9 s7 c: k  N$ S                         */
- u; S# ^+ O3 J                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( L  ]3 F& k8 k5 Y6 ]
                                addr  = base + cnt;  \# U, l  {9 k& |
                                *addr = save[--i];
- H- c: K! g' W" Z( j: A2 P! s                        }$ D1 P/ `$ b# U3 g) u+ b; g
                        return (size);
8 J. a) g  ?- O& |                }
7 f- a' ]. N+ s        }
; _; w9 L7 d: g" O; J8 M6 x) j* Z" D! @
        return (maxsize);/ S- u& R" F: w2 l) S& c& L+ e
}
  q( ?! b$ Q3 y; l6 d8 F  gint dram_init(void)
+ _9 P' i! t% i# I" F. F* e" \+ m{  r  ~, F; {, p/ M
        /* dram_init must store complete ramsize in gd->ram_size */! s# r4 W7 M- q; D
        gd->ram_size = get_ram_size(
+ h) |( i: w/ X" [                        (void *)CONFIG_SYS_SDRAM_BASE,0 a8 K  U- r3 }# ?0 _# p8 _
                        CONFIG_MAX_RAM_BANK_SIZE);
( ?8 j# ]/ e8 O: f  R        return 0;
! c) P- h) {  f% `9 }1 ^7 p8 C}
# h! u+ v7 U" C. o: R8 H+ `
& I: R: g, N% n' n, d9 a2 S0 x9 o' J  C% p; r0 Y2 Y7 m, g

/ I& N/ K$ b/ N2 Q: h) s
8 C7 l+ Y: {9 U; \, L2 ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* M6 l+ \% Z1 K  [2 m8 N+ T
" o0 h0 R3 B/ {& ?# C( g- R1 Z

% a8 x) J# p$ ]* H5 \/ d! S( |

6 |2 n- V  m" h* ^/ X" [1 W2 h




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