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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: I5 Z% u+ \7 l( D6 f( M) o核心板2:DDR2 256M Byte   NAND FLASH 8G bit, ]4 N) R6 O$ e/ {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ G* p1 {+ T+ a  D. q5 {' n, _  @
" k1 o1 M/ h8 O1 H9 q; l8 d" t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ R2 m* ~" r1 x  ?! m
- z) Y  v. l9 z: h6 c9 F: ~  o7 X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 ~# \3 x6 n2 N; g2 \. V/ X3 ]/*
' R$ F/ I  m) \. {* Check memory range for valid RAM. A simple memory test determines
8 {/ L, L7 l  P7 }) l2 [* the actually available RAM size between addresses `base' and+ D8 `+ B, D* W7 N; ^+ ^
* `base + maxsize'.% R; j& X/ a& A8 H- J9 J
*/7 j# _7 z" S. P4 P8 R! N
long get_ram_size(long *base, long maxsize)$ Y( r2 C) ]; K5 E% z/ w. A7 ]! j4 y
{
2 r& q$ u: p9 _! }3 k' S$ H7 E0 c3 q        volatile long *addr;
& b8 ~1 c4 J/ m        long           save[32];5 Y. }1 T1 \7 k9 h9 i1 ~
        long           cnt;
* N1 v! ^0 P' K        long           val;# \0 K! k/ I! e8 Z
        long           size;" w6 z+ @) ?! r& F2 I! T
        int            i = 0;9 B) P, f- m) s& x" [, ^5 H

+ e( P( A& b8 h& W: K# U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ w) ~, @5 {8 i; L                addr = base + cnt;        /* pointer arith! */
2 L# N0 A7 [6 x  G5 x/ X1 x7 I                sync ();
' P& c; z$ w. V! U9 @7 [; B                save[i++] = *addr;
: B3 v6 C" e& p' y" t- Y                sync ();
4 ?" i0 M& x- Y                *addr = ~cnt;7 u- {) R2 w% ^+ t5 `' H3 W
        }
" ]& }8 C# c( W. S/ d6 e3 c! m! P& e! o, I: D7 k
        addr = base;, M) X' X5 G" i7 j) Z6 [( E9 R" M- Q
        sync ();* \+ d. a& c* k% \% k
        save = *addr;
. Z2 y4 c2 s2 X/ l- ?2 x( n        sync ();6 N/ }: Q- E0 N5 @; f+ F! ]. A4 E
        *addr = 0;6 ?$ C. K+ F1 p; h
& j1 R6 S* R6 c" Y) Q! G( Z: B
        sync ();0 B/ u9 V8 `+ d. |+ m7 k7 ^
        if ((val = *addr) != 0) {3 U/ G3 k. N/ ^- j* c: V% c+ K$ L
                /* Restore the original data before leaving the function./ E7 p( R) L* a! A
                 *// ?7 E7 U5 B% `! o6 g& |" h  }0 p
                sync ();! L6 C8 L4 ~& M( s5 L; S
                *addr = save;' k1 s3 N, d$ P$ ?) D2 c; |0 \& {9 V
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& @- _" h: H% w" q5 E) P                        addr  = base + cnt;. O5 |9 h0 R; x/ o5 K& q
                        sync ();/ Y2 ~. b0 ]% K3 m% B
                        *addr = save[--i];7 V+ f2 m) N& I9 J1 e% M8 a; @
                }
( f- q5 X* {/ H: ?$ I                return (0);
/ `: M6 Z3 \( g- e2 Q3 x        }
" ~9 _' e& }" v# X9 P& q  w4 @8 g& X: F
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ h: z- C) A) b5 t                addr = base + cnt;        /* pointer arith! */2 n) ]0 T3 m( E. P# k
                val = *addr;
$ L& Q: s" E* u6 z) S" j- ?                *addr = save[--i];# H; s3 [' v5 A4 a; z5 M
                if (val != ~cnt) {
! {$ r# T$ l5 r' g& |) I                        size = cnt * sizeof (long);
2 e/ [' c% C5 G, w                        /* Restore the original data before leaving the function.+ ^. w4 s( x  @9 ]
                         */& u. i( i: J5 ?: W- e! s, D
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; E. i$ _+ O8 o9 i" S' o8 t                                addr  = base + cnt;
3 N2 w. z4 q; h( }3 U                                *addr = save[--i];5 N+ x2 ^6 i7 S! ?. Z% P  H8 z
                        }
. y( r# h, w$ L2 D! ^                        return (size);& N* R- _* V: o: j% R% A  f6 r  W; Q
                }2 g8 f) k5 ]/ ~7 Q
        }
- m3 ^. p7 B4 c
* @/ b! x( ?# v& B6 D3 i        return (maxsize);: Y7 g; P! J$ @  Q; Y
}7 e% A/ T+ t/ h! ~3 a3 d* e1 J
int dram_init(void)! |; ~4 w2 Z- c+ h1 R0 l
{0 ~# Q9 }! D: \* u* [5 v, U
        /* dram_init must store complete ramsize in gd->ram_size */
& ^) M( ^8 e; X- h: p        gd->ram_size = get_ram_size(
5 `- k3 O2 q1 F8 E: [                        (void *)CONFIG_SYS_SDRAM_BASE,. d$ q  n2 z1 I
                        CONFIG_MAX_RAM_BANK_SIZE);2 I3 H2 Q( e: e
        return 0;/ k1 i; N2 W' }4 g3 u; G
}
! Z& N# P4 j' U; ?/ R. B* ~7 s* \: b) @0 y# y( W

6 [0 y7 j" L, V2 l' n: t8 z9 Y! j7 c4 H! ?" U5 [6 I- }

2 v2 X) Y$ T: I' I! o: BFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 d" d: w6 B! W) r  f2 |3 h* l  {3 H  P9 s. j' P" R" k

( ^% w2 U; b3 C6 o+ @% |  u8 J

8 z5 c. F! G$ U$ m
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 10:01 , Processed in 0.040034 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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