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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 l3 L8 X: f! {2 G1 F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ ?+ l* n/ m+ U9 L这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' E$ f2 A8 Y- P, _* H* X

6 J9 r4 G! T+ t5 U$ E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* d% \2 R  [' T5 V& n
2 h; n) {' H3 i0 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 Z" G6 k  r# S9 s4 j5 W. I. H6 x/*
- D4 f# c2 ~: ~8 d, E* Check memory range for valid RAM. A simple memory test determines
  w4 ]' l# Q8 R* the actually available RAM size between addresses `base' and" {; M) [( p- ]4 N7 e8 M
* `base + maxsize'.& X3 {1 |1 ]6 k& D0 C
*/( J& O: }0 x& J2 C: ~
long get_ram_size(long *base, long maxsize)
' y' i6 U' s2 J5 H' U3 _3 C7 k{
' |& G; B& p8 N) S  t8 D        volatile long *addr;
4 `  ?- u3 m1 \# G1 |        long           save[32];
/ o, g' h5 P2 J5 m& z' N        long           cnt;2 J4 N+ ~, y5 K! L
        long           val;
% W: ~) e. g4 ]. `# G        long           size;
' g, M6 b( @; _3 p        int            i = 0;. |1 K- k' t: ~/ r
/ p4 i0 B- j& |0 t# Y% z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 r! b  x5 {0 F% D- v. U! C
                addr = base + cnt;        /* pointer arith! */
, ~2 y$ J4 c5 ]9 q, o' G' u                sync ();
+ B, m2 M# t7 s- N% {' d7 O* S- m# K                save[i++] = *addr;
( Y; l/ u( y! U0 a6 z                sync ();1 N/ b$ y4 j1 a) G* t" p
                *addr = ~cnt;
8 b% I: f- N" P2 ]" h- h        }# r; m! E9 t5 \3 n! o5 i' G  R5 ]

2 ?# o: `8 \( j5 X8 v# }6 ]% b        addr = base;
6 k* @  U0 q6 J! k$ r0 c  {6 Z        sync ();
/ k/ ^* y& }$ @1 {, K  J8 d        save = *addr;: f, K8 [& Q6 o. n# G
        sync ();8 l  d- ^7 _) K( r6 J. p8 [0 B
        *addr = 0;$ R& s3 n; F+ l3 |- ~* G
5 f, A. y; A' F
        sync ();/ {# z. k# C  I( d
        if ((val = *addr) != 0) {
  K& s4 V9 Q( D  a$ I' q# [                /* Restore the original data before leaving the function.
8 v, ^% K/ z* L) m7 e: t3 V4 f                 */4 C8 c  m& \' n
                sync ();
: a( L! X  P" f9 |+ g                *addr = save;: w6 T' ~2 f$ Q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; ]' |) z6 N" n  z* [
                        addr  = base + cnt;: n6 ^. J2 F$ e; D
                        sync ();
# l  g( c4 f5 }" J                        *addr = save[--i];
( Z, J# h0 T. j( X5 Z- i/ G                }0 q$ d7 C- U% c! e
                return (0);7 b0 O; E' |" h: L( K- `4 W
        }% l+ }# X3 @  d0 W5 H9 ]
+ n: m! \3 H& }1 k: t$ W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 U3 g- v. ]+ L$ f: r, Z% V                addr = base + cnt;        /* pointer arith! */6 d, O3 q/ |% M& c  A
                val = *addr;
' t7 b& H3 c; D2 l7 R3 t                *addr = save[--i];
% c; x, d. u: w                if (val != ~cnt) {
0 |6 s0 _' `8 M! @  W                        size = cnt * sizeof (long);7 c3 a: X3 A/ E/ z+ L9 L
                        /* Restore the original data before leaving the function.
! u6 _. u2 ]6 ]5 [2 I! \                         */
  Q7 \" \  S9 _) D, {3 a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 K% P* m8 @  `& D' z# S8 |                                addr  = base + cnt;
! }( m7 {1 z* o- P/ U4 I* G( Y                                *addr = save[--i];4 r$ I0 Z; Q2 o
                        }
& [1 ?3 T' ?* C7 @/ q" ]                        return (size);
2 z) @5 N/ B' G5 K& Y                }( j2 B' @9 X$ e; E) X3 Z, c
        }
# k% ~3 r0 o& _2 e- N7 y0 _7 U' U4 l$ O$ m
        return (maxsize);
3 U, H  M# Y. {1 r' T* f! C# p! o9 X}
6 p. u, I: L6 q  n  O/ Jint dram_init(void)9 ~3 S) n- v( `  U4 W
{
% I/ U  Y$ b7 l# J        /* dram_init must store complete ramsize in gd->ram_size */
0 U& [9 [* R3 X5 f( u! u+ X        gd->ram_size = get_ram_size(3 g6 i" j, E5 D  n/ m
                        (void *)CONFIG_SYS_SDRAM_BASE,/ B/ a! N* _5 w% ~1 g
                        CONFIG_MAX_RAM_BANK_SIZE);
9 i* C3 F, ]& Y/ L        return 0;. G9 M2 l/ y$ W
}
9 L3 \. @2 X5 K4 n1 b" w& E2 _  `2 ?0 t8 y1 S

9 ?! s4 \5 a: f6 U7 g( c4 z+ b( N
: r/ P" `3 v3 S3 z: M- T
8 r/ O' ^- Z( y0 G3 S# [FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, ~- c/ H, Z& U" i6 O. r+ C7 f3 o, R

  C) ^  D7 e- x' S% d. u& I6 X3 U& b; Z' c  O  w( n# r' v

8 o& q6 ?: K9 ?, t$ v# m! e& ~' Q. G
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 18:27 , Processed in 0.040389 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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