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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  ]1 @8 f" s3 f3 C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit) ?: F  m5 l5 K. k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# J$ N8 D+ q5 |6 K3 _, d
; q$ R  \7 v- H1 j" k+ y/ F' c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) f0 p7 i4 i9 [  A6 t) S4 N0 T: t9 Q4 \; I! Z* Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 _' E1 D7 J# U. |3 x3 V/*! r1 q/ ~/ R5 w' q/ W+ h7 T
* Check memory range for valid RAM. A simple memory test determines7 g. P  g* S2 F, L
* the actually available RAM size between addresses `base' and
9 e) l) _5 k. p2 g6 f: a1 c! E7 S2 L* `base + maxsize'.5 J7 _# ~+ v' _" e7 c5 }
*/
2 S$ s3 l4 h% Tlong get_ram_size(long *base, long maxsize)
9 `1 Y4 K/ Y+ @- x  ~0 a{
! C+ T$ t2 I% e4 ?& A        volatile long *addr;
1 m' C0 n! H, l) v        long           save[32];
9 X$ h7 F: h9 F        long           cnt;
+ v; ]0 d% i: `0 W6 U        long           val;9 Y2 e7 }2 ]$ U$ o7 a5 y& e( H
        long           size;2 C6 u. K% Q4 H5 s) l+ P  X
        int            i = 0;
+ L3 @/ v( B) q- i) D, w
9 n. ~7 }" i/ g& u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ Q; c4 t  @; A5 W; y: q+ v! t                addr = base + cnt;        /* pointer arith! */
( Z. \8 `1 c) O$ ?' U. g                sync ();% L. r; C* o% ~. l9 D
                save[i++] = *addr;
. `; e) p5 w( b9 F4 n6 H$ [$ g6 F                sync ();
$ p) r8 i" _; b: c1 _* U                *addr = ~cnt;
% q3 Y9 e( x. [- H3 Q2 |        }$ z6 Q/ {, M7 M* M2 a
. F* X+ B1 x4 A8 Y+ E9 d0 n
        addr = base;& X6 E* G9 N  A) F3 l
        sync ();
7 c& S; `/ b% |8 ?: ?        save = *addr;
! F+ r6 i% q" S  W$ n        sync ();
; z3 z7 L; M5 b0 m$ ]+ m0 s, O        *addr = 0;
* w' f0 W# f# \, J, h; }1 o8 B, |2 Y7 |+ d8 h
        sync ();0 M1 Q( i$ |9 j/ H
        if ((val = *addr) != 0) {
" N2 A7 j8 l6 O* W; M" i                /* Restore the original data before leaving the function.
+ i$ c7 S: l0 k4 y7 v                 */  C) `+ c9 d9 |% o
                sync ();
7 h% u$ Q% Q/ m; V4 o, d4 j- |0 g* l                *addr = save;3 S$ e( `& m5 W* s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 N$ ~1 @1 k0 @. ^7 v' r. y
                        addr  = base + cnt;
* `" t) g/ O+ h                        sync ();0 V4 o4 l- \7 s: A
                        *addr = save[--i];
( G1 H9 U& l% \; w. m: P                }  P' B  [/ r9 k3 W6 x- Y
                return (0);, K) E9 F: y+ X
        }, J. b! t5 l0 _; M0 r
+ E& T  _6 |6 K7 d: j4 x4 H* i' f
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  [) `% s. V3 i7 `                addr = base + cnt;        /* pointer arith! */
9 ^* D' ~1 M- E5 C% W" u& T2 o( e                val = *addr;
- Y, o4 ?& `# N) s2 y6 ^- E                *addr = save[--i];
9 u; f) d  M* |, b3 F/ G                if (val != ~cnt) {& U" c/ t- {/ B
                        size = cnt * sizeof (long);& g! G6 ]& `( s* M5 A  f& I: K6 Y% g
                        /* Restore the original data before leaving the function.
# |! a3 C5 d+ `2 a                         */
6 I/ C# z3 E7 ?, B& k5 f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ z8 f) q8 R5 b) G
                                addr  = base + cnt;
& h" t! \% w; ?( B6 U: K4 H% P                                *addr = save[--i];2 k) n4 u+ l2 z+ {
                        }
5 X9 S% L% d! E) w6 r3 C6 B( |, X8 I                        return (size);
+ G! F0 E2 u; ^5 g' ?8 d                }
" ]' l" y0 r& i- e& \        }
% u. u, t! s# Q) P- b# i, J2 I. \7 g# [
        return (maxsize);7 u1 }/ m( S& ?8 h* s
}
9 T  W- S: W! b0 c# x% Uint dram_init(void)  d8 p1 ]7 @* H! V
{! T7 f4 P, x) Y
        /* dram_init must store complete ramsize in gd->ram_size */
; T; G% X; Y. m+ A( E8 S* e& N        gd->ram_size = get_ram_size(  j9 C- m  E1 ^0 o) @6 |) B) {
                        (void *)CONFIG_SYS_SDRAM_BASE,
* }0 L7 b* _8 z& U& c1 P                        CONFIG_MAX_RAM_BANK_SIZE);
' g5 J& z  a  t" U$ b        return 0;
% T1 a  T- ]% e, U}
$ f# S' V, I2 b. n( j
  _# i# s; R  h4 f# p
3 b' L" w5 ]# p3 g; l( u5 o& ]3 b5 V6 `
/ O  Q# ]- A! N" m* _' f! C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- M& ^0 C) h' K% Z( a- h& \( [: u% O6 B# t* n$ z0 M
7 s$ ^7 B4 L2 \4 S! A' ?: \

1 ~3 u2 \9 n: m9 u8 ]1 U
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 21:37 , Processed in 0.037697 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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