嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 U. M; ?# z. |* i  r% \7 H. a  h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit' I7 t+ X7 V% N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, G. x4 r6 H4 N- J
/ ~" _8 l+ |* t" @4 C" v* K是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& d& O2 r1 j+ d7 w/ l& H7 S

* `7 F. P6 v  z- h. T9 N# T
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 ~8 Q, O( Y' `4 U6 o. _/*6 b1 T( s7 C0 I6 w" b5 S  e& F
* Check memory range for valid RAM. A simple memory test determines
! P& s: a& |+ G- }; Y* the actually available RAM size between addresses `base' and
+ a  U( ~2 Q- E6 M3 k! v0 y* `base + maxsize'.
% x9 t+ W$ Z+ p- D& i*/
- @, C/ ]+ H1 ]/ s; t/ Tlong get_ram_size(long *base, long maxsize), [7 p/ q& F1 G- |) E
{
/ A( q. q8 u. ?- e4 T5 H: s& T        volatile long *addr;  k# _# h2 n* Z' e! m
        long           save[32];0 _: i1 B% Q! P! j1 A; b* `
        long           cnt;
( j0 G( E' S& |/ Y. J1 n        long           val;
7 `. U+ \' G7 n3 N0 W0 q9 n1 ?% d$ o        long           size;
: j( K1 }  g: `: }) c3 x" W: N  c0 l2 |        int            i = 0;$ S3 V9 ?* n& h" q

6 a4 P  |6 M5 q( V/ A        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 P7 l# h' }, v1 R: J8 F7 }
                addr = base + cnt;        /* pointer arith! */
0 f# d  r1 T7 r# c" E2 o+ K                sync ();
: e; Z# T+ A" T. R2 O                save[i++] = *addr;/ T: k! _# U. L! C0 H3 P5 B
                sync ();
/ g# }- Q, _9 f% E2 E9 }                *addr = ~cnt;1 ]! }: {* `1 N
        }' X+ m6 n1 W# m, B( }# z" I

( @( t, c/ p5 C8 Y. t        addr = base;* X+ b/ `4 Z% t5 Q
        sync ();
/ u2 R4 J( ~( y2 b+ U0 r# |        save = *addr;- d+ ^( u- I: x" U$ `, j
        sync ();) U$ S- S$ ]9 J( y
        *addr = 0;% u2 H" _1 d$ b8 v4 X3 I# g
) T" @, o1 @3 V) \" w4 F: t  u# ?. W
        sync ();
9 l& C8 A; S7 c+ Y1 I- p        if ((val = *addr) != 0) {
% O3 W0 a3 D( \4 P8 K                /* Restore the original data before leaving the function.; U2 i% J6 L+ i4 W+ c! \
                 */  X  |7 S1 P$ |) N
                sync ();( P" r: x# A( ?0 u
                *addr = save;  o3 q+ [; P1 c% M, p8 W9 n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 Y: L, _. g/ h3 M* O9 J0 \
                        addr  = base + cnt;8 C8 ~! i* q/ i  q; g: R& w
                        sync ();- u8 l. S% B1 a9 V( A/ K
                        *addr = save[--i];
" j* d0 X2 A- J6 |) ^! O                }( G* I+ X# V) @) r
                return (0);+ s" K% {1 `8 V
        }
4 V3 s5 ^. ?% u$ z. W9 w% p) T9 |7 o
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- L) F& \% y5 b+ ]( \! \
                addr = base + cnt;        /* pointer arith! */
& I1 W4 L9 s9 M, W, n# y                val = *addr;
$ e3 ~: W/ q& V, X' v: ~                *addr = save[--i];
1 c- W/ e; V- B$ X* r                if (val != ~cnt) {
4 j& C& I% Z2 z0 f                        size = cnt * sizeof (long);
$ _6 s7 x: E; z' g: Y                        /* Restore the original data before leaving the function.
1 ^; A- _7 ~  B1 {5 d4 R                         */' B  s  v- w! f! Q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. Q  }- _4 U! m9 \$ m
                                addr  = base + cnt;
  S! ]2 R& N# ?; V( R# _5 C# F                                *addr = save[--i];5 y, S# P5 H! b& l4 r
                        }! D8 q& `2 L9 h
                        return (size);
; H* h3 T: x! R- S) \1 Y; U                }
* f: x# P$ F4 r9 p4 M+ }5 k        }5 G( ?+ y$ |) h& w3 g" a8 q. n5 W
4 W" c* W5 b- G( i/ `1 F
        return (maxsize);# y* m3 f/ f+ d( |7 k
}
5 s, h& e% I0 X, sint dram_init(void)* L7 w( g$ B2 \" H! n
{
% T& x3 g1 K. q: o* u, b- D: [        /* dram_init must store complete ramsize in gd->ram_size */
& L/ U1 @) H# ^9 D7 `+ q2 |        gd->ram_size = get_ram_size(1 {9 s: h( d  d' W
                        (void *)CONFIG_SYS_SDRAM_BASE,; R/ ^9 d' O$ E$ n1 z
                        CONFIG_MAX_RAM_BANK_SIZE);3 `( G+ @* ^0 v( V- h
        return 0;
3 N6 S8 i, m+ ~( j; A# O}8 I7 P2 v) L8 t4 F) R( `$ N
1 M) g, ^# G" }6 y
/ I3 U" Q6 O& e- R: ^: O$ z
5 a1 |/ v. a2 _* J  Z& u
9 l1 a* n! e# D9 e8 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& J7 e% J! C4 k9 `* \5 x. E; f
5 G; P5 J5 G7 `7 ?
, K5 E2 X& R+ Q2 r( Z2 _( C
" ^+ h: P# K! B3 S: U





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