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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! T3 k) V. ?; E9 E- K7 N核心板2:DDR2 256M Byte   NAND FLASH 8G bit, v7 R  D$ A+ U. J* w- s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) t& X" b5 A- s' r8 D& a0 O* `3 ]5 [9 B: U* B( _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- s. V% C) T0 R! Y. R, I

0 A" W4 `: p- O; C8 |! J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ R4 }- `" }+ [- v5 A/*
; M% O1 p' j0 o( b0 t4 ]1 U/ M" d0 m* X* Check memory range for valid RAM. A simple memory test determines
' r* q3 n4 o3 l, V* the actually available RAM size between addresses `base' and
. d" B4 k8 a0 z$ R* `base + maxsize'.: v9 B% D  f& }  p. @
*// X% c' G' V0 I
long get_ram_size(long *base, long maxsize)& H% i& Z9 A  T  R
{
+ Z. b. `$ s1 b1 O0 t; _$ T        volatile long *addr;+ n. |" S0 U+ ]0 H
        long           save[32];3 D  z! E" G  j$ c
        long           cnt;
/ V8 n/ d, Y6 r5 @$ B        long           val;
5 d" g" S. b' V) v        long           size;0 [  K7 l$ U4 d' H+ p! B
        int            i = 0;
2 n( e2 k6 b. D+ D
. O  o9 [# H0 }7 K        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 [8 f  d' t$ v  V% c5 t7 t: p
                addr = base + cnt;        /* pointer arith! */
* j, u6 `+ _0 b: {7 Z* @9 g                sync ();; }/ @9 S+ ^& A4 {- f% s9 u
                save[i++] = *addr;
, {( H( K2 Z8 W9 U& @) X                sync ();
- L6 J8 p; |) e# |$ j" z& g                *addr = ~cnt;( A3 O8 F$ b! a
        }
1 R* M1 U& C. |
9 ]: D/ n. N- D! B5 q0 P2 h        addr = base;7 e8 A$ J  \; @" e! w* ~  c
        sync ();
1 V8 J7 B* u; Z9 K        save = *addr;
! R- h4 U8 e( O: W        sync ();
5 M- Y8 _9 m2 c+ G. K+ E        *addr = 0;
8 g. j. T8 s! Y; g5 ?
) k0 u* E* c2 I" Q/ _        sync ();' |5 _+ G8 X& W
        if ((val = *addr) != 0) {* Z5 S5 y9 m0 D8 K
                /* Restore the original data before leaving the function.
+ D5 J  B$ [- z* T                 */0 t2 z$ O! f* b/ S
                sync ();: m' t& \& d; D% r$ j
                *addr = save;  y! P* ]/ y7 e2 N& ~6 x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! G; d( q% d$ I8 _- b- V                        addr  = base + cnt;
/ {. V3 K2 q) a, s                        sync ();. Q3 N- _  V- ~" h3 K( w
                        *addr = save[--i];6 p0 y: T, R3 W4 \* @4 n4 j  f
                }
/ w( J! s6 x$ O8 E$ B( }& H                return (0);2 ?) _5 K$ u) B: M
        }
" ~4 Z# K4 h) Y- j5 Z
8 y1 l) J0 X' I% v# y, t  a        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- t2 H. J9 N4 ~1 Y
                addr = base + cnt;        /* pointer arith! */9 }8 O" B+ |) ~* _; M! Q
                val = *addr;. \* N$ B& p( C0 W6 X
                *addr = save[--i];
: R+ z% a5 {# t8 k& ~; S, Z6 }                if (val != ~cnt) {; h" w8 r( h- Y% U- g& _4 Z
                        size = cnt * sizeof (long);' Q# U; M+ K' a+ I& h5 @
                        /* Restore the original data before leaving the function.
( p# y/ I4 _  ]                         */
. I$ K4 }! |4 g% F" z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 o; @$ O9 B* |
                                addr  = base + cnt;
) A, H) U& S$ y8 t/ E: r$ [1 a                                *addr = save[--i];
& B  \/ p& N$ n- M2 ]                        }, T  {- g' K1 }( x. D6 u2 v6 y
                        return (size);
; C; ?1 M  t2 J# e% A                }
' F# K' A2 I- P+ C- F        }
- v* Z* \, c6 T! `' J5 M/ y
, \; S" l* ^/ B! e# a' q        return (maxsize);8 l& a$ Y6 ~6 L6 t: H7 A! b
}
' a3 {! @1 ?! k- _# U/ k# aint dram_init(void)7 L; K2 P6 M, C
{
. ?% J$ B6 a  E        /* dram_init must store complete ramsize in gd->ram_size */
7 Q9 g% x6 }; e6 [6 d7 V        gd->ram_size = get_ram_size(
3 s( v  G" K4 _6 G4 c+ R' a1 o: |                        (void *)CONFIG_SYS_SDRAM_BASE,2 w9 |; d* z1 X2 T$ ~  \' z
                        CONFIG_MAX_RAM_BANK_SIZE);
+ G0 q/ E' F: T" |  b. ~        return 0;) [+ |: G3 T3 H' p; @
}" E0 y3 O, c! \& K8 o- }

6 V3 T; u' G: r7 p0 P, ?) `
. t1 d, ]' p9 @& {8 D* N8 t  X0 n# E/ o) b, d* H2 i

  `" B% M* b1 L! u; U- |. zFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 T2 x7 I. r7 C0 w7 v) n& H! ~# Z4 I7 ~/ z" V; W6 z$ V: m
* d5 h+ _3 T& }- }

6 d. D) ^9 x; S1 R& K" C
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 16:29 , Processed in 0.038216 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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