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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( t) d4 q' A; \1 V/ L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: d# e3 t- y( J) ~+ v% p/ }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; C3 a( l# t9 X! v2 R4 m

) v2 j$ }6 k/ T2 P9 s1 k" x* |8 k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) @: r. f9 ~2 J2 J
" L: p- S" B9 _; B$ s# b- d( v" t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% s; D  c3 N8 \+ z7 |  R1 m
/*
) @# y1 F6 T( x0 _9 Y* Check memory range for valid RAM. A simple memory test determines- \7 @7 K1 O) T
* the actually available RAM size between addresses `base' and
0 D6 T, b) a3 ~2 ]* `base + maxsize'.
) o  {5 s5 R9 N6 ?*/- J  z% U0 H$ w) q
long get_ram_size(long *base, long maxsize)
5 P  q0 ]3 H/ D{9 s1 ?  I0 p" Z& x
        volatile long *addr;
8 G. F1 t9 {2 t, L! M8 h8 ]        long           save[32];
) v  F: _5 F0 h7 m( a( Y        long           cnt;
7 n5 h% X4 a; p# s% F4 f. N0 U' _6 S        long           val;
  c  _! W( F( ?  e( W7 [, Z        long           size;
: {5 O, x  [9 ]: ~8 [9 ?# }        int            i = 0;
0 q. X2 t/ q, o- p8 Q: w; f2 O% y4 Q0 i; Y. j2 e4 S4 @9 \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  d# ?6 `. a1 j" y1 r
                addr = base + cnt;        /* pointer arith! */2 ~0 }; J& r! T3 s
                sync ();, h, U( r- Y0 ]$ Q1 |$ i  U
                save[i++] = *addr;
; N$ w* v$ c) f: w7 A( X- k                sync ();* s. G( Y* f3 y7 s7 @5 ~/ m8 K5 t0 e
                *addr = ~cnt;, c. s+ k, W/ ~- K
        }
2 P2 o( o& y5 `/ M) k. D) V' f  A* |$ c: L
        addr = base;) D3 R' n' D1 d& q% ~6 ]$ Q8 R% X
        sync ();
6 G3 G4 L" M1 R* }, i, V9 G        save = *addr;6 @9 \7 A; E! W5 B. i$ v9 v
        sync ();
/ D# Y9 w. v6 X0 X+ E& g4 V' T        *addr = 0;
& H: q; ]  e/ d. g" g& w
% t5 c! }( w2 R) m, ]/ N/ j  @- ^        sync ();8 ^- p# o5 q8 L! K# c
        if ((val = *addr) != 0) {, N( ?: Z. Z" |* S5 @9 E0 c- @
                /* Restore the original data before leaving the function.
3 ~1 m- N  Y  J- f                 */
- V4 u6 _$ h4 x0 o                sync ();6 v( _4 t) a9 q9 E4 d# T+ D& {
                *addr = save;
' E! f1 a( k2 L                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 F/ I+ j. _+ {                        addr  = base + cnt;
# I1 F# H8 J9 g% h' m. R, T                        sync ();
# o. m- I  u3 o                        *addr = save[--i];5 B9 d# A( n' A3 l7 G$ k
                }
  p3 R4 M/ Y4 T  V                return (0);' R/ J6 o' D9 Q5 N1 ~& P
        }
5 I! f/ E8 e& \" L6 z" `) g& ~& b4 R. n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  P6 o3 w* a  }. [' M/ G: k                addr = base + cnt;        /* pointer arith! */
# i$ ^$ ^2 w# m4 p                val = *addr;
4 D4 K7 x+ K. U& S# T# z1 @% Z) e                *addr = save[--i];0 U% u5 M+ D8 A
                if (val != ~cnt) {
2 T+ Z& W9 N* ^, x5 V                        size = cnt * sizeof (long);
$ n( n  V0 e& o3 s( R0 c                        /* Restore the original data before leaving the function.
  |6 q4 F, ~0 K4 [0 X) v6 F                         */
. L2 |4 B) W/ Y, j7 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ~) V' j; E- W                                addr  = base + cnt;
+ \3 ?1 n1 b) ^7 E; _                                *addr = save[--i];
1 z6 I; h6 ^5 W: Q- ]                        }/ H/ X6 U3 x' j9 ^- }
                        return (size);
# q1 [- B" ~9 P/ l/ d9 [% v! w                }
. `; t, ~$ y9 b4 }. P% D5 h        }: e( }9 ]# ]% ?+ D2 e) d& L- m
2 T  z9 p: n8 M
        return (maxsize);
' l) _7 _) D8 C1 {% D! d! @}) L: h& S6 M+ e; w9 ^* @
int dram_init(void)
7 |: \1 {  f, _, m( _{" @! M9 q/ w; r" T) u
        /* dram_init must store complete ramsize in gd->ram_size */8 v; c0 d8 N# e6 a; ?
        gd->ram_size = get_ram_size(
* N* e8 R% c5 t                        (void *)CONFIG_SYS_SDRAM_BASE,
$ C9 s3 r: ^" c) U" T                        CONFIG_MAX_RAM_BANK_SIZE);
! [8 Y6 p! b- L        return 0;1 q8 ^. Y7 ^7 W* t! s
}
0 \# _4 Y8 q8 T) ?' [, W5 ]# K' N- p7 Q$ V- o' e1 V# ?' S% T# V

1 t% w: z) ~( g# c* z
8 i# m1 V! n7 Z/ B+ p
9 T8 l1 @! y: G' V6 s% M; Y2 yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" R* D; v  G: S! [% x% P* `
. @5 @# w1 v( z% D
0 s3 m, d; G1 q/ |1 S7 X* b1 e

; ^! G/ p3 u; z) F& M3 o- U+ z
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-13 01:13 , Processed in 0.039461 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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