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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 D1 R; e8 f8 C% c- k
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 Y5 C7 i& x8 w5 x% G这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) O" ^" m5 E" L) {, E1 J4 M4 i( }7 A( g- H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& @5 c: V. r5 T4 n  a; y8 r
+ {$ a. ?' D- a* z# m8 I! }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 D% Q+ D# s$ R6 P5 e: G" w
/*2 v2 {$ |3 T3 q, Z0 c
* Check memory range for valid RAM. A simple memory test determines9 p  F7 O- Y: x# l
* the actually available RAM size between addresses `base' and
9 c* ~. c5 `- m! A" b' t* `base + maxsize'.+ `1 W; A9 I, U  E' M
*/
5 a- ^) s+ n$ `1 @long get_ram_size(long *base, long maxsize)" D9 `4 c% \; j9 U1 C( y! F
{8 f6 {& U4 j. [
        volatile long *addr;
/ S8 i! A8 a) x4 D" I! }+ ~, I        long           save[32];2 @4 p; a+ _# A7 t
        long           cnt;
5 H. i- ^1 T2 i0 h        long           val;4 V! I' v: ~; V5 ^# W
        long           size;5 S6 K3 S- Q' X+ ?; J  m% J
        int            i = 0;" M* B( ^+ o7 o  Y, f
: x1 g* C% P1 G7 p' l7 `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ ^3 \7 o" E& o+ [, G1 v
                addr = base + cnt;        /* pointer arith! */! S$ c( e. c/ v( L+ f
                sync ();
9 t2 Z/ z1 U6 v3 n) y                save[i++] = *addr;- s& ^+ h3 X7 w  T- c
                sync ();
& e0 c: c8 X$ ]                *addr = ~cnt;
# V# U0 R% D1 b5 }( i        }! Z, j/ U" V+ v/ ^
) T8 V- m. e. n- c
        addr = base;
" ~. n; \+ n6 ^( Z2 J8 N        sync ();5 Y+ I! [; ], N' P% ^" Y
        save = *addr;! U. `) r# Q2 [! ?$ `
        sync ();
: O2 T6 W/ Y5 I) D' y+ Z        *addr = 0;. z! j( v6 f; _$ G
/ b" `0 h; S  s' E8 k; b1 H
        sync ();
- ~0 Q# H/ `. ^  y- _( _" @        if ((val = *addr) != 0) {* j" X  h2 @9 B' e+ C
                /* Restore the original data before leaving the function.- ]2 \5 N% c% M+ ^4 J
                 */
* n7 y/ B7 ^! z                sync ();
9 Z. ?* B8 w7 D$ z# S; ?8 a                *addr = save;) \9 ?' a) I* ^5 R8 p$ z' {
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: a* r. f3 L$ K- d) a0 o" q. _) e
                        addr  = base + cnt;: s9 t0 t# y( I$ {
                        sync ();
9 C2 k: N% M4 x% o  N( _3 o7 B- W                        *addr = save[--i];
) y( G- @* @' o* A0 w) @' M, ^6 V                }
5 D/ X: l* ~. C: f/ b, K) p& r                return (0);* I+ C% L% E* C& g5 \
        }
7 }' ]0 [+ U8 L9 U, A. O8 Q2 a) n, v" ]
% [% y/ H3 n! }" V# ]4 o        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- b8 n, v7 A; S8 f; y                addr = base + cnt;        /* pointer arith! */4 D( x/ R- C0 a: t- M- r. _$ O  s* }
                val = *addr;/ C4 G  H* B' ~: n; Z3 X8 M
                *addr = save[--i];1 X' p+ W" d2 n6 ]6 u  P
                if (val != ~cnt) {
$ K2 _/ ]9 T0 P8 G# `                        size = cnt * sizeof (long);1 b  m3 P# d' o
                        /* Restore the original data before leaving the function.* U( A+ C, z8 ]; ~
                         */
1 \! \7 }1 T9 V6 X                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 I" Y8 c( p6 m$ J( |2 k                                addr  = base + cnt;% Q$ T0 g  S5 m8 e) E
                                *addr = save[--i];
" O$ {: l& F: r" n                        }/ E/ }6 b# u  r2 ?' X) ^3 L! i4 C8 o
                        return (size);$ {# z) l: p, C" R9 x- p% E- w
                }
' X; J# }9 V1 \0 _, M1 P  ^2 d3 R- ^        }
: j" r: S# b# x1 T" T7 l; ^) P9 K7 n3 f( o& A
        return (maxsize);
- H8 ]% C! r5 C1 j1 M: K  M}
# g3 j. G" @: \int dram_init(void)
( _. Z! V  l3 |" n5 T{3 X. G/ {7 O5 A4 |2 ~3 ?
        /* dram_init must store complete ramsize in gd->ram_size */
8 R  }2 U9 e: S; u( [        gd->ram_size = get_ram_size(& u' o1 W# S" D$ Y) h0 a
                        (void *)CONFIG_SYS_SDRAM_BASE,, o0 s. U8 H" a# X
                        CONFIG_MAX_RAM_BANK_SIZE);/ r2 ~) c4 ?4 h+ m* b3 I! H6 X! X% N
        return 0;  b% r7 j/ Q- ]! w$ ]
}
5 [" [) A# w  ]4 [2 p% s, y) S8 W% B- K
/ V/ y0 R  ^2 T5 E/ U) d% ?
, |- W6 O5 ^! e  h' g! d! B; q
/ N! z  E) H7 q9 S! \) @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, }: [5 D3 [4 M. M) \$ t" N$ ^
& l7 R; b; h0 r8 J1 }: W1 Y( F1 I3 E6 V3 G5 P
- k/ }7 K! y5 ~# K
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 05:23 , Processed in 0.047039 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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