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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 m5 g9 S/ B( D: {% [核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ ?& a/ j/ p. H% z" n1 r9 v, T  d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 }" B) H, s8 h: m  y* w

$ G* J2 R* h  H5 w7 }6 _是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 r8 L* W7 }' F) X- x6 c4 _6 P& _) J7 w3 D2 d9 N, Y+ r% X6 R& E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( {" O. K8 c+ M/ B- d. t: c3 K
/*; Y& o$ W1 q8 A& P- ^
* Check memory range for valid RAM. A simple memory test determines& z! d; w4 ]' @5 ~) }1 Y
* the actually available RAM size between addresses `base' and
, U! |& N/ W& f4 D' _' ]* `base + maxsize'.. ^' i2 H  D; ^9 L0 v# i4 k
*/
0 @/ I2 J; M( p- w9 s9 Glong get_ram_size(long *base, long maxsize). i3 j) ]# f7 t
{# F% ?7 f6 [/ _/ @2 e0 ~% F
        volatile long *addr;! [  y" L, f9 L: j, y
        long           save[32];+ ]* G) O) L+ o
        long           cnt;( [+ d" U5 I* z( g1 d6 `
        long           val;
/ J* \2 z. M1 I        long           size;- q# N9 m. g, z: L0 R$ ~2 P/ L# n
        int            i = 0;
( ]5 d$ ]% G( e$ c7 a0 t
: x6 g& b* _- I! G3 _; T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 _$ N1 w6 ^$ d7 O8 C
                addr = base + cnt;        /* pointer arith! */* Y: J" W% n9 }# o  [' M' _! \3 ~
                sync ();
2 h$ \, u6 O2 s+ a; o/ q, M                save[i++] = *addr;% T" A3 s+ u3 ?5 i
                sync ();
$ l7 Y( X- U4 Z; _" H/ N                *addr = ~cnt;
: O8 z2 a3 w' f; p% |        }
8 ~5 F) H5 n1 ~  f' n  `
- T: K9 k, }! K) D0 ^& C3 x        addr = base;
, P. z" k. }7 \$ e9 H! L% U8 t        sync ();7 E( `  R+ Y( ]! {1 J- C! A
        save = *addr;1 q) d0 q* f) v- b
        sync ();! H, g7 J5 M6 ]3 A
        *addr = 0;( E, W& ^  t) E3 H8 f, z

* w$ |' v$ D6 j        sync ();' o; y; M( w  w- X1 b
        if ((val = *addr) != 0) {
' P  L- q  c8 @) V+ y2 \                /* Restore the original data before leaving the function.
( @, ^. P. K& q7 l; J3 p& \                 */+ p$ Y+ W# e4 {3 o. K/ n% ?
                sync ();0 `- I; i% T+ y
                *addr = save;4 S: c, r; a8 g. z/ c2 Y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. D' R# `( e" m. n0 o2 i                        addr  = base + cnt;
, X! q' B6 g* I" h                        sync ();0 V& V5 x: j$ f. P* t/ P
                        *addr = save[--i];
, D- T3 j/ c9 X9 A* a7 A; G# j" K! F                }0 b0 h4 x$ Q  ^% P0 y
                return (0);- u9 ^2 R* z  L& _
        }! @5 l& E& L7 o  h5 Z* h! p( m
( W* _( r( _: Y& F4 m
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( N7 P1 L, A* Q! N8 @: _* W                addr = base + cnt;        /* pointer arith! */  o$ U- ^! [1 s1 @# z' x
                val = *addr;
0 p# N% K7 Q  \* _0 t" N. ?7 V                *addr = save[--i];: p3 M6 _2 H8 T  H+ L0 ~1 o8 K
                if (val != ~cnt) {
4 ?2 L9 G$ l/ u6 n3 M5 h                        size = cnt * sizeof (long);! D8 F$ ^5 E4 }1 k
                        /* Restore the original data before leaving the function." S! \9 {7 e! D4 S7 e0 E, l$ x
                         */7 o% c' O+ R6 P% {% Q8 z: \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: b7 X) W( _. c
                                addr  = base + cnt;- s/ [( r& I9 X8 U& _
                                *addr = save[--i];
+ P3 n5 B) H) u' c4 [                        }
  b. a* J  E2 N9 Q! M1 S                        return (size);' q+ N" ]( A2 [. g
                }" e% [- P  ~: Z' Y+ q: t/ P
        }
7 R+ O# l7 M! o! w! @4 c/ X3 [7 {0 ?  w7 s# k) }( e1 ^
        return (maxsize);& k( d% i3 Y6 f9 k: t5 I( g
}
$ x' R- l, k8 v/ }# G; Lint dram_init(void)5 H/ a& ^2 b+ F1 F' I" G+ m3 t
{, J- Y+ w4 W. ?, Z
        /* dram_init must store complete ramsize in gd->ram_size */
0 Z3 t5 l$ y# U; X        gd->ram_size = get_ram_size(/ L! o3 u- V; T
                        (void *)CONFIG_SYS_SDRAM_BASE,& {+ b& c! ]2 P( B' F# R2 `
                        CONFIG_MAX_RAM_BANK_SIZE);- _' w$ h8 O" e5 ~6 ~  |1 R! W) k
        return 0;
( X3 o. \# q4 E# \}  g. u: u, V- _0 V

) s& K; D1 v- [' r( P' k' u! g# G  F7 W1 @$ A, N
4 y8 @: @2 a7 A0 `2 L$ B+ l
( R$ N# Z) ~. ]' X( H8 L- ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; N6 `5 o" D( y
) V& n  R/ s) X9 `6 e& W3 R

% [7 C+ i0 V/ E5 m2 T3 @# Q

, c; U1 d! @  a) v
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 05:39 , Processed in 0.038949 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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