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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 H0 Z8 v" K3 {( u核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 q. v5 E' L4 ]" `: e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- t* f& I3 c- F0 Z) V$ C
( y  Y* K4 }% n" E+ p" ^0 o3 @5 F& O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* B% d( ?# q$ _/ A) \4 a+ ]6 d! }& F
7 n+ \7 [& i  A4 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ Q! B8 q5 I2 S3 }1 V/*! G' Z& i4 A" A6 @9 N+ m% y
* Check memory range for valid RAM. A simple memory test determines
& b9 q0 \# x; |# a' ]) e) J* the actually available RAM size between addresses `base' and
6 p0 @* n2 l% a! @! j* `base + maxsize'.( K% S. d( x( B8 Y5 m" e) l
*/
- J4 T& Q: E9 H4 c# }- Y! Ulong get_ram_size(long *base, long maxsize)
+ Q# x! d1 S' K{
  Q$ C7 C; a7 K' Z$ M% w        volatile long *addr;! ^( [3 [$ G; z' ?# }  S! z  K* e. I
        long           save[32];5 \4 d1 s, i8 [
        long           cnt;
0 \9 B: `7 V5 K+ G& R8 @        long           val;
. F8 z% r7 [6 m; `' f        long           size;
9 Y7 p" C5 Q2 a1 k( f0 b        int            i = 0;( B4 S/ \/ o" I+ h. A0 w# I

) ], [! v+ M! O& O9 L5 w! r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" c1 ~. z, k( ^, K                addr = base + cnt;        /* pointer arith! */. b$ Q1 J* Q* W7 q8 T$ a
                sync ();* E: j$ ?' T9 s9 k
                save[i++] = *addr;( w7 O" t$ z3 N! l7 y
                sync ();
) Y0 q6 L" D$ T0 l% J                *addr = ~cnt;' U# C- I) r5 a8 J
        }( i# d" w/ {% V/ ~2 E' A

0 l& t. h7 H4 M: N% T5 u3 s        addr = base;
0 y+ C1 m0 ]1 M  ~; ~2 Q# P9 T# U        sync ();( E( U' K$ T/ s& _
        save = *addr;& I0 s5 ^8 B# {3 l4 V7 Q
        sync ();$ U4 E) M9 o1 z* s. Q
        *addr = 0;
% G/ t( W0 g8 Q5 [9 q3 d7 a: p3 c( J9 X2 g4 G
        sync ();: N( X9 p1 ]; M* Z
        if ((val = *addr) != 0) {
6 C' k" x  c/ t( h                /* Restore the original data before leaving the function./ g% w0 V( b  e7 R4 M+ f/ P# ]
                 */
/ w# f# Z( \, Z) ]$ f0 K0 r7 e                sync ();) i' ?; c/ x8 W
                *addr = save;  L0 R* |9 w& l3 J9 Y! k
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& S' N/ K* O/ }6 Q, l% O# ^5 y8 t
                        addr  = base + cnt;* s+ g" l4 {1 x3 e  I% j
                        sync ();
$ F6 W2 {% S' |* o                        *addr = save[--i];
' K1 G, _5 D7 j$ \# a% M$ t                }! [, {: n# d# F
                return (0);9 {$ ?( P; V3 y; D: ^
        }
& X: t7 F3 H/ k0 _% I5 S; z9 |! C/ y+ b1 B# x: M' |: p
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 p0 ]4 ], n( k; g. k
                addr = base + cnt;        /* pointer arith! */
9 r5 L# K( [. L                val = *addr;
  _1 a, V. G) i' Y+ Y                *addr = save[--i];
8 r+ P' d$ K9 s0 s) U" R) ~; Y& v                if (val != ~cnt) {
9 @2 ]; |- K( M  V3 }                        size = cnt * sizeof (long);
9 Z( q  X3 E+ N& E                        /* Restore the original data before leaving the function.* p8 e; A5 \8 s7 P2 k
                         */
- V' Z; B& ^& ?) c) k. |/ j                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% Z3 Q; k8 Z2 w1 N" h                                addr  = base + cnt;: c" B* C. j7 B2 H* R
                                *addr = save[--i];3 {0 E) r: ~" n1 @2 S* ~: N0 \
                        }
& t, B) a( W  G# F4 T7 s! O! `                        return (size);, i9 y6 I0 w* i
                }
9 @/ r; |& C& P7 l        }
% a& {# c+ M0 K8 Z! ]9 O/ q% r) u9 ?! C6 S1 F% K: K* X; c" Q
        return (maxsize);
1 ^& w1 i9 n! ?7 n}
' X' l, ~) T5 vint dram_init(void)
0 L+ c6 e. Z; ?# D{
2 Q! T4 Z( }8 ^$ k/ p8 ?' \        /* dram_init must store complete ramsize in gd->ram_size */
/ G# H* M: u1 R3 W        gd->ram_size = get_ram_size(
% @/ ^1 |' d/ N0 o  c/ R8 I                        (void *)CONFIG_SYS_SDRAM_BASE,) G) q6 t$ a3 F$ y
                        CONFIG_MAX_RAM_BANK_SIZE);
+ D6 \5 b, a% d, D% n" b( u; S        return 0;6 m; d. W4 H: E% A& n
}
& k' k+ o8 y3 p" q* P* M( s$ T- l. _8 W6 t

' f4 i: T# h- G( g+ n- v4 Y! N8 ?2 b! n

. x* O, [$ M) o2 @  VFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& S! l- c) Q: ]# O( i4 b, D, \; s) f1 D

2 S8 `- c! D4 a
$ L' X2 N) H/ Y: p
" }3 P1 \! l; E' u: N* n6 y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 13:32 , Processed in 0.039271 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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