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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ z1 q$ x% X* v# c) o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ `. Y# b5 g/ N' U2 q* V0 X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- t& g+ {* B# ?  _3 t' O9 w2 H) [5 F8 y1 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, Y7 {/ ]! ]$ M0 t6 I
' U7 x. @6 s) j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  A) }) h2 ]2 D- B6 f9 U8 b$ r$ ?/*
! ^* B2 r% \; [3 s* Check memory range for valid RAM. A simple memory test determines
$ v4 z7 k& U7 M0 X! |5 z* the actually available RAM size between addresses `base' and; l# z( r; g; K6 x2 T
* `base + maxsize'.
3 n7 F, X) W2 i$ D/ [6 U4 A*/
% C" b; w. I0 I7 T. {7 Nlong get_ram_size(long *base, long maxsize)# J4 `2 h, c2 G4 i+ b
{
4 ~+ l  O: H' i& t% {- m! e" H! k        volatile long *addr;3 b1 G0 V' N2 d9 g  x
        long           save[32];0 B! r0 I; N* Y/ i8 Y; |
        long           cnt;# D$ j# g5 k/ {8 E' J* u9 D
        long           val;! j3 }5 P8 u+ \% [9 |- |
        long           size;2 U# @2 u! G5 `8 b# N9 a
        int            i = 0;* I7 w& ]/ ?7 a2 J9 `

+ k# ]& s+ |! u1 F6 c2 Z5 N4 M        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* k2 u; N3 e: s( r
                addr = base + cnt;        /* pointer arith! */$ }8 _; ^) V, L, @0 V1 Q5 Z# w
                sync ();
: W" }7 o0 ]/ X) o5 c6 S6 p6 B                save[i++] = *addr;
- w6 a: i/ c4 e6 R/ ]' c                sync ();7 z* I2 @2 _9 L; O8 p$ J- T
                *addr = ~cnt;% T5 o4 |( l/ t8 W/ e# a8 z7 J4 p( ]
        }
6 f/ u% O; E3 b& a
/ H9 v# }! c. h, S* z( [        addr = base;
, f1 V) O: @0 T( y. {/ ~        sync ();, r; `6 O% V. J8 a, `" `
        save = *addr;
+ w4 s: M0 r  V# v4 h7 _        sync ();
& K$ Q0 t6 `2 b! M0 n' Y4 I        *addr = 0;1 T; T% b5 N- `# t% ?& J

3 O$ }: [" c- A1 }# n& \2 O        sync ();
- R. U! \+ S6 Z( }. c, T  _7 T- M        if ((val = *addr) != 0) {
2 ~4 l+ a2 ~' Q& v3 m; |# D- @  ]& K! ~                /* Restore the original data before leaving the function.
4 r0 R6 n8 K/ [' {2 r6 H                 */
/ a1 n; C/ Y/ r  z0 g: W1 B" ~                sync ();$ v- p. R0 L+ Z& D: f- D0 }- I
                *addr = save;
0 n) M8 I9 Z% G6 @8 x% ~+ I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ c% I$ z5 c& T. w
                        addr  = base + cnt;
. A6 o1 t! F, H3 h$ L4 l/ d                        sync ();
/ T3 D' |4 w& l4 p) J& W' u- I1 T, l                        *addr = save[--i];! m( y9 x# P. C# {( q; L" h( a
                }
  y; m( U- g; v. ]) @                return (0);9 Z2 f; y/ T" e) i5 H: F; O
        }
  o2 J: b8 @: y* _! \$ c$ v9 {- Z# Q/ f
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 Z. S4 q9 k- k" s8 @* ]+ E+ r                addr = base + cnt;        /* pointer arith! */
; [9 `( e  q, A# N% _& i( X' |" l& F                val = *addr;
: h* [  V% J" |( e: R; B                *addr = save[--i];
: I3 Y; |0 c5 \8 b( ~9 t4 T                if (val != ~cnt) {: f' ^* j8 x- S
                        size = cnt * sizeof (long);6 a% M1 ~: g2 m+ e7 O9 }! l
                        /* Restore the original data before leaving the function.
6 Y6 R! n- M3 [9 D7 M0 @                         */
9 V3 u; Z* ?% k! D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& [, z& @; ~7 `" ]/ E0 }9 r+ L
                                addr  = base + cnt;
% o" Y3 M# h3 s! p) t6 x3 {                                *addr = save[--i];6 q( m3 q4 Y, G8 P* E
                        }7 `3 c- J- `7 A1 Z2 \- `
                        return (size);' q1 O- }' j* o1 q* p4 T
                }$ c5 ?% ^$ D! f2 |" v
        }5 M# C9 w" n6 N7 J' f: b

6 q$ l4 a1 q% X. X; A. M6 d$ I: q# S        return (maxsize);
# \4 B- R: [. u}
; L# w7 d! J9 x4 C2 bint dram_init(void)& ]( ?0 m- b/ [. b9 D
{
; a$ X# v+ o8 k! `        /* dram_init must store complete ramsize in gd->ram_size */
8 E. [$ d- B5 f* ^; n        gd->ram_size = get_ram_size(
" @+ C8 G3 f: Q" {) q                        (void *)CONFIG_SYS_SDRAM_BASE,
8 @/ l3 |( v' ]( K                        CONFIG_MAX_RAM_BANK_SIZE);5 a: S, S# ~8 C" V0 o
        return 0;- s. r: \3 j1 X
}7 e; N0 ~  ~, E) L- _

( L2 g0 w; B. N6 ~' Y* F" A. k3 \. P* y
" ?. s. q. n6 `" J
1 {. q* l0 Y3 @0 @6 @( b) R5 p6 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ }, O: K/ h* M9 q# Z/ n  m8 S( Q1 j5 @; q: o; r1 U0 O/ h  ^0 s+ X
3 n+ d  f4 t3 o' T/ u" G( g

3 M. h& W( i$ s+ k: o# `( U
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 03:47 , Processed in 0.038561 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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