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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* J( A( J1 j* n1 y核心板2:DDR2 256M Byte   NAND FLASH 8G bit% v9 v( ~, I& `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' {" Z3 P8 E0 X# F. m' k
8 j6 h' K7 O" Q" O, a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" k; n/ k7 v. P* k( S7 G* W8 v; O+ b0 \/ a, ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( \* [. ?+ K' X. M
/*! g0 s5 T$ ]/ K' ~9 C
* Check memory range for valid RAM. A simple memory test determines
" `# K" ~7 K$ ]" Y2 z/ ]2 S" w3 h* the actually available RAM size between addresses `base' and
+ I! H3 c& s5 H1 \* `base + maxsize'.4 q  j, K3 e# I' P, n
*/
3 d' h1 Z" l* ylong get_ram_size(long *base, long maxsize): C1 z% v" v: u* K9 w" x
{; Z' ~" C6 v2 G0 a! b
        volatile long *addr;
# |2 A! X0 s; M3 |        long           save[32];
4 X1 K! B) s9 F        long           cnt;  |/ v+ B: \. z2 K( l
        long           val;% P3 {# O( E0 C+ @1 H0 l1 o+ [  s
        long           size;
# _5 ?3 _$ s$ b6 Y$ @, [/ b        int            i = 0;5 X3 }2 V. X% J' l. i" w$ I4 V/ ~

, K$ `. B3 f' i/ f. p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 P5 ]8 E( C9 w% V; c5 o$ F: _( Q3 U                addr = base + cnt;        /* pointer arith! */5 F; `* ~' A  Y& _4 d9 q6 t
                sync ();
. l  H; e& }. s' j! g                save[i++] = *addr;
, E" b" S8 Q) d) }) J5 C* u. N+ p                sync ();, C6 }$ r4 o# C5 i* l$ ?
                *addr = ~cnt;$ i8 e' r( ^6 B, \. x( k2 d' ^5 j; H
        }6 W8 K, A. Q* I: D8 B0 Y

+ S! K! k# b" b8 w6 E) @6 R9 F        addr = base;
/ x+ J1 r% J8 K, r. U0 g' X0 k1 [        sync ();
( }' Y* [7 M  c/ x. `. C$ ?        save = *addr;0 i1 Q+ B# b7 w: F1 G5 R
        sync ();# {7 ^5 e  a- [3 D1 Z% a
        *addr = 0;
) ~, I  k" j( `4 R$ {
- P5 S7 r, Y: c, X) x        sync ();
! z2 h' p. P- e8 b4 f3 Y, [        if ((val = *addr) != 0) {
7 G- s9 o. l% _' l' S6 ~! h                /* Restore the original data before leaving the function.5 b! {* Y8 x0 l& [
                 */. v" t2 j6 g- ~+ |3 N: G
                sync ();+ t- D, o  H, X  m7 ^) T
                *addr = save;. A4 N- \0 i( J
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 s" W" o+ J6 V/ [, F                        addr  = base + cnt;3 ^3 q5 p$ p7 v! D; |
                        sync ();
  M3 _- y, P' O' Q# D/ Y                        *addr = save[--i];
- I# H$ T4 z  D. w8 T                }# y* B" N- s' Z
                return (0);" D2 D3 s7 l+ [* `+ b3 R5 o
        }5 X( l* V, h: E, Z
" l$ T  b% A7 y( G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- h) @! s( i+ W6 y  u( `% R
                addr = base + cnt;        /* pointer arith! */
, |& v& ]6 I9 O                val = *addr;
# O. @  `3 m) @3 \7 D; A) G3 }                *addr = save[--i];
- T3 J. X% P! ~9 C* @% C: o                if (val != ~cnt) {
4 \' C! L9 l* V% A9 {) ]1 }                        size = cnt * sizeof (long);7 S7 @' K" k1 Q
                        /* Restore the original data before leaving the function.
4 S' ?* A# g# U8 T6 _5 w7 R) H- f9 y                         */
4 \7 I% P3 ?) Z, [                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 {) A* d- X( J& L# ?7 K( d! v                                addr  = base + cnt;0 c! h. B  J, P/ U( u4 ~- A
                                *addr = save[--i];& A7 V  ?/ d" J- x; G
                        }+ j  d8 G+ w0 Y# k+ y
                        return (size);
) f. n  b  {. V3 M                }& V, f- z9 O: o1 H, k( w
        }
) t6 S$ ]" e+ N. H
( f' i. {6 }: _1 \8 `) x1 l# r        return (maxsize);" h( r- d. U8 F* R! ^
}) ~$ P( t: ]# ^: C
int dram_init(void)) D! C3 f: c+ [$ w. I
{  {! Q# [( j. n5 T" g+ q
        /* dram_init must store complete ramsize in gd->ram_size */+ I) H- t0 Y, B+ f/ @
        gd->ram_size = get_ram_size(( `; }% d- H6 t* v$ j8 m) M
                        (void *)CONFIG_SYS_SDRAM_BASE,
, O9 e, I4 Z% L6 a                        CONFIG_MAX_RAM_BANK_SIZE);
, {- W9 G; j, a/ _& p( F% S        return 0;6 w6 y0 {7 C" d. S9 D3 i" L
}9 G, M2 _: ]! o1 }

" n, P3 j0 u5 h3 F* `. v+ V+ \6 i, w, R  H
9 d& ^. y+ g; R* |1 d! k( C# [
& O% X! y/ Q, [' c. m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% f7 }- c9 E" M( J+ h; W

- j2 P- @0 p3 W$ M; O* b2 L$ g* z" W# I- h$ D

7 c! I4 c9 w! `: q0 L4 L1 O" `
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 18:12 , Processed in 0.037977 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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