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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; j1 j9 n6 C4 G1 I" u核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& j0 E2 {7 o. X) S8 N8 t6 k. e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 t2 A0 b- @7 @7 e/ b5 K; Z- _0 ]

3 R+ c! F* k+ ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' b, E( t! X: `; w0 o3 k, N3 e
8 W% z* C4 x! M- l' K0 W8 Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# ^* C8 w2 |( w# R# i4 v1 l/*
$ _0 ~" f" O* U2 a! W* Check memory range for valid RAM. A simple memory test determines
" C% ?# X0 E$ U% {* the actually available RAM size between addresses `base' and  C/ R+ r( h) f1 }
* `base + maxsize'.1 f& {; ^4 w6 m, w4 K6 m. m% g1 N
*/
* {3 M. ~: a2 j+ N* f0 [long get_ram_size(long *base, long maxsize)
) f  F  x* H+ i  G% W/ m1 k{8 l, \/ e% s8 K: p9 r, \9 X& A* U
        volatile long *addr;
9 p& A# S, ]. r# x  e        long           save[32];
9 ?) I* X- v2 Z: e        long           cnt;
6 p3 c- Q# @8 c& Z) \9 ?0 v6 N        long           val;
6 H  K* r7 ^) _; }/ v" O  Z        long           size;
$ u0 {! b/ s6 O7 l& _0 n        int            i = 0;" u7 o4 ]. \3 \& n! W- Z

  j" M. I$ F5 f        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! P# T# x: \; a0 x) y9 f
                addr = base + cnt;        /* pointer arith! */
/ i3 `5 R( A# Z8 t% e                sync ();
9 C& t1 Z7 g3 R! k( g3 {5 X0 F( {2 Q                save[i++] = *addr;
0 ]2 f& ^' k( K' K  T                sync ();
5 H: F, F" @0 l% U, t* j& }                *addr = ~cnt;
! D) R3 L% X3 F5 P; s2 @( C# k        }1 ^/ F- X% W% p3 _3 Y. J

( s+ M4 n' G0 x. T7 l4 n        addr = base;% [  J, Y& n$ F. ]: N$ Q1 a
        sync ();* U7 [1 Y) U( n: y; L  N
        save = *addr;
$ O. T  q( U, h, B! u        sync ();) {3 ]$ B; T( u3 T9 ]/ r- `
        *addr = 0;
* w/ i) f( Y! S8 i
, J4 |6 o& ?6 s" g% T" t        sync ();8 n  H7 H# |; p  J0 t3 [) D/ C
        if ((val = *addr) != 0) {
4 N- @, Q) a% o2 I6 ^+ `                /* Restore the original data before leaving the function.
* ?. h/ Y7 Y- N2 h2 z" B9 V# y- A& z                 */* x; @. j0 ^$ s( w1 Q
                sync ();9 p0 X" e; s8 o  `) V
                *addr = save;. p) N: Q- h. j& @/ O; |; S. h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 Y) S3 M) v) b4 k6 q
                        addr  = base + cnt;
: o/ z+ f2 z% X                        sync ();  J* q2 m* ^8 x  C/ A1 U6 E: G  P
                        *addr = save[--i];: i7 h. ^- G% d5 R1 ]
                }5 ?  ~8 q6 Z8 |7 J
                return (0);* A8 b  j. C) c+ v; ^7 X/ Q$ S
        }& \! }/ j2 f' O

# I$ G# U3 F3 E% }0 ^! m( S' O9 n& P        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( K$ o' y: A6 n% w7 Z7 n
                addr = base + cnt;        /* pointer arith! */6 a6 j4 Q" o% p% v1 |. h- N/ g
                val = *addr;7 O) z; u& R2 {9 ~
                *addr = save[--i];
" W! P' D2 X& Y3 R$ ]' h                if (val != ~cnt) {9 b+ z8 x, z0 o
                        size = cnt * sizeof (long);7 _5 i8 m3 q: S1 B2 w. @! j
                        /* Restore the original data before leaving the function.9 f/ v8 l6 o4 [0 L4 |5 a
                         */
* D6 @% y5 D9 b+ {& [: ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; y3 d% X/ F7 T4 g% a; ^; w7 C
                                addr  = base + cnt;
: n6 ]( X3 s) G& n! P0 e. i" e                                *addr = save[--i];
1 F0 ]! F# f- H! R, r                        }0 ]/ e$ }# f& Y$ a; a! `/ m
                        return (size);
* y; j9 ?) {* x/ ^' ^4 t! d3 K1 M                }4 e( h- a2 Y8 V! t9 I1 I1 B1 ~
        }' _! ]' f) M  R5 J
; J/ U2 K! S3 ^) r/ n5 V
        return (maxsize);+ ?7 c1 u  D. i
}
0 t7 K, u! j5 e" z5 Q( d' a7 ~int dram_init(void)
7 x4 Z/ P9 S( \: j# r{
+ J6 P, n$ m" U% \3 `# x5 p/ `% b0 z        /* dram_init must store complete ramsize in gd->ram_size */2 ]2 L- L: f9 V4 T7 l0 H
        gd->ram_size = get_ram_size(
" }. b/ J, A- m) o3 p- N, S6 S                        (void *)CONFIG_SYS_SDRAM_BASE,
% B1 L+ r8 R- H- b& N3 M                        CONFIG_MAX_RAM_BANK_SIZE);, F; A: [" q7 @. K: W
        return 0;; n2 U1 ]1 b) j" s8 P' G
}
) T& }3 }1 ^6 t8 s1 R+ h* I
6 `+ }- Y  j  @  n2 r' C9 F
9 O  X+ V  ~$ d9 K/ j4 f: ~: ~
# l2 g; s0 J, q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ g1 Q2 I. R1 N& r
+ ]3 D- D0 O) ~! k& }6 |8 \5 @' L( _* E' {. S, c

) r; n) @5 o) f3 o* D% o
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 07:34 , Processed in 1.004702 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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