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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# H4 L$ w3 T; S
核心板2:DDR2 256M Byte   NAND FLASH 8G bit- W) p) r) M+ w3 R- z* r' E* N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 M" r/ Q2 ~! A. ?8 {

2 [5 ^3 @! F; K: D( Z" ]3 T是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 D/ D8 L1 _) w+ I7 Q$ u9 r5 l2 _
2 d- i) S+ A" k0 t: n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 U$ L  V1 z- d6 C2 Q/*7 I$ j# [: U/ X9 `
* Check memory range for valid RAM. A simple memory test determines
/ p3 h0 Q1 d0 q4 [" ^, U$ d* the actually available RAM size between addresses `base' and5 Q' {& A" ]) y& i0 l/ G7 C
* `base + maxsize'.  g& S; A$ |  f% T: D' e: Z* u
*/
3 ~* n( [9 Y, olong get_ram_size(long *base, long maxsize)
3 b( s) |6 F( f3 f! u{
5 p, \* x0 t2 a8 o* j" ]        volatile long *addr;
7 r& p7 M8 t. E+ Y% `        long           save[32];
. N' u% N( w4 ~7 ]# w+ U! {5 t        long           cnt;( t! L! H8 H( M/ |
        long           val;2 D1 y1 ?1 D+ H6 N2 U+ `
        long           size;
% ~6 {" j- j2 e/ F8 J8 e  k9 Q* K        int            i = 0;" H, ]& E4 b0 g0 K

2 S. T# z* {0 L) a) }9 y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  R' f: l! m* s% C: j. A
                addr = base + cnt;        /* pointer arith! */
1 {8 D  k8 l! ~) g9 P                sync ();
# _) b+ k1 B& j4 J1 Q                save[i++] = *addr;0 z2 ^6 s- |- l) F& J8 V8 u4 `
                sync ();
( l2 m$ J8 ?( |5 W5 I" _3 w0 I                *addr = ~cnt;% u8 K/ ~' s9 U% q: K5 Q' Y
        }
1 _, ~8 l3 q! F# d! N+ V$ |  E( c1 U0 m
        addr = base;
  d1 x+ w9 c9 Z        sync ();+ G3 }& Y6 V0 ?+ M
        save = *addr;. \' h' M' Y$ y. f' \) L6 E( y
        sync ();
0 f# d* V4 W9 J# U7 X" |        *addr = 0;0 g9 h6 S" x; j0 i, M

! B/ o4 k& w3 V4 s2 t- I        sync ();
; @( Y; i) X( U. h        if ((val = *addr) != 0) {# }( Q. p# f' P9 N
                /* Restore the original data before leaving the function.
+ s6 Z3 j3 u6 G! `1 \2 K6 _                 */
4 n9 v  h* [. H2 Z: e/ D( b                sync ();' i/ X8 v& O5 ]. x5 P  r
                *addr = save;1 V& N) ^( J1 }' G0 ]+ X1 ~
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. c! ~3 u( L, B! C4 f+ |7 d                        addr  = base + cnt;
) D: Q3 I( j* \                        sync ();" ?7 u$ p# Q5 n1 L# j
                        *addr = save[--i];$ \$ [: q; u9 ?7 f1 E
                }. S7 u8 t6 b2 L) i2 z# g
                return (0);8 b1 B3 {+ U1 i  k4 [: ]5 M4 H
        }
2 D2 w# ^7 P& @/ l- r4 ~  r
3 z0 z( _# g  j% U3 o% T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 J- Q5 l3 M/ J, i' R: t# T7 [; Q* I                addr = base + cnt;        /* pointer arith! */
: i: w$ R2 t9 i# r/ r" s8 h                val = *addr;+ V! H1 M. T) {# V9 f' _
                *addr = save[--i];! \+ C0 Q" o( J2 }: `  m+ Q
                if (val != ~cnt) {: t! u% [4 F! }% S. S! b/ n2 [( a
                        size = cnt * sizeof (long);
1 ^: H3 }# W: P! @% [                        /* Restore the original data before leaving the function.
- _( f7 ^" j4 p  W                         */
, v7 l# a. l! h! `) o9 F                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ Y! F$ L: \+ V4 {: r                                addr  = base + cnt;$ X9 `& `/ [4 ?0 n: ?$ p
                                *addr = save[--i];
' A- ]! N! E2 Y" k* q1 R( h( w6 P+ U* @                        }
5 p- t; c, ?. R) ?: E+ d7 A* |3 W                        return (size);
: u! \3 ?' m# L- t                }
0 \* ^: D8 M5 ]6 c4 u        }
! r# y) n1 r" s8 o" `' t7 E4 ~0 j, R& l+ Z( n% a
        return (maxsize);
/ ~5 T6 F8 s/ `2 E}
$ y8 n' k0 v0 u# H  t* ?& y) n% w; K' cint dram_init(void)
8 C5 k3 t! P) _' Y8 w) i, l& v4 ^{4 v. {: s) N/ C9 |* H
        /* dram_init must store complete ramsize in gd->ram_size */
4 {) v+ `' U5 I: M% b) D        gd->ram_size = get_ram_size(
  S, p% v2 G$ f                        (void *)CONFIG_SYS_SDRAM_BASE,
- e  ]" p4 w+ Q# v. y                        CONFIG_MAX_RAM_BANK_SIZE);
6 y; Z1 g  ^; P7 L0 m0 V+ A7 Y        return 0;! S4 X# n; R8 e! \  ^  e* O1 C9 u8 t
}4 q4 ^$ _* I6 c7 l
' L$ @4 |! U3 ]- G1 E

5 [- r# t" C  ?1 a" D7 a2 N+ I' n. Z: G$ T" y

; K3 C5 g3 l% [4 `; R; o  p# s& fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 _/ i0 w: t7 j4 u
: L1 U6 [+ o& b- S/ G" t# F, O
3 r7 b+ W9 ?- E8 T3 b

* k8 g) w6 G0 y% y9 P% H/ W& n- d7 U
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 04:16 , Processed in 0.041187 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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