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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. L- r2 t4 o' r9 r核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 S* g1 j( L2 Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" i$ S( e$ U" N) c
. V6 m. q, o% S* g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 M+ {2 e5 T8 |- P, s
3 H- i/ l- Y) c% V; v4 a5 w$ K. C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. w6 K( I) ]* R5 R1 k1 J/*4 [; K  ^. K2 t$ `
* Check memory range for valid RAM. A simple memory test determines
- V0 b9 `) d5 }7 i* the actually available RAM size between addresses `base' and
$ H1 r! s2 V9 |6 C* `base + maxsize'.
3 Z4 T1 {* w. C, u4 i1 t*/! K; p& o" c( [& g1 k% }
long get_ram_size(long *base, long maxsize)
$ |* S" r1 Y; X3 N2 g{
& h! g, B/ }% U! Q        volatile long *addr;& y8 N7 r: q6 S* T- X! [
        long           save[32];
+ M# k- J. J- L8 \" U' H8 S        long           cnt;
5 i/ K/ e* A) e" u        long           val;3 i5 `2 p5 ^* o; d0 s: y2 z
        long           size;
: y8 h9 B$ V! H- U, O        int            i = 0;
$ B9 J4 S# B$ A$ @
* o) d- c7 c4 t& J$ V  [( y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& @& n0 P3 G0 ?; |2 g                addr = base + cnt;        /* pointer arith! */
; w0 U" x. N! B/ ^$ _: h4 l                sync ();3 y$ `7 ^3 K2 D/ Q! X' o
                save[i++] = *addr;/ c) A" r% T: |, k2 C6 m
                sync ();6 b4 }& z8 l4 H$ L- P- N0 ]
                *addr = ~cnt;- b( \7 [7 C7 S/ K4 Q8 U
        }- v) _! v+ G- Y

7 d+ w4 E1 e% A- |; R2 q        addr = base;
5 V- w$ _! @: D        sync ();
" H4 _! t- W5 g2 k        save = *addr;
( L! n) ?( }% H+ Q/ c8 q        sync ();; E. q' j# ^  K! J+ ?  z" B# B% y
        *addr = 0;. s- O/ l6 q7 H! S8 e

! m0 }! J+ k9 J8 i/ _        sync ();1 D4 S, n1 Z' w$ r) ?1 r
        if ((val = *addr) != 0) {$ ]% \/ y9 }5 M5 C# V0 s
                /* Restore the original data before leaving the function.
2 L+ X; A8 `  K2 X& y2 S6 H                 */
3 o& m4 I4 d& i/ b2 ^                sync ();
4 e8 h; O! k# Y: P% U% M                *addr = save;
' l+ K5 l" |2 q( P* U& l7 n& I& ~, y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' w& y: A) Q7 |# O! j
                        addr  = base + cnt;( Z5 _4 K0 J9 i) x) z$ t% h. x
                        sync ();; x7 C7 ~1 l6 N5 G( ?
                        *addr = save[--i];* b4 ^2 N0 L4 [9 C4 }1 e
                }
7 a6 M; V5 A8 M4 Z. H0 ^6 q* o, r/ l0 ]                return (0);  M8 O- A! b0 q/ a6 |" @1 G
        }" o6 |$ _8 J" [% l' g& G* A

- Q: p2 b- l) b        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ h3 p+ C* H( B/ J
                addr = base + cnt;        /* pointer arith! */# P* r5 s! E# k; b) g8 F! {
                val = *addr;
' Y/ B3 H6 p4 j' y1 ~. h                *addr = save[--i];: X6 V9 U/ }# T" l0 Q& i, R, j4 h
                if (val != ~cnt) {
" c9 [4 T4 G  L1 Q* m. Z                        size = cnt * sizeof (long);: ~/ z, w- p3 x4 w
                        /* Restore the original data before leaving the function.
0 e5 b1 \( F1 f2 z$ a5 K- [7 I% b                         */
! M& f1 ?( i# t: s2 e; n( @0 ~                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 R0 Q) v/ N& X% v0 s( i
                                addr  = base + cnt;4 i$ p- ]1 C/ P3 N5 y9 W: e. t
                                *addr = save[--i];
7 |  C4 m( l1 s6 f3 w. Z8 ~) e                        }1 `1 p- F2 J: a. s9 S0 C$ O8 T
                        return (size);
3 r! z" C- u& _5 y0 L% v                }
, J6 q' H. t7 G% G+ G3 }- }7 {% @        }
3 d1 D6 @# ]3 x
8 _( Y7 z) P, f* U- j2 g9 D        return (maxsize);4 J3 j1 @. ^% H# q/ C! G% v
}
( ]8 ^3 b% ]' m3 kint dram_init(void)7 d* X7 z, G5 I5 f" Y: j# ]
{
; A6 G; X' `1 Z8 I& ^6 j        /* dram_init must store complete ramsize in gd->ram_size */
2 M) G3 a0 W  i% a& n        gd->ram_size = get_ram_size(( i3 F' l1 Q. W5 ^
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 x+ @3 G/ V" }% C                        CONFIG_MAX_RAM_BANK_SIZE);4 Y: e" f7 l- @: N
        return 0;
* j5 a/ h$ h5 w! v}4 E0 A% c3 x  t- k

3 t; s$ {  f1 k9 `/ L2 E& M6 k/ U. J) r! Z
7 o9 M8 ^7 |# l& F- v

# y* g: W4 e& X; ?5 m# X6 A. a5 kFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 u$ R% q* B! e, r
* J2 W( R: G! v; Y+ P- i4 v, s7 _% j4 l& u2 [# i8 p$ _

# ?5 H6 @6 B4 z5 I7 Q
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 14:34 , Processed in 0.035390 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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