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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 I. G" u% I# L7 Q- F4 E核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 n" ?$ E" L; h* b! i这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& L+ O0 A' q- ?1 d# }% B3 ~

% i. Q: I- F6 {6 G; d! R9 M是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 m) K( N0 A$ _3 a$ u6 W" z) M

  G. o1 y0 `) W  P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 E6 _$ }- x* c
/*
# O. u; X* E, ]* w; ^3 j* Check memory range for valid RAM. A simple memory test determines3 N+ v6 |/ D4 y0 ?. ^! i8 _. `8 V
* the actually available RAM size between addresses `base' and
* n9 X4 U: s7 Q* R/ ^; V; c# Y* `base + maxsize'.
0 o# G. C3 d. S' V0 H! R7 u$ V*/$ K  M( ]$ i, y9 _) v$ o* }" F
long get_ram_size(long *base, long maxsize)
+ Q! D3 A" h# _7 j6 q& K{( S6 u# n* y2 K* J$ e
        volatile long *addr;( x9 p- ~" L' a; {2 v1 e' @4 p
        long           save[32];
. |0 o2 [/ [# l( [7 D        long           cnt;
. i$ ^5 r! Z/ J& S1 b1 M        long           val;' w& R3 G: s6 w
        long           size;/ i2 u& \" A# j8 K3 {% ~
        int            i = 0;
3 P" v% O& Z7 }  e! j$ i
: H9 a0 M$ `6 k0 l( g& \        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' x2 k/ R9 J: _+ B& d; ]6 \8 I' u* c5 P
                addr = base + cnt;        /* pointer arith! */
8 M: g5 Y" D: w3 q3 w3 C9 K                sync ();
/ R; O6 B9 M/ M+ `                save[i++] = *addr;
2 [5 g" J9 q, u+ t                sync ();7 q2 l6 r6 [6 c6 J5 M: d! B
                *addr = ~cnt;. `0 r7 {7 f; ]3 {
        }. e5 p$ g& [9 b$ Q' t& _* C
0 y$ T+ D; \: \/ r7 g- N
        addr = base;0 d( l- a- F; U/ B
        sync ();
9 i$ d6 u# y6 x' J  G+ Q/ Z        save = *addr;0 N0 C# W  J+ c8 W6 k- [; v0 F
        sync ();, |" W! W) r2 i: m& c4 Q
        *addr = 0;
4 ~5 ], j4 q/ a. x, O
- w' K9 M2 ~9 ~- j4 X5 A8 W        sync ();
$ ]& C$ X2 _. {% m8 S        if ((val = *addr) != 0) {
& P! ~. W% p3 @2 G                /* Restore the original data before leaving the function.9 V. g; C2 p* [
                 */* S7 G1 @2 I( I
                sync ();
. p* |! f) L% m, V                *addr = save;
) H- r4 _% s% \: a7 f3 j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% v8 |: L) _- |7 n                        addr  = base + cnt;
$ k: `2 p- B! A: t4 N3 s# r                        sync ();4 q: }- Q& ^; D- ]1 a% q
                        *addr = save[--i];( m; u% |) y7 J) q
                }
) R8 R2 @, J9 B4 w7 K+ A# _0 ?* m                return (0);  x$ _3 `* R5 U! L. F2 [( L$ w
        }
( n1 u* |$ ]9 |: d0 |0 ^
& p' E! H7 [# r# l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 L$ R( V& {* U6 m6 i) A7 q: N6 X                addr = base + cnt;        /* pointer arith! */4 k# S6 `$ z) l/ u, I
                val = *addr;( s7 Y: }0 _) M& P) A
                *addr = save[--i];! O) N! S" m7 W6 [
                if (val != ~cnt) {
# i2 A! d' f4 S4 W                        size = cnt * sizeof (long);- E1 s. d- S9 a3 q/ O+ n
                        /* Restore the original data before leaving the function.
* r. c: Q+ V1 t7 }" U                         */6 t6 }* H, w1 c/ w* Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 I$ _9 g% \& k* S& H
                                addr  = base + cnt;
4 {6 w1 O7 |6 N6 `  J5 k                                *addr = save[--i];
! l* E6 N& U) k# P- A/ l                        }
% h% x$ f$ u1 o8 w. W% Q' u8 }                        return (size);
; H+ J$ ]) f3 _6 C: G3 |                }; u8 a; Y) ]4 N7 @
        }  x$ S. S% }% C, v( W4 S
$ H* e% l0 o/ n0 h: V
        return (maxsize);
2 k! P: I) d+ d. A5 Y% b9 \2 t}# n0 S* H% P; J' e5 @( I
int dram_init(void)
3 E& ~/ p* Y0 v- i9 N- m7 o{
5 v9 P4 F5 E% |: y, c+ b& U# }% u        /* dram_init must store complete ramsize in gd->ram_size */6 w0 I) q+ l* H3 R
        gd->ram_size = get_ram_size(1 C' b5 F6 H' ?5 K! _0 j
                        (void *)CONFIG_SYS_SDRAM_BASE,! D/ U  B; l2 Q; v+ ^. v& }  v
                        CONFIG_MAX_RAM_BANK_SIZE);- H( H% t- ~+ O' N# [: i. P- `
        return 0;
3 e$ H$ Y: Z3 j- [" G}
, L1 E: N  ]( ?* G! }; o
+ ^5 m+ A% _9 ?& x& U8 N% S- T- g2 [4 L! f3 i" |" _* |
3 J+ _; R+ ]4 E$ `! \# W

" Q9 a8 a7 n) |- k0 A% }FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* r  t$ ]  \0 e6 B" G4 ^! r+ R' W+ V
! T; p+ T2 w- R; E& Q' Q" ?
# K5 N6 v2 P% h9 F
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 23:19 , Processed in 0.037396 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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