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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( X& z) M! U, t
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! b; \% j4 O3 X+ \$ w5 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?6 @( }% m3 ^- d

1 K% B: ~" Y, H9 V( [0 v5 \' a9 }- _是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& _3 E+ u: a. c4 F  ~- A  w/ q. @
, M% b( Q! G0 Y( j" Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% z* G; ~! S8 Y. D+ I
/*
0 e+ D5 J, p! K' V/ h/ @1 a* Check memory range for valid RAM. A simple memory test determines5 u) n! g* f, b! P- [. i; [
* the actually available RAM size between addresses `base' and" @0 E: ~1 O& i3 p! p
* `base + maxsize'.
- \( W; I' f/ u( p+ u*/
* q% J( ~2 o& H! [long get_ram_size(long *base, long maxsize)
! W+ Q/ Q( j, v0 Z{
  c: B* }" @: M        volatile long *addr;  B5 b. x+ j7 `' o
        long           save[32];
' m2 J  z/ x% Q& L        long           cnt;6 q6 N+ d9 B4 g& o4 l
        long           val;
7 @( \/ S! {. l& u9 w        long           size;3 o0 r& ~0 F- N, K
        int            i = 0;
. b+ f) B$ Q2 f8 m) S4 k! t) F& F7 v! ~( l
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& N" L' Z9 \! K# D. y8 _7 `! y
                addr = base + cnt;        /* pointer arith! */  N$ N# p" R1 f! ^/ j+ f3 }
                sync ();
6 `9 E1 G+ D8 I0 c' h0 |                save[i++] = *addr;
7 e& [7 a! r! y                sync ();6 P$ k, L& {6 R$ e- x  ?" U& J
                *addr = ~cnt;
- e; p. N) f4 J' M        }9 l* ~2 {- d; D# A

. Z% g( O8 M. D9 ~' d        addr = base;
, n7 j( u, ~! Y: A        sync ();8 D) k+ F7 J9 M8 Q$ h
        save = *addr;
- f9 R2 |9 s- }9 w1 C7 T        sync ();
( ~# m4 W5 u6 A: o        *addr = 0;
, q, M; A( E! l0 Z8 _/ g4 t0 D8 t9 K4 _0 r: o
        sync ();! d' [& L' E$ |5 H) F3 w
        if ((val = *addr) != 0) {
/ E5 l) `% Q9 w) s4 P" k                /* Restore the original data before leaving the function.) N+ f: H2 V8 @8 t  j( e( M, O
                 */1 |" r+ K3 h- F  `2 {/ z  k. J
                sync ();
5 ]' [+ m, z; f1 Z- _& u                *addr = save;
8 e; [: L# N. q  V! p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( [7 R; G2 \9 c: ]                        addr  = base + cnt;
' t3 F, q9 P. _1 h  k) e$ E1 U, F3 g                        sync ();
' |( e" B- {2 U: R! ~4 }                        *addr = save[--i];
3 X+ @, ]' |1 G' r                }
: M; b; R' d' }; o: Y4 |- A                return (0);9 M4 \) @+ n- I6 f
        }) U, R' V/ y2 I  N/ T8 {3 u

" {& G8 r+ ~4 \7 C        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 |; Q: W; Y1 }+ _* C: {                addr = base + cnt;        /* pointer arith! */7 R" H4 x1 Q) t8 J
                val = *addr;7 n9 ?' S* y2 X& Z& g0 I/ L
                *addr = save[--i];! ]2 {: n( M/ `) \/ X) f* i
                if (val != ~cnt) {4 F+ E7 ~0 n8 l
                        size = cnt * sizeof (long);4 P; H0 a' a: j- c
                        /* Restore the original data before leaving the function.$ g! z8 u: }8 u6 _1 C* E
                         */
. L" m% p8 C- M/ E! _1 x& s                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) j1 o* b, l; D$ i, s) E                                addr  = base + cnt;
5 d0 K$ i% l  ?& n- d                                *addr = save[--i];
- d- o- C* f' H" `( n+ c) O                        }
9 ?5 \; [' b" {) y3 o- ~                        return (size);
3 _& A% d& b& s' f6 H8 M8 n2 W! g                }
7 ]+ W5 ~- j" ^' }/ w9 i) u7 a        }
+ X1 z" \$ r! l. t8 K5 |$ D" K8 m1 \' C
        return (maxsize);
: z: B9 k4 k8 F% {. E5 Y  h}
8 B& D0 M" f  n; Q/ d9 Qint dram_init(void)
1 l- \0 r' P: u( P{
, ]6 ]' i; W& V        /* dram_init must store complete ramsize in gd->ram_size */2 j/ x" K- G- |# r& q8 Q6 Y$ n! G3 F
        gd->ram_size = get_ram_size(% j& }; B/ ^0 [' n
                        (void *)CONFIG_SYS_SDRAM_BASE,' A, r3 P8 X' a5 @1 |1 I, u- _! K
                        CONFIG_MAX_RAM_BANK_SIZE);6 w9 f8 d1 M. e- ?0 c
        return 0;
& c1 l; C) y% h# R- t}* A8 h5 g3 T! a
4 k2 H5 @$ n& h" j4 l8 U6 V
1 m5 E+ _) Q# V# E

- e3 T$ n9 i/ E
8 E+ y/ ?* [0 l9 k  H, ], \3 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& u  }! g- g* U# Z

/ l# C" N* U7 a' H) H" R; b' I1 ]% F

8 I  C# R1 @; c+ }; j( A: ^' D
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 06:46 , Processed in 0.037675 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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