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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( w( X' s+ ?" q核心板2:DDR2 256M Byte   NAND FLASH 8G bit, F/ D! P# M! p: v4 Q. O+ T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% f4 R6 C( e( Y) l- _  E

3 e9 l8 A- [, s) T: L( a; }是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ w3 M8 a+ g3 g0 S3 {, }5 O% K
1 g& d5 ]' i% X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, [0 e5 J7 `  A3 p% R2 w
/*
& n0 K* D1 X8 m: S* Check memory range for valid RAM. A simple memory test determines- i- }% K  G4 Z
* the actually available RAM size between addresses `base' and! X5 c5 m) z% p: h+ [  k
* `base + maxsize'.7 [% C% @: r1 g0 x! D8 a
*/# f3 h3 ~& R& L& N
long get_ram_size(long *base, long maxsize); v& d+ i  c5 k8 |+ F: I; B
{5 l# t. U2 g* B( N4 O' p. U7 B; K
        volatile long *addr;$ F4 `( w! v% D- I
        long           save[32];
. a: A4 V- L7 V2 V! h  h        long           cnt;9 w2 w& }) R9 f; w3 f+ _
        long           val;: o  Q6 }6 F) j' H" Y: L
        long           size;
# K0 P# n! O4 }        int            i = 0;9 s1 ]$ K  K# R8 f
# q5 y1 T8 E2 D% c+ i+ |$ z( W
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 X4 l3 n) s+ l7 w* m8 j( v                addr = base + cnt;        /* pointer arith! */: f% ^( u0 m6 t& ~2 r. l
                sync ();
5 N. A% [$ M) [! j% |7 U                save[i++] = *addr;+ e3 o! D: Y+ f* `6 H; R5 `
                sync ();
* T6 \' D1 d5 C$ q8 v+ A% S: @$ m                *addr = ~cnt;9 a! ?: s" d% D+ B) j
        }% P1 V4 A: c3 b4 l0 c& r1 I+ F' H
* }# z! `: o6 O6 U7 G' z
        addr = base;
' Y) p2 n* f0 @1 }3 Y! H0 g" Q- {        sync ();
4 F! K5 \$ T1 l1 M        save = *addr;" s' R$ R, f7 I# m- P8 p
        sync ();
) t, b2 v* C- w2 M$ }        *addr = 0;
) U6 R* M( k. k. b- |& a% B8 R( B9 n, K& b$ d/ N: L% p. M
        sync ();7 e+ x6 h4 z1 c7 n' d
        if ((val = *addr) != 0) {! y9 ]0 W6 m' B  o1 F# h1 F
                /* Restore the original data before leaving the function.: O9 e6 a/ J4 ~& g
                 */
' j" R! ]5 b' w; r; h% F4 g                sync ();
5 c* F" x$ z9 `/ n) q* E                *addr = save;% O( k8 j/ X7 x) N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 x$ t0 K. p# w* u
                        addr  = base + cnt;
" @2 W$ [5 ^- _/ s                        sync ();
1 _( Z" \) T4 t! R( z) S. R                        *addr = save[--i];
/ e# N9 z0 ~5 D) `) F* [7 S                }  p& b/ \8 y( K. ~1 w
                return (0);: e. h! f% ~, Q1 n) c
        }
# e% `! z* V1 u7 y
9 Y, c  U8 ^' B+ {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 U/ g, c3 }9 K: `  d# d, S                addr = base + cnt;        /* pointer arith! */
  W* o0 U! f$ v8 T                val = *addr;* {& F* F) M. P( {  F/ L6 x$ M# e6 i  e/ {
                *addr = save[--i];$ o& v2 l# ~0 Y- ~5 c; L
                if (val != ~cnt) {1 i" u! q4 e- s- Y# y4 j
                        size = cnt * sizeof (long);
7 W$ f" D) I: L" B5 c4 `                        /* Restore the original data before leaving the function.
$ f7 U9 C3 N) E, T& G3 Q                         */
5 Z: ?4 E0 Y9 M) B                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- d, @0 l9 l  `2 p
                                addr  = base + cnt;
- u3 n$ T2 S% G! x+ ^2 i" {                                *addr = save[--i];; @  {8 W2 A2 I9 Y; S
                        }4 c$ M2 V# G4 d5 y
                        return (size);
# \4 b8 |# {0 @/ w- v                }* ]6 ^. p, ~7 |) V7 M& ^
        }8 _, y2 |/ \' p2 s" z

* j& A3 E( J  O1 u. a        return (maxsize);
" p9 \" z: J8 s0 c" S8 F}
$ W. I8 ~0 A+ k) v! yint dram_init(void)% _( F& M9 E+ {0 |
{) H) t7 g. P- ?: W" L9 L# _
        /* dram_init must store complete ramsize in gd->ram_size */' x8 X1 q- M& L3 z/ K1 }/ ^
        gd->ram_size = get_ram_size(+ i0 u/ w+ H# c3 a+ j$ Q- G
                        (void *)CONFIG_SYS_SDRAM_BASE,
; N4 X, A+ k( J' O3 F5 K2 m0 K$ L                        CONFIG_MAX_RAM_BANK_SIZE);
  A" `- t2 ]$ K' ~0 `3 J        return 0;1 P! M2 c1 j+ g: |7 c+ p: N0 @
}: ~* L( _% C. v2 [7 A
- _9 k; e6 Y: k! r- ^

) u! ~) ?$ T& L0 C% u% x+ k! b" N/ _# U$ h9 }7 Z

* U, T7 c$ h& ?5 h/ @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 A' C7 X3 \2 f% u7 D

: X8 O7 W" @3 M; H7 h6 w; |( X& c+ o; ^9 ^" B9 K4 m' Z% X$ ~

' E3 o9 S& ]$ d' X9 O
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 23:35 , Processed in 0.061566 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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