嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 [# [1 v3 A" d% A. V
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 R+ s9 `  l% |& ?5 m7 W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 l1 j1 \% u6 O8 e. d

0 t0 O4 A5 M, u9 Y% ?8 F是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' j& ]$ o, l1 {! K& I
7 H/ H; {/ s5 o

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. W2 s2 W$ y% V, V3 ?
/*) a0 ^0 l8 B( P* p/ j
* Check memory range for valid RAM. A simple memory test determines( S( m# r, c$ I3 H4 q
* the actually available RAM size between addresses `base' and. K2 Z' K  h0 a- l2 Y" {, z6 V$ m% r+ ?
* `base + maxsize'.
8 V$ s8 b0 H1 K/ |2 @3 w*/
% _* K6 x, ]% V; L) F" X# Clong get_ram_size(long *base, long maxsize)3 B6 }  l+ x4 B" P- j9 w9 V
{
0 ^# Q/ v/ m% W! }3 h: X        volatile long *addr;
  ~, J, Q1 J3 ^0 ^% H& k        long           save[32];8 B% y7 Z, n/ l: Y! [7 r
        long           cnt;' M! t6 ]( b1 o  p8 `( m
        long           val;
8 i  A# m0 c0 m: t+ u. u$ O4 v        long           size;2 q7 q2 @. T) X; Y/ g
        int            i = 0;! p) P% V# b; G$ N7 N/ G0 z3 c

$ B% L- v1 D$ D* R8 t6 K        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 X# G% {- x3 n# _2 _. L" D5 {                addr = base + cnt;        /* pointer arith! */$ H* u0 m* O5 _" z8 o
                sync ();5 c* v4 J; R  ?
                save[i++] = *addr;
6 W4 E: E" b9 U* q; e5 x  P! P                sync ();% ^+ ^+ Y* B3 W. S$ K3 E
                *addr = ~cnt;
% m9 b: |5 q# U" a        }
, _$ U) x- i4 Q" O. ]$ x& X; f/ z0 I  O$ a+ J7 E$ ]
        addr = base;
% b+ p- O- T: k3 f- w2 Y- m2 ^        sync ();) f9 D) c* }# `- k
        save = *addr;- U& ^+ s7 [  o( Z0 a' a
        sync ();) Y5 H. P- n) H( b+ n% S" d) o, {
        *addr = 0;
+ f  w1 T$ f# L* {0 g( a) H# ^1 O# L
        sync ();7 {# }  I7 u8 C# t
        if ((val = *addr) != 0) {
1 D# Z# Y9 p  R                /* Restore the original data before leaving the function.
2 M# x6 N3 v. O# o0 {2 o. C                 */
. t8 _3 k0 D! V6 }: m                sync ();
; V  k+ ]( t2 e4 V7 s$ y                *addr = save;' w: y% p# `8 a4 [
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. ]" p9 Q- n; W4 B1 R                        addr  = base + cnt;( s  N1 u5 a, V/ m) n2 T
                        sync ();
7 l3 {* c9 n! V; X1 A/ {. O- L                        *addr = save[--i];& I' L$ K6 W1 K0 N, G4 c7 \
                }
) W* ^, o4 G9 g8 y- j  t                return (0);2 s) @0 g) v0 e3 B0 ]6 C- M5 ~
        }  `! g  G, C. X) |: V1 r5 i$ d$ \1 p
( [+ }: s# m! L1 ~( r1 t
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* I# K+ {% c7 ^
                addr = base + cnt;        /* pointer arith! */
7 ?7 k  v( k7 A# G                val = *addr;
! P7 s, o8 @. S( A                *addr = save[--i];
2 t1 _3 [% t1 V+ O                if (val != ~cnt) {4 Y; E3 W# M, ^! l: a. Z" \* e
                        size = cnt * sizeof (long);
- U+ H: h) D& W7 r9 ^3 L* U                        /* Restore the original data before leaving the function.3 u4 ]; r; j/ K0 m; m
                         */) ^) b3 P$ o, `+ [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( y* Z9 K6 u9 I9 g: ?8 l( M9 g
                                addr  = base + cnt;
" W3 I5 C! P9 t" }2 H# v/ ?                                *addr = save[--i];$ [8 X1 i) p( l4 A6 R  [
                        }1 g  ?% C0 o: U7 Q3 ^# u# k
                        return (size);
0 V; m, U' c9 s                }5 u* J1 ]% S  N4 F1 q
        }4 g1 j# S* g: h' B' f
% {: W& t! d' ^
        return (maxsize);  U4 l( R( r1 W, p, W# t
}
, u" W9 f. J4 f5 `4 \9 M% K, P" Fint dram_init(void)# R0 \; V( a$ l' ?# H
{
2 i( @5 \! p3 a1 J/ F& ?        /* dram_init must store complete ramsize in gd->ram_size */! m4 Y; |# a7 B
        gd->ram_size = get_ram_size(
/ a9 i4 W* `7 Q3 W; K                        (void *)CONFIG_SYS_SDRAM_BASE,* l  F+ D& {* u% Q" g
                        CONFIG_MAX_RAM_BANK_SIZE);) ~8 _, o- E* w3 m6 |  O6 B
        return 0;& ?" M* V3 s) F( E: H
}7 }4 }7 @% z9 N( R' j& ^
: ~- _, @5 C, P8 V
. f& z( O* Q! E: w1 T* e) z

! O1 B7 m7 Q5 D( V( u3 C' C: R' ?6 q9 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 k# I# c0 T% f- T& D" @
1 c: w! p% g% k+ g
% k* g' `; a0 ]- `) ^" |- r4 D

  l- B: b* c8 c; m




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