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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 ^, P, E+ l2 m/ `) m3 Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* [7 V6 ]5 q8 j2 h- X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  Y2 I; w; E4 b2 U# |5 S% j/ @. P: M

7 Y  T. ]' \5 A) Q( |( R是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# o( @* r; Q0 M5 e* q
9 Y, B* x: k( N+ I: L9 Y* b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, _  F% J! A" P5 B3 L0 U& e/*% Z! k+ l8 @- H8 W% }$ z8 e7 }
* Check memory range for valid RAM. A simple memory test determines
% o8 L2 k# b0 K1 q3 k* the actually available RAM size between addresses `base' and. S% P6 J5 F. a  t; x# c- r% {2 k
* `base + maxsize'.
+ ~7 V1 o7 p$ A*/
& q- p7 |  m; _; Q9 T! ilong get_ram_size(long *base, long maxsize)3 ]4 m) O! ^/ {0 T2 D3 f; A7 T# l
{7 J  k* N5 V# B: Q8 d
        volatile long *addr;
% s5 F) S/ k" |" s4 q) A* p* z        long           save[32];
7 T8 j6 ?9 G) Q( x/ R% Q  R        long           cnt;
4 e7 c8 ~3 ]& r' r! a9 c        long           val;  ]9 [3 I3 S4 b" U
        long           size;; ?6 N6 U6 [6 P2 z
        int            i = 0;
( ?5 _7 l9 a+ r9 C+ O
1 O9 H7 t2 w9 y7 S7 t8 g$ Q& t+ t* g        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 J( o/ y1 k9 S1 w& c1 p
                addr = base + cnt;        /* pointer arith! */
/ w5 o$ [8 P  ]1 K4 l                sync ();; q, p) |: O! U( u* u" D
                save[i++] = *addr;
( S: u/ _8 x1 H8 f: A& X! E                sync ();
0 V, a! Y, j5 d! c* t- X+ I1 q                *addr = ~cnt;; ^( S- J& G% g5 s) N
        }; H& `; y9 E9 [

$ ]  v4 C4 Z4 V% c        addr = base;
) e8 t6 o  w) E: z5 R        sync ();
$ N; ]& T# ^3 R; F  O6 `        save = *addr;9 ~4 e$ J6 K* |
        sync ();
) i$ i# @+ O' q        *addr = 0;
7 U) m5 d# ?/ S% f
$ w# |6 I7 Q: F$ P6 s. A        sync ();/ }# I0 ~) i: K- U8 O
        if ((val = *addr) != 0) {1 e4 z! E: o  I" U
                /* Restore the original data before leaving the function.
0 w; z" q  }! d8 Z9 L. J                 */
' Y3 T- H$ l) M, i( f! R$ `  ?/ p2 X: k9 w                sync ();; Q- R, S6 b9 `* ]. o# m& i0 ?
                *addr = save;8 ?: \0 c4 z* z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 l7 o/ u& v' T! f* m
                        addr  = base + cnt;
6 y$ s/ t" e' s& z+ f                        sync ();
- y) h8 @* i7 N                        *addr = save[--i];
# t( Z. J! w8 X3 m5 \3 F                }
, k% M. g" b. f! `# e9 ]                return (0);; j" t1 I7 f1 ~/ B
        }! d7 Z6 B5 P& ^8 S

* ~3 [( l# p" q0 o  I5 `        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. X( d, I/ l. g) I; o0 x" n
                addr = base + cnt;        /* pointer arith! */1 X8 Q7 q, G" Q
                val = *addr;
( T7 m$ U* p8 B. @6 w                *addr = save[--i];" Q, k% B& k& h, t. p  _" J, ?
                if (val != ~cnt) {) r4 d9 ^  U8 l+ A# W5 l  u
                        size = cnt * sizeof (long);
5 B; T7 ^; g. E! `. V                        /* Restore the original data before leaving the function.
1 o* u$ t( T4 W, \/ w' h                         */
) _$ \& X' t- r. Z6 ~  s! l                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' d) g6 p6 \8 A                                addr  = base + cnt;
* Y" }$ [2 D8 m+ h8 a                                *addr = save[--i];
. L+ P1 y/ X7 F5 t8 w$ ^9 N                        }" C! f) y1 T2 U" b# E
                        return (size);& z7 n3 g  _8 w, M7 d) _6 J+ U9 [
                }2 Y" r: H$ I0 b
        }* ?' U. L; i2 p0 p2 O4 ~
/ \8 X# d+ C8 t- @
        return (maxsize);0 N, g  f6 Q- K1 ~# w# A' P/ j
}
  L# p' h' m  S3 tint dram_init(void)- F. S# i8 R, W$ f  i% Z% k1 d$ s2 s& Q
{. _. k* v3 P2 p% F
        /* dram_init must store complete ramsize in gd->ram_size */
2 I/ M5 G4 I" _/ H4 N. }  _& ]$ Z. g        gd->ram_size = get_ram_size(
  D1 c' c) p! T! s! q                        (void *)CONFIG_SYS_SDRAM_BASE,
; N8 }$ L! u$ d- Y1 ~' J                        CONFIG_MAX_RAM_BANK_SIZE);( ~1 n1 r" [$ m- l9 x, a: g
        return 0;
8 Q3 `1 X; M- P) z% t2 k  q}
+ ^( ~. ^; G' F" Z: L: ^1 D; @& }; B: [2 j- ^( ], M
$ d, ]9 T  [% _
  e/ l8 h& |4 V7 f2 }( J  c! F
5 [, T) H# P: l! I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 `. e  q6 M, f. U! x
0 S; n; W2 i7 T: N0 J! a2 ?% S; j) P7 A4 y0 t

. o+ v% t' o( w/ @4 n
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-6 22:59 , Processed in 0.043412 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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