嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- K% d$ g& `1 {核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! `' ~1 U! a& H6 F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 x' q! |5 A& m7 }+ Q3 h9 y: y" e+ o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 G& P2 y4 x0 Z+ B6 l0 Y5 _7 E

2 N8 F: R& e7 u! p" j/ n  @
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! s& y7 f" X, I# F
/*8 L& i3 G! r& F6 j6 R5 @
* Check memory range for valid RAM. A simple memory test determines# m' |4 f* F: }$ Y
* the actually available RAM size between addresses `base' and$ b  v2 D* |0 U4 H  q. `, i2 t1 O
* `base + maxsize'.7 s. Z: }! p# m. L  |3 I3 ~6 X. q
*/( a6 n# @* g5 H
long get_ram_size(long *base, long maxsize)
( [( M( A7 \5 C& Y8 J0 W1 q) I. k{
" S* K9 ^  Y! D" X8 a1 A4 t1 n        volatile long *addr;: W& l" _7 z' u0 o( f. ^- ~
        long           save[32];: c- }0 f5 i: Q+ a" u" Q) X
        long           cnt;- T6 V  R3 ?5 ^& C; q
        long           val;
* w0 U- h# x% e" D6 l/ S1 S        long           size;
+ }4 k3 B; d% C! x' w        int            i = 0;. ]5 r9 j7 u2 i& _, O

0 }0 T; f0 g) _        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 g" \' F& Y1 X/ ~/ U& p- O                addr = base + cnt;        /* pointer arith! */2 ~/ i  s$ H9 h' s0 {
                sync ();4 m5 W( l+ V4 T6 G& y
                save[i++] = *addr;
' B5 q5 f1 V0 h; c                sync ();
  C# l1 _% F4 e) y6 Y; y                *addr = ~cnt;5 h4 |9 M& N9 q0 C
        }
  e5 x- y2 P8 ^. p5 k2 K* P  X# N
4 [1 y% l8 |4 G. N# M1 K        addr = base;
) p/ Z2 w: e7 f4 l! w        sync ();
9 q3 S$ d% j1 s) B8 {6 L! E        save = *addr;
  J3 k# i- Q- u/ ?        sync ();
( i' ]3 C: T- j) {' D8 ^        *addr = 0;* b8 }+ [' L: s  H9 p1 b6 f# \. A8 H
' X9 X3 N3 ]. X5 H
        sync ();
! m& ?* O* R- J  g        if ((val = *addr) != 0) {
1 `& @; I* l6 B6 F: o                /* Restore the original data before leaving the function.
( g4 f9 v; r  E$ v                 */3 r: p) \+ s) o3 ?- ^
                sync ();: L3 l& d! M1 L- A" g& }/ `5 A
                *addr = save;0 L& u) }. u( `7 b1 f' {9 n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' U) ]3 L8 I6 Q/ X
                        addr  = base + cnt;8 ?" P# c+ a3 z% q8 Q. a, X% b7 J! X
                        sync ();4 L! ]  k; p; u. M( U8 E
                        *addr = save[--i];
; Y: B8 F* P4 C9 e( R) v* s( y+ I& \                }" C  `. d' I" _$ i1 z
                return (0);# S0 j, ^" Z! d9 G( U$ T
        }- Z0 `7 Q: G5 p( z. d( p% Z
% J3 G+ S* D  w  a! @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# X3 |" i# e4 {/ d: I                addr = base + cnt;        /* pointer arith! */' x# |& M. @2 S2 l- }1 ~, T$ O% ^
                val = *addr;2 m9 K! F5 [0 u! W% I5 N
                *addr = save[--i];
6 m, C: V1 B2 o1 {" q  Y                if (val != ~cnt) {
) ?: s. }& G7 Q2 s; |; t8 G- k                        size = cnt * sizeof (long);
0 L! U) @5 E/ q9 E3 ?3 ]# l                        /* Restore the original data before leaving the function.  ]0 |9 |+ P6 ~, X
                         */
& V# z  P% u* D" J1 z- v- q9 v                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 e4 ~! h' _9 w( A8 N0 _4 q                                addr  = base + cnt;4 J( [% E/ |, q
                                *addr = save[--i];2 I: F6 Y3 _. z& b
                        }
3 k4 M- Z6 u) s  a; c3 J                        return (size);
! T7 Z2 W  X, Q: r- L                }
* G5 T- d- B+ G6 Y( y1 J. g        }2 p( g+ a8 e& j! j: ~  h% M

, G* B/ M! r0 d2 A        return (maxsize);
& o: Z2 a# W6 @& I0 d, Q}5 T* Q0 c$ ?- ]; i! T9 L
int dram_init(void)' j6 J6 _6 O; p
{
+ f) H% y  ^6 b- [' \6 [$ e        /* dram_init must store complete ramsize in gd->ram_size */, E6 l# r/ G) `
        gd->ram_size = get_ram_size(
* c5 {. ]2 u( o                        (void *)CONFIG_SYS_SDRAM_BASE,
+ [' G/ I+ ^' v: U  P1 z                        CONFIG_MAX_RAM_BANK_SIZE);. M& t  t& G0 }+ C- I! Q3 b
        return 0;
* j: w) W/ c9 P}0 q. n# j# R5 I2 ?' J1 ~
  ]# M& g  e! D: T
; m4 O0 ?6 p. [
  z, Y' h4 _) j+ N, c6 v: ?/ t

8 C: D& S" z& o; b0 EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ e4 e- Q! V$ A+ {7 h: @0 q9 e  g. d

& |4 W: ?+ \3 a) R) _- S+ {

/ B+ S! f( J7 O, e




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