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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- Y3 {2 c6 d3 ^% s6 M+ ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 w% O& L5 x( q$ z7 l' y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- w' F9 e( Y, J& Y. h9 q0 X
1 B" q5 h6 W, \  L, ]8 U: m是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* d, W5 `" w3 z; d+ Q& J5 j( K

, n- {/ X0 L6 K, |0 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 }5 p" x' _- Q: S0 M+ ]; Q/*! }. S4 o/ E4 }! i* d( U% ^
* Check memory range for valid RAM. A simple memory test determines
% N# g, [( W2 w  y. l/ L* the actually available RAM size between addresses `base' and& C; [. B, P& X# y. r& w8 r4 p
* `base + maxsize'.% e  d, a* D" g) u+ q8 X! Q
*/$ H. o9 r7 I" z* d2 l! w# k  m$ x, p
long get_ram_size(long *base, long maxsize)$ Q# h6 v! w) F6 d6 t
{
& Z' X3 C3 ]( R* e        volatile long *addr;2 w. e: i% J' _/ s9 O
        long           save[32];
4 E* G& _3 }0 N        long           cnt;
6 v: ?' K/ _  I        long           val;
# s" f1 d5 _, W0 X        long           size;7 q$ x( c$ I0 ~( A$ v9 `- o" R" ]/ W
        int            i = 0;$ Q' J& ?$ p+ `7 v

7 T0 L; ?- i# m: G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" R. |( M& x" C9 {1 b2 G
                addr = base + cnt;        /* pointer arith! */
4 V5 ]* N7 t9 U1 p, x$ C; g                sync ();( V% Z  f1 Y) p2 }. k
                save[i++] = *addr;9 `2 Y4 s( i' F6 E+ {: i( A6 e8 D; k7 f
                sync ();
' p. N$ [+ W3 _                *addr = ~cnt;
( S" F5 P" N% \2 m7 S        }
; i7 ]1 V) k$ V+ z4 Z5 {! L  f; J1 F
        addr = base;4 d5 R- M1 Y" K  |9 `
        sync ();- J: V( v1 V* V; t
        save = *addr;% d6 I" A# K/ a( X8 ^  k0 b
        sync ();
% L7 R6 g1 z5 h, L1 w        *addr = 0;
2 x7 E4 E& O( O# b  B" M' {. }. [# q* w( J6 [( `" x0 n
        sync ();
4 ?$ s4 J# e9 j8 J        if ((val = *addr) != 0) {
8 k( f' Z6 o) n5 h" Q                /* Restore the original data before leaving the function.: C5 Q* r; H3 b& ?
                 */
& ^$ G2 h  R/ C4 _  v  p. X2 l                sync ();3 _, v. R. d9 @7 j9 u6 O- P4 T
                *addr = save;8 n$ ]6 s$ u* S: s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 V5 j) T9 [3 m2 n$ L                        addr  = base + cnt;- {* \* C$ r8 i" p- _& j
                        sync ();. ^! f0 R+ z1 w6 f7 I6 o
                        *addr = save[--i];
& A4 T4 q/ |3 G$ E0 v' \3 [* J                }
$ t- r- C/ ?+ z( Z( v                return (0);
8 g* E7 Q/ x1 i( E0 G4 S        }, m$ m: ?) I9 v4 v& q+ i& y4 D

/ w! l( S9 O6 I, I5 p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: c" ~8 J4 ]; [5 M) s
                addr = base + cnt;        /* pointer arith! */
4 L6 r* n6 P/ c+ g4 F4 d/ K                val = *addr;
5 `  q+ d0 Z: ^                *addr = save[--i];& w. U2 L3 g# Q( Y3 n0 L. V
                if (val != ~cnt) {7 d( }! i7 S' Y. K  q7 t7 E
                        size = cnt * sizeof (long);, A% o) }7 z+ C6 H5 o, {
                        /* Restore the original data before leaving the function.
/ I; d2 T* s: O8 v: F                         *// ?& e4 |/ A% O; `
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 u% t+ C% ]2 z9 l" L" s  g
                                addr  = base + cnt;
2 f" o/ |! D0 ~6 b% d4 K7 N# I                                *addr = save[--i];% Q* }9 }+ I% T& j( n
                        }+ ~: |$ n1 ^7 x' M
                        return (size);4 W% |% H7 b* m& a0 j$ Z$ s
                }/ X! ?* ]7 e* e8 h: Y7 B
        }) N. X. W! U/ i; @

2 f) I) ]! W) B        return (maxsize);
8 ]  r& x" f7 a  D# |}
0 n; z5 U% }1 d- @int dram_init(void)
" |$ g7 {; J& r2 M" f1 _& s# z{5 o" m& h, r( G1 [9 B2 p* Q! ]8 Q
        /* dram_init must store complete ramsize in gd->ram_size */
. T# {8 t# _- w- n        gd->ram_size = get_ram_size(
# K9 w6 n; q& q9 g                        (void *)CONFIG_SYS_SDRAM_BASE,
; J7 F% C, ?; b# [. U                        CONFIG_MAX_RAM_BANK_SIZE);
8 w; B( p8 j" S1 K        return 0;! I* a5 [& v; v8 M; S$ f
}
0 f- ^& e$ S" m( Q0 U' j% _5 d
' }4 [6 m9 B$ Z( |* W
- K4 Y9 C# t% h# a; U6 P8 R( c
5 v, o' H. P9 n( R' f" Q, O1 k7 G. g- ?$ h5 I/ ^. d& D0 C$ Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* ~4 e1 G+ {# z/ s$ O; s

& ~1 t1 e, L. x0 T' n2 u
; ^- \9 k7 Y% i2 I; H+ p

3 Z5 ^& b$ E* v) u* N3 N* X
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-16 08:04 , Processed in 0.037324 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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