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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 D( O7 s9 q$ G$ ]+ T' j' b+ ?+ @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 |5 Q, y4 V& |& D2 X1 a1 f& w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, v5 p* A1 \$ G+ f" I; ~: S
& N7 k3 W" I' M# E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' w; [9 ~1 l# ^  d" Y# ~
* T# M0 q+ y. _2 s$ P$ f9 }, ^. Z$ _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 y8 d; m  g5 D" o* Z7 W/*
7 P1 H7 ?1 W5 H1 b4 }* Check memory range for valid RAM. A simple memory test determines
0 W; ]  W9 v  b' w$ @! D- I* the actually available RAM size between addresses `base' and
7 r& I& F6 P! D2 X* `base + maxsize'.
- A* y6 o" {0 X* c! {" @*/
6 q; L7 r9 ?. j9 plong get_ram_size(long *base, long maxsize)2 u, K" X% b  S. o) |
{6 u: Q, E: O' g" ~5 ~! |1 E
        volatile long *addr;4 q9 O0 X( `* {9 _
        long           save[32];+ o/ x0 A9 Q' A$ ?2 }
        long           cnt;3 l( I4 u% u- p
        long           val;
! Z4 F* b# J6 K8 C( R" ~        long           size;
2 h0 K1 H: `) l        int            i = 0;
8 k8 @% H' |: q! B, {2 ~9 @; [' }4 R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( D6 w) I  L5 g
                addr = base + cnt;        /* pointer arith! */1 Q1 l3 F) H) u+ M5 E6 h0 i4 N
                sync ();$ Z' D' ~1 Z4 F% W% M$ l
                save[i++] = *addr;& _% a( E% [8 ^
                sync ();
2 \* K6 n& `8 s3 x: D$ g                *addr = ~cnt;
+ Y  m/ p& e5 P        }' O' c9 ]+ m* J% K
) r1 h: o: X5 ]
        addr = base;
9 L7 ?4 I3 v6 \4 {7 }; ~: l        sync ();
4 o& d$ k1 z3 Y6 Z        save = *addr;7 H( }/ ^2 t3 u/ K
        sync ();. q8 H1 E+ {- R3 O" Q
        *addr = 0;5 c! v+ U4 E: U# `# z% T1 s

: d% p  R: l8 M3 h8 d        sync ();+ N6 K/ g  H3 W& w; x
        if ((val = *addr) != 0) {6 t& X" z0 s$ ^! E( D) B# ?4 U: P5 e
                /* Restore the original data before leaving the function.
" X' W8 }! g% M/ S                 */' F* }3 U5 Z, E* B# q, x, E
                sync ();
1 J3 Q7 }' d' `                *addr = save;
, v2 j9 r  M$ i7 {9 _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! N' g$ I' n3 K% ~/ S0 \                        addr  = base + cnt;+ \+ P# B2 ?4 K
                        sync ();3 d8 n) v+ P3 ^9 d" @
                        *addr = save[--i];* e$ S; I8 A# x& E9 {! O& `
                }: R4 x: q, m& ~% a* T# Z7 J" M
                return (0);
+ N* K# @9 H# Y8 x; b' s9 }        }
& B2 J* |8 T8 h, r9 e! f, g( y* s) \# m3 H0 ^% w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 `0 b  F/ J+ z$ z8 @2 b) Y
                addr = base + cnt;        /* pointer arith! */
- O; K9 |" U. q8 D  l                val = *addr;
9 h% R- z9 {2 x                *addr = save[--i];
: }! B7 M- y& }" {" D6 \                if (val != ~cnt) {+ M& E! G' S" r* T. X: o0 i7 a) f
                        size = cnt * sizeof (long);
, m( }! [( O, H                        /* Restore the original data before leaving the function.
2 ?/ \8 J; p+ u8 p; `                         */
. w; c  S9 L- _                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 P) p% u* U) v' @
                                addr  = base + cnt;
: T5 B( c. r1 S# h1 N6 I                                *addr = save[--i];8 B+ e, r& M9 ?, B
                        }
' g: q" I$ r/ Z                        return (size);+ e, C" A2 G: @4 h
                }
; k4 I3 z% G1 r% E) r% w        }4 q5 I0 X3 Q+ r3 X  C# D) B  |! K

8 q) p$ x& b1 U& o0 u: k  K) W7 Z        return (maxsize);$ }  F" J& @( e
}) @- o! d  E+ ~4 p: U
int dram_init(void)
  c7 I2 w8 s) |5 i# J5 e9 X; y  w) I{- y. b# X# Z* v
        /* dram_init must store complete ramsize in gd->ram_size */
; o3 |/ n: }" r! y$ C+ L2 g        gd->ram_size = get_ram_size(: I7 H, u% e9 I2 E! g7 H
                        (void *)CONFIG_SYS_SDRAM_BASE,
, x6 Y* |# W# H; j8 e8 R1 v                        CONFIG_MAX_RAM_BANK_SIZE);# v! T! T+ U: q  N6 N
        return 0;8 ]$ e' U. a# f* B$ o
}
3 k% c* N: b+ z0 ^7 k. @' Z
1 x8 C2 D4 c3 l# n! a# Y, @- r5 t7 X

' u) I+ D% b0 e+ R) m$ d# C5 {) t# u2 j% P) ]- i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) P4 `0 q8 P  V* u0 J
( i5 _/ \& s) p1 S& `
0 O7 J3 c" E: k6 E) k* z
' K6 D0 m6 d6 |6 B& N' G; P
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 11:44 , Processed in 0.039583 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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