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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; w8 w1 L  O! ?2 \) k6 t% ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 z3 W2 I& z3 Z8 [* D$ `& U! ?这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 W( W) ~% n) v- i- C0 F, w( o$ G' i) X+ L( a) R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 t# J6 i; w/ }: w* V, h# i% T& F% ^% l) l. O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 E: `  \: a# e/*9 }8 M& Q5 j- ~  C
* Check memory range for valid RAM. A simple memory test determines8 x3 B. H0 h3 v5 f
* the actually available RAM size between addresses `base' and
/ k# e  l3 A" m" Q5 W5 G* `base + maxsize'.
, x# S" _. `# R*/2 [9 L/ I$ T; D# i2 q# f* j
long get_ram_size(long *base, long maxsize)
& `* d) {& ]7 l5 ^- H{
* Q. u' Z' m$ s2 F# |; p        volatile long *addr;
3 ^2 s* k1 T+ A/ Q        long           save[32];. x% y6 G6 L; D% r5 R2 p. m
        long           cnt;; ~; A% E; h. [
        long           val;
% x; N' C5 D) O; u5 W+ w) Y        long           size;! @- y; u7 @9 {
        int            i = 0;
; C  _4 v& v7 `1 @0 h$ Z! K0 c; l. W( g& q9 ]/ p6 A% \4 U: N
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  m. q5 d& q6 I1 T. J- i
                addr = base + cnt;        /* pointer arith! */5 ~) ~6 k1 ?8 ?3 F6 |6 c
                sync ();
0 D2 v/ v5 D& q! `/ K; i                save[i++] = *addr;
( n$ ?' `4 @9 k7 Y( r; M                sync ();
9 ^/ L$ R- ~3 H0 M                *addr = ~cnt;
1 A3 g; `* k3 w1 a9 O        }
0 f& R; H; E8 E9 u/ w+ A- ~  N2 i2 i
        addr = base;) j- d7 t1 P8 e5 V' Y
        sync ();: `% w+ L4 C* b
        save = *addr;% h- D+ d4 s, B( A
        sync ();  O) D4 ]  C. e7 }
        *addr = 0;$ `  n6 v+ f/ C, a% |
( o5 }* Y, g0 f! p1 y
        sync ();
( S- K5 Y7 a. s2 ]. K/ v% U/ y2 o        if ((val = *addr) != 0) {
  \* E: A+ r& o- ~1 I' `                /* Restore the original data before leaving the function., a5 a$ C8 {+ I% |2 |6 V0 S
                 */* a& _7 }+ C. M
                sync ();4 l* B9 k1 ?9 u& f. H; g( V3 R
                *addr = save;
: y5 w+ `  ]" z3 H$ \! d3 d                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; ~( r' I5 N, O4 f' v" M
                        addr  = base + cnt;+ v. v7 f- G* J! v/ t" Z% ?
                        sync ();
7 `; O! m9 I# n/ y- N4 V8 J                        *addr = save[--i];
, W! i' Z$ ?( j5 l  C                }
$ p$ V( d# Q4 k" z0 [                return (0);' B. b% K3 Y  d8 t- d2 s% B
        }5 M! W+ [& B. o  A9 d. }

% `3 X- _5 X0 x% X        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# I) A$ ~  D$ ~2 O/ Z* N3 T                addr = base + cnt;        /* pointer arith! */3 z! S1 s: y: ^0 b$ Z+ p9 |; b
                val = *addr;3 v4 ]  t' q0 p" Y' S% Z6 Z2 |
                *addr = save[--i];% @& ?# @% N  w/ k. N3 q2 l
                if (val != ~cnt) {7 P! Y8 \, g! }# F& b2 H' ~; S4 e2 X
                        size = cnt * sizeof (long);- f" w9 ?. H1 ^4 K
                        /* Restore the original data before leaving the function.7 U; t8 w7 G1 Y- b
                         */
) f/ ?/ e2 u% H$ w                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 _. t; v! l+ Q
                                addr  = base + cnt;
* S( S( |, Q# r' G% Z                                *addr = save[--i];& I! W; a- `: @8 x. A' h
                        }
- ~8 b  e$ g) M- _1 y                        return (size);
% K. l4 u" i1 ^$ C# u                }# V" T5 f  f& Z
        }. m/ D: w3 a& J- a& [
, F  ^. n0 V  h) p3 Y
        return (maxsize);
& }/ a& Y4 m. F6 T9 U/ ?- B$ u}+ }' l+ m/ v0 U; {+ \5 y
int dram_init(void)
' M7 t, H; }0 W0 [{& [5 \. e9 h6 z, F( L6 m2 i$ J" t
        /* dram_init must store complete ramsize in gd->ram_size */
9 S4 A6 n' z& v; Y& t. h, @        gd->ram_size = get_ram_size(1 b  j" q2 B# Q" O$ O9 `
                        (void *)CONFIG_SYS_SDRAM_BASE,
% p4 ^2 E( O& j6 S0 S; y  G                        CONFIG_MAX_RAM_BANK_SIZE);
( z. ]. u# _3 m9 M7 I  k        return 0;
  X/ E( D' n4 U* D}
5 _  q( ]# B2 e5 m$ R% ]
3 a" C* Q, x! [9 k  F; H, F
% h; B/ D5 E" n0 c% u- k" c+ [' U) ]' z
4 E5 X8 b8 Q' O  }$ ?9 c+ o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( s) N0 i) K* f- I! C% g9 n) Z6 W) S6 y+ |

0 G5 O( m# w0 _( Z
: W& J$ y3 A( a. Z8 s
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-26 17:57 , Processed in 0.040846 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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