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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 z, Y; Y0 S: S/ {; t; X# L0 y9 N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" m+ N2 o2 D5 @& c: l( y  }: L这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 ^) C/ p2 e+ u5 P1 l" W0 F# w* v" o5 {+ ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& H5 E9 Z' ]; t( F; k( n) u

6 K, O. g2 U8 p5 E1 X& Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ D- n6 A: j8 v/*# F. ~6 \- ^& `
* Check memory range for valid RAM. A simple memory test determines6 A* Q% A' h; [' p
* the actually available RAM size between addresses `base' and
: b7 L/ R0 s5 P* `base + maxsize'.
5 U6 o; x" Y" G5 u8 z+ @*/
5 D" ^  F* }9 G: n' Ylong get_ram_size(long *base, long maxsize)
0 ?/ y) u4 ?# t" `{
. V7 @1 t( p( c& I# z        volatile long *addr;3 R# `6 S# Y* f- `
        long           save[32];- N" \  M8 V9 x- ]" {( h
        long           cnt;( y7 D, j6 F$ A$ W+ a
        long           val;
- O6 C/ ?  I. a        long           size;7 R  h- k$ W5 ~9 W& t: }6 a0 q
        int            i = 0;9 s& X. ]$ p: i+ f/ I
5 ~" M! ]1 x- d& _7 K6 {
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 _% C! d+ Q5 T                addr = base + cnt;        /* pointer arith! */
$ ~  g: O# c/ Q  x2 n, ~: V                sync ();4 H5 I* V+ F* |; x# _
                save[i++] = *addr;" ]; ^8 x( a  u' C, P  r) O
                sync ();
9 b7 [% S9 l$ h& G3 `+ s  Q/ s0 r+ A$ P                *addr = ~cnt;
/ c) _; n7 \& v        }
+ z  F# K! c/ S& Q. ^! h, @* P% L6 w
3 s5 j9 ~1 s  i0 A1 x, t        addr = base;. {: M; D+ b7 Z: m. p
        sync ();. P& p' [. c* w# Q% m& J- G; q
        save = *addr;
. v0 v* q% y' S        sync ();
. S/ A3 ~) U2 }        *addr = 0;
; k% Z3 t( {% ^
6 T: ]& |$ p1 q  U- ^        sync ();% E( M( X" }/ d! k/ W' a1 l/ X: V4 D
        if ((val = *addr) != 0) {; l5 p$ i3 \# n: `! _! v: I
                /* Restore the original data before leaving the function.
' v0 N4 K, G# q1 q                 */
% e9 c6 R, u7 s7 M9 A5 G                sync ();
# Y: o4 @% |2 d2 s$ X2 R: z& q                *addr = save;/ ]* g" L& [; O& L( F1 }/ I; A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 Z6 I! {' R2 R- ~
                        addr  = base + cnt;
4 C# T0 D5 ^) @2 x0 _" X                        sync ();
% N; L* P! y' k5 D! J4 C3 d                        *addr = save[--i];! P" U5 X' o/ r6 c0 m2 t
                }
* a! X3 M# i# G/ b                return (0);7 V# A; L7 `9 ^( Y
        }1 @6 Z( X4 l! [
' t# j' S% s3 a. K# f" Q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. _5 x: e# N3 ?6 Q2 Q# o* @
                addr = base + cnt;        /* pointer arith! */
6 i! \9 {& ?6 P! V                val = *addr;
+ L2 I- |( n0 P* e- m                *addr = save[--i];
( Z% s3 t4 j) D, ~                if (val != ~cnt) {
3 C- [+ K* a2 w) Z. @4 X, }! z5 }                        size = cnt * sizeof (long);/ p' K4 J1 x3 N
                        /* Restore the original data before leaving the function., H+ j* Y$ G5 s8 E& ]/ q3 Q- J; y
                         */
) z  W0 v& F# q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 T0 y" t; {" O" S                                addr  = base + cnt;
. }: r3 {8 }! f$ S% M0 G1 l                                *addr = save[--i];
/ P4 v8 w0 b5 Q6 k% a                        }
6 A/ \# ?8 k& o1 `                        return (size);3 v6 }( ]- H# P) F) t
                }2 a7 c0 q0 k$ k- U3 \
        }4 P' g; }2 |: C, h/ w5 Q6 s8 W

1 e: b5 i, l" o        return (maxsize);4 s# J* ?* X5 T  F; z1 V
}
; p% _2 p6 [$ P# i, `int dram_init(void)5 c2 }! \4 ]. ?- U
{
+ m( ?1 B) w6 b+ T3 b3 I        /* dram_init must store complete ramsize in gd->ram_size */$ T1 m7 F, w0 g+ m' {
        gd->ram_size = get_ram_size(
- b2 H* h2 G) B% V& S% n                        (void *)CONFIG_SYS_SDRAM_BASE,' k# Z3 B3 v* ~( u
                        CONFIG_MAX_RAM_BANK_SIZE);
% L3 P& a' P- K( K3 m4 P        return 0;
& e' n$ _, v5 t}% z& r; X4 c% w1 |7 p: B! I+ s

* W6 y2 k: V5 j  u
0 k( T1 u6 B% k- w3 S' M, V6 c( I) r, w! ~$ n4 |( Q
, A  z& Z. f1 `/ V" [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ u% X) P/ ^8 U( Q7 r0 o7 }3 @. S

' @! w' A% T2 I/ W5 d4 _" v( D6 O# [2 t% Y; S, S

7 N( @( c: d/ R: [8 z# p: |
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 07:31 , Processed in 0.047048 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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