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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* s2 H, v4 z' @) R* E1 V% s  I核心板2:DDR2 256M Byte   NAND FLASH 8G bit! K5 l* N/ W" ~) R) N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ p* s! N  s0 Z& t% [/ q& |. m0 S/ }" B0 J/ o7 j0 l5 _  d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 {# {2 B' t! K. A$ g8 d9 U. ~

6 g1 R; T% q/ O0 i  y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 N7 E9 |" L: j- y3 r# z/*7 {3 C/ I7 i# P3 [  q
* Check memory range for valid RAM. A simple memory test determines
5 |' ]: I# I9 Z( z9 ^* the actually available RAM size between addresses `base' and
4 K. H; b3 b8 {* \& T5 r) n* `base + maxsize'.: u1 F' |+ e% C; r( z8 m0 p
*/9 \  y9 M" Y: p
long get_ram_size(long *base, long maxsize)8 b. Z! w2 o, [. u! @# q. o
{
/ g, ?% ]  n2 w/ V8 k        volatile long *addr;( n( b9 Y1 v/ E! X/ H5 ^
        long           save[32];7 \3 B: ?" n: d; c: h! P! `! F
        long           cnt;5 u3 }7 Z6 l" o5 i& D$ K$ Y5 q3 K
        long           val;$ H3 Z4 j  ~! D; n, z. ]2 B
        long           size;
3 ]/ x' j! n7 N  P/ p        int            i = 0;7 a! x/ L/ B0 C" I: m
* W& O; w5 u1 p+ E& f$ n8 b
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- B" w, R+ m. ~& z3 B0 J
                addr = base + cnt;        /* pointer arith! */
+ l2 b: Y! d8 j                sync ();8 g# q2 y0 n2 o
                save[i++] = *addr;
4 L6 B; {. ~/ V1 y7 N& s. E) V) x                sync ();
# b& `+ i, `( @( A                *addr = ~cnt;
+ K4 w: Y1 Z# }# l2 ^, `        }. B# D$ U, N+ j; J! D- O( y

: J  d' A4 y- ?1 N$ t        addr = base;
" [' V0 E% ^) n8 n3 j( I        sync ();
0 \; b, J' k7 Y9 b. Z9 l- W        save = *addr;- _4 D! S, ~  ]$ I4 l
        sync ();' y( M( t5 T  F4 n
        *addr = 0;8 l$ J3 W) K( o$ l1 m. s/ h6 K( C
- v$ u' Q. Z1 a: j, q) a
        sync ();0 O. X3 y& Q9 I. y- r
        if ((val = *addr) != 0) {
! @7 V$ m% u5 w& B3 d/ a7 u: N                /* Restore the original data before leaving the function.( c& {3 x% V1 W$ d! ]& v
                 */
9 C( X5 X/ y) x5 p$ p: t5 p4 h5 I                sync ();& ~% B8 R; o8 ?
                *addr = save;! q* {8 h( |8 l7 M* f/ }
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 A2 K" r% z" d- Q" P% p
                        addr  = base + cnt;
3 {. y" ^6 M' W# X% ?. C, m, b                        sync ();
7 I: A0 S( ^( G0 e) d! C' f                        *addr = save[--i];
+ I$ w# @  r, R7 z                }  O+ B  y* C0 N( {
                return (0);8 L6 U' N* D; |6 y, D& K
        }
4 S0 B" V/ S8 ~* N* f# K. h: @( c$ n0 I, J6 _/ a. W! u2 [; i  E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 t' K- Y3 p7 u* T; b1 X2 C
                addr = base + cnt;        /* pointer arith! */
8 Z8 Y# u! X: C" t' d0 U7 ]5 @                val = *addr;, ]7 \: H7 E0 l; l7 n3 R
                *addr = save[--i];' e0 @( e: w$ J0 G$ d# i3 m! w7 ^
                if (val != ~cnt) {% H( {. h+ t( c, M) k& B
                        size = cnt * sizeof (long);
  T, R( ~* v1 W$ g# b) m  d                        /* Restore the original data before leaving the function.
8 G2 z4 v6 u% i; ^/ |8 c                         */
1 P& k& h0 g% G! X: E- y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; C. C) |4 s. d& v. f                                addr  = base + cnt;# [2 Z7 v1 q6 F9 l
                                *addr = save[--i];5 P: \0 i/ I1 j3 e$ v! z
                        }
8 B4 }* U/ @6 Q) ?+ a                        return (size);7 ?1 d( P' V7 ?0 h4 S( o
                }1 R, W& D6 x0 C
        }8 L, B% k( C0 y/ Y) n. Y) c# r; a

2 e0 p+ J! d. y. S9 Z        return (maxsize);
5 @8 K& g8 x- u  z. P% B}
' O1 q8 Y/ l) u, T& fint dram_init(void)2 o, t0 k/ Y+ {% N8 Q
{2 u  C3 X" `; @, i
        /* dram_init must store complete ramsize in gd->ram_size */2 E% ~  K: i0 t$ B
        gd->ram_size = get_ram_size(
: f& r2 I/ q1 i5 s                        (void *)CONFIG_SYS_SDRAM_BASE,: Z1 g, \1 U( Z7 [! W5 M; [
                        CONFIG_MAX_RAM_BANK_SIZE);
1 b4 M4 q9 _. q% O        return 0;- ^/ p+ \5 `" k( R. g
}! p# v( {, E$ l1 d6 d
' V3 k0 o2 ~& e. I! g/ \' M

8 l5 A7 W% r- q" T7 R
: x3 j1 J1 M9 M( O7 R; u5 q# b
4 E! y: j; \+ y- Y, q7 b$ DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 `/ ~- }' E2 h) O# O: i. ?+ Q
, V. j2 i( m& ]

- v, P) `9 {" N: {7 ~; ]( P

5 n9 ?; }, r* r2 }& c
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 21:30 , Processed in 0.035423 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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