TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- F3 @) k- A  ?) u核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, T  h7 K; R* Q6 n/ Y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  x; \6 a9 `, W6 S7 q. Y: M& Y" U/ U" I

6 _6 i6 \. S% ~. z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) Q" a; |/ u4 o; u; E; ?  U

% m* M# B. j8 v7 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) o6 S4 p4 z/ D, S7 C
/*
4 l. R5 g8 e' f* Check memory range for valid RAM. A simple memory test determines. e' Q" p. x: ]4 ]
* the actually available RAM size between addresses `base' and
, W4 e8 M# ~- Z& m0 ~6 i& P* `base + maxsize'.
' O6 j. t/ }" K$ k# ]% J*/
) M- q3 L& A" F0 clong get_ram_size(long *base, long maxsize)! M3 @; q* c; i1 I) J
{
9 J6 m9 t2 N8 w' q0 M+ d        volatile long *addr;& e9 K# A2 v" Q
        long           save[32];. }; s( M8 {' g" \
        long           cnt;$ d1 ~' u+ I- g
        long           val;
7 q& R5 X5 P' N' a6 C2 }        long           size;
6 H( W" U% |( F        int            i = 0;3 C$ c! d/ [- x$ ~+ ~

' y! H* A% {1 C) k6 h$ k        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" u0 [( v" _/ k+ @" ]) c
                addr = base + cnt;        /* pointer arith! */8 h' m9 U# h1 c9 U
                sync ();8 ]3 x0 Y7 w% e2 o
                save[i++] = *addr;
: N  O7 [1 v# r4 }$ Z. O9 I! ^                sync ();: o$ d$ r; [: y6 u" x
                *addr = ~cnt;' M6 Y) I: z" _
        }
7 d# p$ ?' j$ Y& [7 X( _; I: U  ]4 u8 e  G3 o( `
        addr = base;
  a! Z8 D3 T/ F. z; M9 J        sync ();, P& z4 q* `# t; ^' e: I7 A
        save = *addr;$ [$ M- i4 b# d* M6 f/ u
        sync ();
. G) b+ ]  C6 T  w4 m' [        *addr = 0;
( Y, S9 B* ?, w* m2 [3 D, t* J; q) n3 o  [2 A& T& O; `
        sync ();4 g4 \0 k( i, e5 h; p) N
        if ((val = *addr) != 0) {
& u$ @! o1 d5 T7 b. a# \+ A                /* Restore the original data before leaving the function.
$ P/ }& t4 z7 Z! r                 */
& B8 d( J/ Q/ e# R, h( ^! K                sync ();" D, R1 l+ O! `2 @+ t( T
                *addr = save;" _( Q' L, C& N6 u( j
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 r  Q# y0 L  r! M4 j  d                        addr  = base + cnt;
3 s8 t+ H: x% H& ^. l; v                        sync ();- h  k4 B: @/ v# _0 R/ t
                        *addr = save[--i];- k/ q$ y( R2 k# {) T! x
                }, K2 H2 y: [# ?
                return (0);
1 y% C0 [0 `7 p8 |4 m: C        }
# O1 ?+ M% C. d' G9 [1 T- x% `6 A. q3 Z" G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* b) Y8 J9 C3 X4 C  p2 @                addr = base + cnt;        /* pointer arith! */& W1 g5 ~7 E( g3 m+ j
                val = *addr;
6 W; U: P1 h* F* S" j& B+ r/ i/ `" @9 M                *addr = save[--i];+ `! H$ {7 s  R% O
                if (val != ~cnt) {' r2 k  C3 S  [$ a* w% c
                        size = cnt * sizeof (long);* ]6 e) ]! }$ Q- \" l1 c8 l
                        /* Restore the original data before leaving the function.
9 L0 B4 F3 P$ `$ G  R                         */4 l: x6 _' t5 R: U0 s& S
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: X1 D5 ^+ S# a# J# ^' V                                addr  = base + cnt;( r) @" R% I# P9 A1 t: ~
                                *addr = save[--i];
6 _, _% P2 M1 M$ ^' g                        }
, y7 i4 K& m9 L                        return (size);1 I+ [* B. ?2 t; }& S, l6 [
                }
& t- V% h1 N% M1 f; n        }
4 i, C+ c- J' Q1 B7 L& y7 g: D" r; n$ Q6 E# {) T  U- E& S: I
        return (maxsize);
: z& x1 H. e6 w, W: T}* K5 V% t* J$ ~$ ^
int dram_init(void)
4 A; E9 N5 f1 Y8 P5 d0 C, z# O; ]{! ]! f9 R0 M: u$ g! p# W  v
        /* dram_init must store complete ramsize in gd->ram_size */1 r1 N3 Z7 u+ D' X  m
        gd->ram_size = get_ram_size(
% \9 M" `! a' m, S6 V                        (void *)CONFIG_SYS_SDRAM_BASE,
" V, G0 c/ ]  P+ R& W                        CONFIG_MAX_RAM_BANK_SIZE);
( o: t$ S- L. e% p2 ~        return 0;$ P4 |( H4 P7 {9 _
}
* X" g  R+ {  O) k5 I- j( ]3 ~7 ~6 \. x/ D

' g8 F! A5 p- f* I
8 j0 S/ t, h! {$ p
2 ^" p- e; j" Q6 ?* qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. Z, v. r& w7 c3 F8 e
$ {% ?! y% N* {

0 V1 Z9 N5 F; p9 O
9 o) n9 g# r% L. g
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-4-4 18:20 , Processed in 0.038183 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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