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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 B2 t- _0 O; d* w- @" V核心板2:DDR2 256M Byte   NAND FLASH 8G bit. V5 X% W4 A+ p% w) h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 ^7 a7 b- Z! k' y" p; t
+ e7 _8 M8 i6 S' q  m8 Y6 B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; s' i! Y5 @% Q- d$ E" k# Y
- o: E  t$ c8 p0 r2 B6 L! P" o. z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 q) H: Y" K- d9 t2 |8 k9 b/*
. O  m5 \+ @9 R) _! Q% x) E- j& t4 J: C* Check memory range for valid RAM. A simple memory test determines
; b! B$ |7 E2 O' I* the actually available RAM size between addresses `base' and. B! [( M2 p! H& P) h2 W
* `base + maxsize'.* i% v; B1 |  f8 W
*/
! U! F" Z! {: W: tlong get_ram_size(long *base, long maxsize)$ A( `4 Z* ]! j3 x' i9 {# q2 S( v
{/ {9 ]: i. T0 M: V7 f$ T, {
        volatile long *addr;* O+ }& j; [) g5 k+ z
        long           save[32];
# T, T0 R! l* [. v  z9 H: Q        long           cnt;% i; v3 k5 k* F/ [* G
        long           val;
+ r5 S: t5 G6 W$ J) j1 U: Y! D        long           size;
9 b: C0 J: x: _& E5 f0 @        int            i = 0;1 K( ^/ Y, B$ {3 d% F

  e! E  N% ~) M; A  d; Z/ N7 q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) k9 ~5 [4 i' ^. U  f: f+ ^                addr = base + cnt;        /* pointer arith! */. f7 C4 x2 u1 [+ {
                sync ();
  `5 |! J; Q6 K2 L6 c/ q                save[i++] = *addr;% m2 \5 U% B* R6 d
                sync ();8 _* ]0 B( y4 U$ i/ M
                *addr = ~cnt;
4 b9 e, G, G5 b; d& [7 [        }8 F4 G2 W. u- o! o$ J

; t' F8 y4 ~1 U% \/ P. d2 I, e        addr = base;, ~0 ^1 L" N& q4 [, ]" s
        sync ();
! g, E5 k1 Z4 S7 e        save = *addr;
. x1 B( M1 c0 S! b$ N' O! p# g- B        sync ();$ n: j* k3 P8 Z# ~
        *addr = 0;+ f$ S' ]) N) [1 Q% e9 ^
' i. k  [7 Z. E' L8 M; ]" V
        sync ();
8 `- }  e6 J( S. x- {9 M" k/ H        if ((val = *addr) != 0) {( I9 W$ G" y7 i2 A# X; W% W& f( Z
                /* Restore the original data before leaving the function.
" n! [' p  A6 W+ L                 */8 O/ D8 T' {6 B& i  Z
                sync ();
4 N; o8 z. ]" b                *addr = save;3 V- f5 K1 E5 H3 O% o% V- v+ F7 ~
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ M/ E* @+ G7 W; Z* t
                        addr  = base + cnt;1 f# p3 }3 b  [' j7 Y/ u. V3 N+ d
                        sync ();
& _# t" u+ T' i                        *addr = save[--i];6 c; ?) O4 ?( X7 K/ f) x2 |
                }; w; F2 Q( Q8 I2 v4 J
                return (0);+ n% B) N: D% Z8 b3 W( i
        }
; \8 ~7 e" S: H2 [- _) Y- F) F$ z) P8 m( \* ]8 S% S
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. h# j2 Z3 {, d& P                addr = base + cnt;        /* pointer arith! */
0 P4 U2 ]! U( g0 q                val = *addr;5 {8 z, C0 H0 F' N, k" ~2 m
                *addr = save[--i];" @3 `8 J& a  h7 w% f
                if (val != ~cnt) {
, m7 q( ]/ \  x% {                        size = cnt * sizeof (long);1 }, n8 s( w7 z, {
                        /* Restore the original data before leaving the function.' n4 M% ?- Z2 U6 r0 ?- g, l1 F
                         */
7 A) Q( k/ h0 ~+ _                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' O* Z3 Z3 o# \
                                addr  = base + cnt;& v) d8 O, T0 J+ Q
                                *addr = save[--i];
* j  _3 N! J# i: [0 w  D                        }
( L% ?6 {* z$ N+ j, w6 k0 \                        return (size);
  r% |  J: G  e- {                }% R- m1 m. e/ g2 Y
        }3 b6 i% ^: x: ?, V( L2 U
) d: t7 h  H" k2 }
        return (maxsize);
. i( U$ {  C1 M% r$ X9 ]5 I# |% F: Q}3 r& r; j/ H/ o$ R5 c7 ~9 Z
int dram_init(void)! u2 K* ^6 z% i2 R, s. S" o3 r
{
! u9 ?' y2 I1 v4 a9 y        /* dram_init must store complete ramsize in gd->ram_size */2 E# O6 b  b" L- I; _* p, y4 t
        gd->ram_size = get_ram_size(( P, U5 Y7 S7 r! O! n1 w" d
                        (void *)CONFIG_SYS_SDRAM_BASE,
9 H2 D9 Z" h& S* O                        CONFIG_MAX_RAM_BANK_SIZE);9 T! E& p5 A( g
        return 0;- F+ o9 O' w( a. n3 J5 K7 O/ Y
}
0 o9 F" i$ K" Z: L/ R# P/ P2 V& V
6 a* i6 C. d5 t0 d  ^3 y& U. b
" Q3 {7 C1 V/ B$ W$ l' d
& }9 A$ r1 g; @3 Y5 J
8 a: ], ~8 P3 C- s, gFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& G# A. r4 t) {9 q9 B1 u/ u! ~* R7 f2 v& i. z  {) e  W/ V

; C/ ^. ^) x- G* z
& n# X" Y% K" R6 b/ l
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-25 22:08 , Processed in 0.037160 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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