嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 g. v, C+ `% ?* K
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, n. Z+ D( O+ Z8 D0 h# u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 {# i) L$ a0 O; s' F$ U' H7 s9 _' C2 V) l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& p( g, m7 _+ V, V; e
) t: E7 [& k0 E

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' q+ a/ a% ]! e/ y/*% ]+ E; a. J  ]1 p; J, g
* Check memory range for valid RAM. A simple memory test determines- l. @  z. V0 [  J8 f, v4 l
* the actually available RAM size between addresses `base' and$ Z7 D/ h0 ?! c, g
* `base + maxsize'./ x4 I" a* c0 F: l0 z
*/8 R+ m2 B# @% B& h% Y3 J8 E
long get_ram_size(long *base, long maxsize)
) j; c8 x! t. G* r, ]{& p/ {! |" u3 l' _
        volatile long *addr;
7 n) m1 M9 u. y6 v- x& z' e: o        long           save[32];  z' ]- N. f( `1 K
        long           cnt;4 x+ E3 c4 \2 m; i% `
        long           val;
1 Z% w5 F% y% T& P, s1 V- X        long           size;
5 f" w2 P. _9 ^1 y# K2 x/ o        int            i = 0;6 d* k  Y5 Z( N: H  ]  [
, L+ A" S3 X; l
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% r- \  w9 [0 ]: m                addr = base + cnt;        /* pointer arith! */
! f5 ]3 M# t; u8 |6 a                sync ();/ _0 V8 ^  m8 X0 R0 h  v( o7 |" ]
                save[i++] = *addr;" e1 b5 U7 Y* U, [+ u. l
                sync ();, b1 H5 c$ ?7 v1 w
                *addr = ~cnt;
; a' H$ E1 l$ N7 K        }
" K4 y5 O" i* k- P3 `* b) {( g  ~1 I- W
        addr = base;+ }, ?" v7 g1 N) U  [
        sync ();
* S  v- |+ P4 y: L% f        save = *addr;3 \) G0 ]& s2 e; _
        sync ();
% s& Y% G( {5 V0 b! x        *addr = 0;
& g$ K6 ^, M" V, u" g! C1 w" U9 m; L" Q& y
        sync ();  \+ f5 p$ B4 p# X& z( B
        if ((val = *addr) != 0) {
) z' Q* `' j9 Y& F                /* Restore the original data before leaving the function.* R7 S/ R: g1 q& a% b
                 */- x: o5 K5 a/ }
                sync ();- N- ~! L5 X: s& e, r7 `
                *addr = save;9 L9 q6 N  `. R: @& O* ~$ N$ c
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 w! t. C' _' y% w9 s                        addr  = base + cnt;
1 }8 W& m4 c7 a* T# `                        sync ();
3 D; l% m- e- `- b  A: E* i& }                        *addr = save[--i];4 ~; r' N2 T% i9 a# H
                }
* f4 d- b# [$ }% h4 |6 }                return (0);
5 L- B, Z) D6 J' Q        }# `, p+ {+ P0 {4 o0 D5 f0 s; l7 |$ y
: @- h! d) A) {) ~! T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 V: n+ n8 l  j& m5 O$ s6 j: N
                addr = base + cnt;        /* pointer arith! */9 o: X6 l2 @5 i
                val = *addr;
& x8 n, O4 ?( n. A4 Y2 C& ~# Z                *addr = save[--i];
6 f  h8 `" h* P# p                if (val != ~cnt) {, G. I, X5 @& M! D. I
                        size = cnt * sizeof (long);
2 P; r: p9 f$ r' J' d5 }4 i+ `) m                        /* Restore the original data before leaving the function.! R6 w4 x: \; r* p  d
                         */
4 _$ z& l% B3 e  C0 h6 f" L                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- i9 Z$ M8 d, {
                                addr  = base + cnt;
2 p9 N7 \$ a0 w. s" a" r/ H                                *addr = save[--i];6 C1 A5 R+ T  K* s. [
                        }
* A. B% }+ A$ v' S                        return (size);
  B9 y* A& q7 s                }
  h% K6 a; Q* v% ]# N        }$ s3 {9 Z7 F; J' z7 @) R1 h! k

. v) l7 `/ T% g- m/ k, i+ Q; O% Y5 {        return (maxsize);
- _+ c$ c/ r$ j. d, a* l0 N' r}3 R6 ?* ~* z2 e  s: f
int dram_init(void)7 u, K( o4 L4 h- U' p
{
* p5 [% g+ E1 f7 D& u2 D/ E; r        /* dram_init must store complete ramsize in gd->ram_size */, A' {1 L- `' D4 a. _* v
        gd->ram_size = get_ram_size(4 e  U8 z+ d3 s9 A: y
                        (void *)CONFIG_SYS_SDRAM_BASE,) w$ H9 K' {! x2 O' [; Y5 y' S9 p
                        CONFIG_MAX_RAM_BANK_SIZE);+ n, G+ Z% k3 Z2 X% X
        return 0;$ y0 f: ~6 T: _; W5 [$ A
}
0 c7 {, n0 L2 }3 a' F$ d  F0 }0 {5 y! {

# w. h7 S+ Z$ l3 ~7 `# j' p1 y; [7 x! R0 K/ H: T, I4 _

' Q4 y8 o+ K7 u# J9 wFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; L5 ^, a, h5 k5 P
9 U" l9 @0 O" b. J6 y) a" T1 g+ P7 _% i

: p4 Y2 ]2 |. c6 h+ P




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