TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; y: J- l, ^) M. m% {核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 x. K6 o- ~1 ^# n4 E  A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: R& _- c" d4 f: f5 _& d  x4 {7 R
+ l4 v4 l; D& Z4 o4 f是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ P. |4 S, l0 V3 n9 Q7 O- |: c
5 q6 l# v& c) l" U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, r0 N( i) R, w" D7 }
/*0 u% A* S# n+ ]: j" e' G/ ?/ g
* Check memory range for valid RAM. A simple memory test determines
& G; [7 E5 b# k$ W# h5 Y1 Y( d* the actually available RAM size between addresses `base' and
" z6 t. o# v* L1 S$ [7 H( Y# o, V* `base + maxsize'.8 u) G; j) z; M6 n
*/% y0 c0 A" ^$ ~3 @% M& C: f1 y
long get_ram_size(long *base, long maxsize)! d* w& d; ^8 S# _( ?
{
7 h' x1 _# ^$ F2 [+ R& d$ W        volatile long *addr;
( G6 c4 @+ a; r( G        long           save[32];
8 A- V( z$ y. s: |        long           cnt;' o% {5 {9 o7 U+ H* s  |
        long           val;
: G1 W6 z7 h& I! R( w% K- t/ A        long           size;: j% q" Z* M& B3 a
        int            i = 0;
& H1 I8 p1 C4 S3 g, z; ?& a# q2 R$ Z* _0 G6 m5 {% i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  o. o/ U; a1 n' n( g# l( h                addr = base + cnt;        /* pointer arith! */, p- |' Q+ d# A; J) h$ u4 p
                sync ();
1 q  K0 b3 K- ^  \                save[i++] = *addr;
( e; t' a$ P0 Z( y                sync ();
6 R( P3 L4 q( P+ v                *addr = ~cnt;
; L/ e3 j! b9 F/ Y        }
; L9 N3 g" o2 D" W+ Q
0 O* T+ M1 {$ O" z$ I1 B4 Y5 k        addr = base;1 U' [2 f! [. X0 X* ]0 Y, k: k
        sync ();8 ?) p: s3 M2 C& @
        save = *addr;
5 @4 b7 O+ i! ~3 j( i8 p0 q        sync ();2 ~9 x% n  |* r
        *addr = 0;
2 ~& v2 r1 K6 P; [$ n: _$ C, Q& s. A) Q5 P
        sync ();% C& U8 _' \8 D% S
        if ((val = *addr) != 0) {
' \: v* o" o% \0 }8 j0 ?                /* Restore the original data before leaving the function.
3 ^4 T5 `, m" _. F3 Z                 */# ^9 c+ w, T& S9 [8 s. n
                sync ();
7 {1 g1 n: `4 q                *addr = save;$ f8 u% Q# m2 ?" l
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 o- _/ c' s: s, v1 Q" F  \
                        addr  = base + cnt;4 u+ j; b0 B* @5 k9 y+ f
                        sync ();  Q* {/ r8 c( k1 H& D. k8 F! K. ]
                        *addr = save[--i];4 \. ~" R' [) ]( k  s3 G. p
                }- ?5 c, S/ M" A+ U2 R1 ~( e
                return (0);+ }: j( A! g* n) v1 k5 c. `
        }
* o4 K1 c6 U. h1 _, U& V4 K) q2 d/ v/ O; P1 ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 P( V& x( d/ x" g                addr = base + cnt;        /* pointer arith! */. O, g3 G2 L, A2 I+ M- k9 u
                val = *addr;' X2 p6 ?) V' K7 Y1 F
                *addr = save[--i];8 `4 d# H% [1 s; r, Z+ E
                if (val != ~cnt) {
6 q5 z: Z2 G% `8 }7 ]5 G* W                        size = cnt * sizeof (long);0 V/ u8 C- O( R& z0 S) \
                        /* Restore the original data before leaving the function.
4 B3 Y5 \% Y& T  o7 O                         */
& z6 X0 V9 e; c3 v! W                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 h; z( N0 a7 ^9 \# n1 Z% V/ }
                                addr  = base + cnt;: K4 D" |* M, \
                                *addr = save[--i];
1 q# Y: U7 {3 [) L" V/ }. c                        }# n" _& r$ Z& Y( @2 h& N8 k
                        return (size);2 t+ ]' z) ?1 H& S, Z/ b6 Q
                }
1 ~# p( q9 A! ]        }( b2 f) A9 T  j9 L

! U& r) u+ f. w. \        return (maxsize);
. J2 I% Q% K& v! I}
) `" ]! |1 P+ x' W2 b: Z) Rint dram_init(void)
# O" i( R2 q0 p# ]{+ L5 U% X* T, h5 s  e3 ^
        /* dram_init must store complete ramsize in gd->ram_size */
2 ^; ^  U2 u) w9 A; N        gd->ram_size = get_ram_size(; F& h  m, d1 h% C4 S1 A/ T1 R
                        (void *)CONFIG_SYS_SDRAM_BASE,0 ~0 H9 |/ D2 j# X6 T
                        CONFIG_MAX_RAM_BANK_SIZE);% O% k& p# ^9 u5 F% m6 h3 P0 S+ R( {( T) a
        return 0;0 Y  y  p) Z+ Q6 l
}6 I* s4 ?) n" ^" m( R0 f- p

  ~4 e8 R1 c% r' \  R6 i" P. G  w% f7 e, L% O! Q1 C

; s& P0 Z* r5 b4 `  b
) N3 w( t# \3 r. A( `# {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! R& m6 y( S0 }9 e7 M' |
! y6 z* l9 s0 G# w' s

4 ]& p+ {$ N/ i* E% C

7 d6 @4 ?" k8 J3 U3 I5 w0 k
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-2 01:13 , Processed in 0.038289 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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