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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- T$ z. p3 L5 l+ p核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 l; B  Y+ u" d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" `) B" ?' T! ^4 l

2 m1 O; P" B; P& p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( i9 b& N# b8 R$ P3 p8 e# u0 I' J) c% v2 C$ {& h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( |- A0 [* H8 c2 B) Z3 |
/*
. S, N5 X0 k- {9 Z5 M* z* Check memory range for valid RAM. A simple memory test determines% j! u8 x9 W* S! {
* the actually available RAM size between addresses `base' and
6 O# H1 K% J/ [" R" C6 d8 l* `base + maxsize'.
6 ^" `; H, M/ y% u) ^9 F! ^3 B*/0 P; b6 c; d6 b0 q$ L- M* G# ~
long get_ram_size(long *base, long maxsize)/ s9 {$ w" s$ e3 a2 t
{
7 x$ ^  U4 t! L( `* T        volatile long *addr;. |1 w5 u6 }' R8 U# S+ L
        long           save[32];, O- j, J8 s' b% D9 t$ Z3 j5 y3 Y
        long           cnt;: W0 r- [! z9 v# `( P. |
        long           val;2 w8 r# u) l2 F0 W6 `
        long           size;7 l- D' e0 n: ?, b
        int            i = 0;
1 W; S  C. Y$ x& o6 |1 \  P  V  B2 W) M/ C+ G
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ V4 V$ v3 U+ v+ `
                addr = base + cnt;        /* pointer arith! */" \6 e2 G/ B1 E
                sync ();! s& Z3 Y9 O$ f& q5 b2 L
                save[i++] = *addr;
* a' J7 o! K, K% ?; {                sync ();2 {) B' h) h. x8 I' @
                *addr = ~cnt;
  X! i! n2 I# Q1 b4 e) y6 G        }
7 I2 M6 F: J. H0 n. d4 b8 D
! U8 i( e2 \9 i6 x% J& j        addr = base;( H. |( K: d- R+ D& V/ P$ ?' z
        sync ();
9 }5 G+ \2 n2 s  i$ Y  r        save = *addr;2 u6 i" P6 @0 E9 Y, y& W
        sync ();
5 ?% V, N4 @) t- M, w% U$ _        *addr = 0;! Y& J) ]) s% c% ?% `9 r
& j9 l( T  E& g1 [# V0 p, |
        sync ();
0 M! s( X2 @6 w! [8 r6 x        if ((val = *addr) != 0) {2 w8 T% v3 c7 N$ K) l' R& I3 a9 n5 ^6 w
                /* Restore the original data before leaving the function.
/ K5 o; Q4 W- z, R6 {6 {5 F, L                 */- P' r$ s, p5 ~( L& B0 H
                sync ();
0 t7 m; s: C) Q  D                *addr = save;
) a1 C' z; s5 `0 `4 \                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 |0 u' ~, l, T, P( s) B
                        addr  = base + cnt;
' o. ~" Y& ?6 N/ F                        sync ();7 K( M9 C& J8 z! {& K: G2 R
                        *addr = save[--i];
. y) V1 F8 Z7 q; Z- X                }! z4 r& G/ N6 Z& A9 t$ ~: ]* x
                return (0);9 j+ e$ f" |- X5 F, I7 Q% j
        }: ^" N8 e2 V2 O  N/ @
& D/ p% R& w6 M+ K
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# H7 i  F$ j2 A- `* U+ t' e) p
                addr = base + cnt;        /* pointer arith! */
3 k1 x1 R% D5 h' M                val = *addr;: J: T0 Q& \$ y( G+ U* l
                *addr = save[--i];+ T6 @: H& @( _# \; b# p5 O
                if (val != ~cnt) {
/ n; K7 K" M* o4 r6 ]: l                        size = cnt * sizeof (long);9 _* d. S1 e$ h2 [3 W- N
                        /* Restore the original data before leaving the function.0 I  z. i& j: w4 J$ X
                         */& z1 K# J; k: s' x$ v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! Z' ^/ J- x6 L6 k) p
                                addr  = base + cnt;
2 [- n& Y2 C# g                                *addr = save[--i];
- S! ?% j$ m- E, Z" f7 P                        }
3 k. s; E& I" _# B                        return (size);
$ }8 Z" b8 ^* G9 n9 E: w                }0 F" `' ~% E* W4 _
        }2 \6 l" ~$ b1 \8 O

$ A% r5 f4 c% R  j        return (maxsize);
: [8 l9 ~, @9 h" g& C}
' g8 w0 \  c/ B( Eint dram_init(void)6 C9 S/ P7 s6 r6 k
{5 w( n2 H- D$ A7 P' b
        /* dram_init must store complete ramsize in gd->ram_size */' g" ^; A& `; W+ c" ?9 I# f
        gd->ram_size = get_ram_size(0 ^' v8 J+ O, L' G
                        (void *)CONFIG_SYS_SDRAM_BASE,
' z: }- d; {) W, T4 d5 e                        CONFIG_MAX_RAM_BANK_SIZE);) E; F* S& J! q1 z
        return 0;
1 v4 `' h$ o4 N$ i- u  W2 f}
. i; Z9 E! J0 C8 O4 C& i0 C* a* ~3 A$ y# v: g
" a$ f' z& d1 d1 i
* W; h8 s& @; g
' M, s! ?0 @, S+ r, l- `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; E( X4 \+ t' c# H0 e

1 }, c1 P1 @: x& S
% I8 [1 s( R( B; B7 f4 a" G
( O  l7 H5 ^, S
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 17:28 , Processed in 0.036761 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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