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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; ?- M" S1 J3 m$ V
核心板2:DDR2 256M Byte   NAND FLASH 8G bit' d" b+ j- b) ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 A0 z. }, n" O+ {! F6 }% x
% R$ S% o+ d6 R' [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. q& I5 ?, S1 k) W$ B. T, s1 J8 K6 B- C+ |! o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 s+ @9 {+ w& \# d1 j4 H% f
/*& V& x9 V8 H, n8 F2 W! i8 C0 E
* Check memory range for valid RAM. A simple memory test determines  v1 n% E& [3 E- u% {
* the actually available RAM size between addresses `base' and
* P) V9 u% d  L, l; c* `base + maxsize'.
: v# b; N! Z5 f+ M. G*/- F2 _# t$ {) T  c5 _5 }
long get_ram_size(long *base, long maxsize)
, d5 D% D' L; y1 q! K* A{* B8 g( {: \2 n
        volatile long *addr;! j/ S% a8 ^7 E9 ^! e8 a5 Z
        long           save[32];
/ a- ~: f5 I# S. ?        long           cnt;# e  \4 {$ N6 H7 }3 G  R
        long           val;( H0 l: a/ U: B! L6 A
        long           size;! I2 P9 l1 c9 U2 `5 i; {& h/ W
        int            i = 0;1 s  U: c. g. l: v6 q' D8 G

5 [9 i# a9 c& k        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ @  U% b( \+ Z8 s, |1 c% v                addr = base + cnt;        /* pointer arith! */
" a" f4 o7 a  l" p9 G                sync ();* t, F' P  g/ O7 j* v
                save[i++] = *addr;) g" R- X9 K$ y! Z& L5 E' P7 u
                sync ();
3 K9 Q2 p5 z4 |0 v9 O& f' B                *addr = ~cnt;) D: @. A* N/ U+ f
        }
+ q0 s2 P: A0 [+ J8 ~5 ]+ k& F" }
1 w# ^, S" Y& C- M2 P1 D% k        addr = base;! B$ X/ d! ~! e" ~8 W+ p8 v
        sync ();
3 _* H+ ~8 q, a        save = *addr;. _0 x% W% J/ m& {% ]" b
        sync ();
. E  q: m( T7 z% z" d8 O9 i+ U% u5 S        *addr = 0;
1 t( h2 P! A9 s/ O% [, m  {
  q$ i) N1 e* T' w1 s5 q0 H2 ?, m        sync ();
1 }+ @) U) n4 ]3 D        if ((val = *addr) != 0) {
- H, o3 l- e( J                /* Restore the original data before leaving the function.
, Z; E) v4 ^. G                 */) y5 a* l& o0 K' k. r, l7 A
                sync ();+ |* @: a1 E6 e- W5 G- m4 I
                *addr = save;5 n: j$ O! A% R8 a$ D3 F, p
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 U! X- `  W3 f
                        addr  = base + cnt;7 H- x2 S* M5 M6 [& i6 t  {
                        sync ();
" _$ k  ^( i" V* c4 k/ Z                        *addr = save[--i];8 }% z: N9 [3 e. I# J9 o5 m
                }, \! M4 J) g, k) r) C& E2 {
                return (0);
. J1 P/ z! h3 h- d1 Y9 ~        }+ A8 F5 F& B' h( L4 a, ?: J. V
% Z: M+ U9 d3 y; C+ ?9 w. t. V
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. [! N, ^( O+ U/ ?1 D8 u4 V                addr = base + cnt;        /* pointer arith! */7 h  U9 K7 E; I7 F1 G7 K" w
                val = *addr;
/ \) n& M9 }* J/ I; d9 H, j                *addr = save[--i];. B3 m: x" [6 o5 F# B: T8 i
                if (val != ~cnt) {
/ A/ T+ g; m" G% J% n0 p                        size = cnt * sizeof (long);9 X+ ~. a$ U% s6 W7 W9 J$ C
                        /* Restore the original data before leaving the function.$ k7 N) H7 g  x$ n9 X( c
                         */
; G7 }3 }, u8 P7 D& X+ b& O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( m0 Z6 f, Y! @, ^2 ?
                                addr  = base + cnt;
  m* H8 p$ e( o                                *addr = save[--i];7 U% v  ?% l: Y( e# k
                        }; ~0 g$ y+ Q$ i
                        return (size);1 U- N4 {2 F$ e# b. a
                }/ u8 `8 `8 S2 p* M3 ?6 x3 }
        }0 x1 j7 q1 v' @/ d/ g+ P
3 x, f  o$ e) o9 {; u- T( H0 L9 g
        return (maxsize);
/ K, z, R& Y3 u" `. q}3 N: L/ U) D+ V2 b. ?# p6 X6 Q
int dram_init(void)
4 z- e8 j9 Y% Y1 V5 b9 k$ k; ~( T% C{
/ A8 Q& n/ U+ L( p- c; c' F        /* dram_init must store complete ramsize in gd->ram_size */
5 t- g0 `1 h: g- M/ l# k$ r, \        gd->ram_size = get_ram_size(
6 L$ ]9 T# e) U, s' a                        (void *)CONFIG_SYS_SDRAM_BASE,
4 m+ p& ]" p- i. b& P$ `& G* |2 ~                        CONFIG_MAX_RAM_BANK_SIZE);6 Z/ H9 G2 y( D% ]4 O- @
        return 0;
9 A9 G4 ?4 N+ b( k- U}
8 l  v! v5 p  W2 ?+ r1 R8 t
4 D9 y& k+ \8 k) ?& z$ j) p. {8 B, j! P
) i  g  H% G- o  G# z

4 F+ g3 v- v! x; ^$ U5 ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 r0 u2 X" E( f2 E& n) h: q- H6 e' u0 X+ r1 q$ Z8 K4 [6 g
; z7 s# l8 {2 J( X# Q

4 V$ a: K0 H2 O$ q6 W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-15 16:20 , Processed in 0.040407 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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