TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4835|回复: 1
打印 上一主题 下一主题

TL138 uboot是怎么区分配置两款核心板的

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 {' {$ _& B4 n- P核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. d: c9 |- T. r, O+ U- H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& ~3 h+ l. ~, J
4 ^6 g/ f: G2 X) ~9 h, h  Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! g; s) z: \" {) j! F3 @
$ J) ^% ^2 p% o" E9 o/ u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. J8 d! M8 `; \( u! F1 p: w1 U
/*% l$ S. c# b. x) \! J5 g
* Check memory range for valid RAM. A simple memory test determines
/ P4 J6 L. ~& f. l* the actually available RAM size between addresses `base' and# H5 I/ R9 h, y+ P1 Z
* `base + maxsize'.! |  B, A2 o7 M9 x# ^2 Y" F- h
*/
& d' l$ Z. i: e% {* vlong get_ram_size(long *base, long maxsize)
7 I1 B6 X/ a& ^  U$ h9 K{
, P6 w# s' h8 K1 j  T        volatile long *addr;
+ G) h& Z0 j8 Z6 p3 D: O) W        long           save[32];
; O& q# h' p( c5 D, C7 y# @4 s  G' W        long           cnt;
- u+ c6 p7 _- K9 b        long           val;( R# z: D' v0 H+ K4 H. a
        long           size;
" F6 @: l" ?; v6 H/ L, k1 t) y" ?        int            i = 0;: c) x6 i0 A# D4 d) v1 e' T
* J: c' i  r3 K- P8 @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 A" L+ k+ ]3 h8 p$ X6 R( T
                addr = base + cnt;        /* pointer arith! */' {; O% B, G  B  W8 \
                sync ();
; ]! ~% s2 o# x6 u, n5 O                save[i++] = *addr;* \; S/ _6 W( d8 l8 k/ p5 D
                sync ();
% K9 F# ^! e! G/ M2 \8 E                *addr = ~cnt;/ f0 ]2 _3 @( `
        }
5 M  K% s# H- E6 W- f& x7 y# ~; b0 N1 l2 H9 i/ s7 e" t
        addr = base;
) ^0 s- H" C' V8 v( y        sync ();% j( \1 u7 S, g' o4 R" m
        save = *addr;( a+ D2 c! L3 u* O# q  }
        sync ();
2 F9 x3 ]* t  M/ O4 [        *addr = 0;; l# W6 A+ \; w5 G% @$ T
" q! G% i/ Y5 ^4 o
        sync ();) [+ l7 A# d$ F( m( I
        if ((val = *addr) != 0) {* _. E4 @5 D% ]  D! w6 o  R
                /* Restore the original data before leaving the function.
9 q& f3 S, \8 v, Z% u; \4 Y( ?+ r                 */  q  v" R3 T6 }. x* |: I& I
                sync ();" c1 `& s) U. n
                *addr = save;
1 R5 c- h# N* Z8 {) y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 I) x8 c7 v1 b4 ^) Z) N3 I
                        addr  = base + cnt;
% B0 S0 @* ], i0 ]4 o                        sync ();
6 b4 p' f, C- x4 J* W6 K                        *addr = save[--i];
: m" J0 N: M7 u7 S2 R" z                }3 u& h0 ?1 a! i
                return (0);
: o( {7 ]1 k; U$ b8 |        }
# R+ V5 |. P! F
- y1 q' K2 @4 F9 M! k  T; o& v$ Y+ M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: _; Y) t. _2 e* d
                addr = base + cnt;        /* pointer arith! */6 r( {" n/ ^/ s7 r' j, w5 X
                val = *addr;
5 W, f) Y8 V0 F                *addr = save[--i];! C1 c0 {* V2 g
                if (val != ~cnt) {9 _& @6 f3 V) \2 U/ B
                        size = cnt * sizeof (long);
" a2 {7 x+ C2 ^4 }; w, ~$ n) f* N3 c                        /* Restore the original data before leaving the function.: C9 a) N4 |! ]. b
                         */
) w$ }3 c4 l0 ]3 W# h3 P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. a6 f: ?: L9 w; W( w/ E
                                addr  = base + cnt;
, U: U( V5 Y$ ?" X: _# D8 @                                *addr = save[--i];* [! v$ v' {0 O9 d) K$ i
                        }
. X  ]/ [: {, j  T- U                        return (size);$ P# c2 T- x8 N- g. k/ g
                }
5 Z( u0 |# M6 \        }
, Z( ]. o: M) c7 Q  C% k9 e3 J) S* R! S' y5 |+ D5 I
        return (maxsize);
8 v+ w! ~0 }( n}
& Y. Y# C/ T( @8 p" W2 Y$ Dint dram_init(void)' K. `) }& e' I$ |
{& L5 g) Y" r4 [0 ?. _- F
        /* dram_init must store complete ramsize in gd->ram_size */% C: F3 a: z. ?2 l
        gd->ram_size = get_ram_size($ M+ p4 T* a' Z- d% q7 }$ k
                        (void *)CONFIG_SYS_SDRAM_BASE,
: l/ d$ @8 f. d7 i2 O                        CONFIG_MAX_RAM_BANK_SIZE);
2 K  {0 w# q; [3 {. K        return 0;
1 f) Z9 s- u% u+ ]$ ?1 J}
$ j! [0 n. ^! M" m$ ~: J
. v1 Z) @4 i! I5 Z/ B3 Q' D
1 Q  t4 Z# R+ m5 T6 T. Y- V" V/ O& E% }  y: B! m5 q; ~3 q
8 u5 l3 n6 c; i' {) z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& M/ p( v3 R2 @- g
& e+ X8 e% H9 O) K! B" U

" r" r1 I- h; t7 d, W0 x

( R& J) r1 u7 I
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-6-16 10:00 , Processed in 0.035246 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表