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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, I( S; ]3 h/ @7 B; n
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) N) W" {) O; y1 N' n# J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& e! G: |) N) ]0 j5 m: a9 c9 _
3 S# S  c9 z" G  C+ d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, R/ f9 F4 c) L1 D/ g% P) R. ~$ S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 Q' e+ V: @" s5 W$ a* {
/*/ w$ K% g. ?! P7 _* F# S
* Check memory range for valid RAM. A simple memory test determines, G- P! C2 D1 F* J' u7 N
* the actually available RAM size between addresses `base' and+ w2 N) u9 w+ f/ k5 S4 p
* `base + maxsize'.
. W3 X& \8 @! C# @) r& g*/, ^6 ~* l9 Z7 I; ], R$ |  l2 D
long get_ram_size(long *base, long maxsize)5 N1 a& J( |' C% \. q; r
{. N. `7 z' B1 a
        volatile long *addr;
) r& P+ _0 m7 X9 C# O7 Z        long           save[32];
9 V- G, i3 F' |, K        long           cnt;' u% u+ X6 T  i1 j* [
        long           val;8 j7 f! }$ I$ Q0 U
        long           size;" @7 y' G' K% n! |2 t; `
        int            i = 0;9 @$ a/ J* U2 [0 ?* e

: x- [! ?; @( q8 I        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* Q" o, Q$ }3 {: J2 k9 R$ L
                addr = base + cnt;        /* pointer arith! */
8 m) P- y) j& W) J                sync ();6 C, n) a& C! j& Z
                save[i++] = *addr;3 x. T  F% F# T, Y
                sync ();4 D) q; x+ m, G- P# d# B
                *addr = ~cnt;8 U& f3 p' X7 n1 B1 d# k  W8 V' ?
        }
$ b# a( `5 k/ C/ Z; T% }
5 I" J) \" v, J  u( C9 E& Z        addr = base;; U9 p" o7 {* i5 g. U
        sync ();
+ q9 K( F$ y& }* \4 `, Y4 B5 Y        save = *addr;
- h8 R' X+ Z& ?6 S5 C( u        sync ();3 {' F- B& g6 C( o5 o' ^; L% e
        *addr = 0;4 T: E) h  v# k4 U# `+ Z

2 b& M! `' ?; D' L  c        sync ();9 ~- N0 i5 G, p. `) l% X
        if ((val = *addr) != 0) {9 b7 O1 B  n$ h' |
                /* Restore the original data before leaving the function.9 e! V+ r6 [: ~6 z! y7 q; z$ `
                 */( g/ K6 `! }, b7 D0 a. ~
                sync ();/ l5 U2 B. D- U( B
                *addr = save;" @- T# J' }; n2 p2 ~  w: b, _" r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ w: B# f  A, H0 k, |                        addr  = base + cnt;. D# t+ ^# e* B# z+ w0 O7 D. c3 |
                        sync ();
4 a1 R. m: V# d1 u1 e( L                        *addr = save[--i];  i( @0 y. O" Y2 Q& B- y
                }
5 X: H% y5 C/ G+ k* _9 {                return (0);
: D* g- F4 p4 c        }
1 f. ]3 Z7 D% f- u; b2 O- k" b  @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! `6 i4 i; M: k. r6 ]" D& V9 s  Q# P8 z                addr = base + cnt;        /* pointer arith! */
" ^/ S8 f: A3 O+ U* Y3 {* _                val = *addr;
4 s% s. Z- D% r                *addr = save[--i];
- J7 a( G  \* t* ^                if (val != ~cnt) {" [5 M% I# ]% w# h0 M4 W8 s* w2 T
                        size = cnt * sizeof (long);: j3 t! A5 W# }: b( t" S
                        /* Restore the original data before leaving the function.7 A" ]6 O0 K; J; u
                         */
2 v6 J% i: w0 d2 W- P4 N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 l- l3 y8 u8 b                                addr  = base + cnt;
& g( m3 R! X* z( B                                *addr = save[--i];1 `: a* G. Z' u1 K7 T
                        }3 t8 m; L* H8 x- ~
                        return (size);
; H$ N! b. w6 Q) e9 X. d                }" K- ?! \6 U7 I
        }
* [1 N, _4 S+ |% T/ g) l
9 H2 @* ]5 X  p0 `8 W' i: ?; w        return (maxsize);
2 ?; n% g  l$ Y4 o! K- [6 L; C}
4 ~9 V* T# U4 A8 M9 Iint dram_init(void)
1 d2 C/ c5 O4 P' w7 m( k' G{
. c$ N& ?6 L: t% {1 `+ _1 J        /* dram_init must store complete ramsize in gd->ram_size */5 G% u7 V2 p+ J7 t% `
        gd->ram_size = get_ram_size(
! \+ \3 U; i% I2 O7 {3 Q1 I- c                        (void *)CONFIG_SYS_SDRAM_BASE,
3 l! C: t: z1 p9 `3 Q7 b% p                        CONFIG_MAX_RAM_BANK_SIZE);3 q+ a) g9 N7 t. Y9 L7 n
        return 0;/ d& C8 X& H# G4 Z: M0 z
}5 m; ?* O. [, C* l4 a. A3 e
) B# a- o1 J$ _; S
; r% V3 a) E$ c" M2 P

; u5 M) A+ \; j( [0 Z
- y( }; f+ o+ B4 _* uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 e& g5 C# G- K7 K& _1 F, u/ C4 u# `/ ^' ^8 t0 f
8 Y1 C- e% d2 H- [* b1 W

" X7 A, v# Y- F3 w  G8 V
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 04:16 , Processed in 0.039954 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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