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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' t/ @3 g3 `  g' ~  s
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) u" l  E8 l( N% q7 b这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. y. Y& e' Z1 i# s& X

3 H4 c0 r! g- q* {& k+ |2 e! ?$ a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% a: B% o. T% ~, O  J# r+ `7 E

9 ~4 \! \- J" l4 `9 O1 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 n% o( W0 Y& x$ ?* t6 L9 o, h
/*
1 z, `, y% g3 ]; _" ]9 G* Check memory range for valid RAM. A simple memory test determines
  f1 G. H" E: _' o5 c* the actually available RAM size between addresses `base' and# u0 V. b* B6 v, H
* `base + maxsize'.5 A; w* T' i, j4 U
*/
! O4 n( ^) O2 |long get_ram_size(long *base, long maxsize)
" [/ C6 ^5 M/ }{
0 u7 w) l  ]1 S! z0 Q; T1 Y* R' ~        volatile long *addr;* n3 X4 I6 d4 j
        long           save[32];3 s. d, V/ c* F7 c
        long           cnt;
( n) @7 z& _/ E' i        long           val;
1 O5 Q% c: u% f! K5 X, H+ }        long           size;: y0 O" ~$ U( t" v( [- C7 N1 g$ R3 M
        int            i = 0;/ z" _! M$ t+ s+ ?
( F$ F! q% i; J& K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! M& [- }( n. A" `; [4 q                addr = base + cnt;        /* pointer arith! */
9 b& t# I3 j$ o* T                sync ();- ^- J0 y1 J4 ]9 g# E7 h
                save[i++] = *addr;6 x$ e/ C4 H( n9 J, E
                sync ();$ y( y9 \/ V; X! b+ \( x: t2 F1 [
                *addr = ~cnt;7 q; x1 y9 s  s9 r; d% W
        }
6 S% F: h  G" B/ i& K& R* E& i  ^( d' W  i) C
        addr = base;
9 Q. m' b! [5 V- L: G        sync ();# c% B1 j2 X: q
        save = *addr;7 {0 u4 e3 i* g" k- |7 W
        sync ();
+ N+ f; H% C. l& k( [; \        *addr = 0;/ B6 y  |; s1 |7 i4 ~$ Z# b2 k

0 Y# l3 A$ ]' C" a        sync ();
) {$ R3 e) O- L+ G        if ((val = *addr) != 0) {
; B3 y5 e' U* e* D! K& ]9 a                /* Restore the original data before leaving the function.
. C4 G3 e' \: ^9 ~( V! j/ p( Q                 */" C( p$ E; T3 Y0 q  c5 Y5 H* q$ w
                sync ();
  @5 [3 z3 z, ?                *addr = save;
# G, S- p% f' D; z5 Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! {2 N) h0 F# ^
                        addr  = base + cnt;( y* \( y7 M( V. j- i! n$ Q
                        sync ();
: u  W% s% h! D                        *addr = save[--i];
. ^* z# a+ ]5 z2 ?% n& r+ {/ q- j0 ?                }5 `0 P( D# [3 {0 r+ M% _
                return (0);7 D, a/ f1 i% R/ z( q+ E
        }/ c" Y# ^5 C8 s

' M% o) f* x7 S& q/ h* H; T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 X$ o( E& K  O5 E( O8 q/ O8 U" Z                addr = base + cnt;        /* pointer arith! */
- f7 R+ k$ e3 F5 l5 A9 Q6 w/ `                val = *addr;: N1 B! k" C5 k6 G
                *addr = save[--i];% y* j, u" R; C
                if (val != ~cnt) {
0 D% m: ?, D+ d! }* c                        size = cnt * sizeof (long);
' X2 h3 z* q. U. y! I" Q6 W                        /* Restore the original data before leaving the function.% m8 Z/ ]8 e* O8 P
                         *// K+ t% u. u5 t$ v, F! v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& H- i! f& N2 m) c
                                addr  = base + cnt;+ `6 X7 G7 B: U- G5 K
                                *addr = save[--i];
% }. B6 r5 `+ r- V4 z3 Q. j. t                        }
# [+ ]& c1 N, G) P7 y                        return (size);
/ S( g" A: p+ }  G( j4 ^                }4 _: R# p) C' L1 H
        }  [4 |0 D# f  Y# X3 o

1 H+ n" [1 E- d8 {; F) x        return (maxsize);0 J. D# }0 f! F
}
- ?. R: Q2 d4 \/ D0 J+ {; vint dram_init(void)+ s" V( @* E- y! E  s  T
{
3 _( V. c8 N0 j+ z5 n' F3 P        /* dram_init must store complete ramsize in gd->ram_size */
, [* t  `* t& d% c        gd->ram_size = get_ram_size(; B/ C. Z0 K: u4 O! N- i
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 C* J5 P: e* J# n                        CONFIG_MAX_RAM_BANK_SIZE);* Y& Q: J' ]$ o7 j# L/ v$ m# j5 R/ n
        return 0;
1 c+ z/ i! O  I. i- n( u8 C/ E}
9 F/ p+ n" d1 l3 _
9 X7 M* o+ V; L# ?% [  q+ U0 E0 |8 S8 g, a" b8 ?' U) i3 L

: o' ?/ r6 O: W- H8 `  r
$ \2 r( B. s" oFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 g1 m8 b$ `5 P
. O% \- F6 a5 Y! C) s7 F6 K8 X1 J8 h4 F; R' u# e; q6 G% F3 T
1 }+ B* L; \1 A: m
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 04:34 , Processed in 0.034769 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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