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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 G4 E/ a6 e6 R+ Q& d
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 W" r) N  w5 O$ D& W# l! p这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) T: {8 Y# o- I, t

) S. o8 G) ]$ e* e; o& K8 d: }  e4 y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 a! n% @$ b. B9 t: I, I
6 k' D- y, m; \* J/ y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ r4 O+ Y2 G( M! U0 O! S6 g+ Y/*
6 e6 _7 {) }7 K  X# e0 R* Check memory range for valid RAM. A simple memory test determines
0 K0 a1 e6 s& J: g* G- D3 m$ F* the actually available RAM size between addresses `base' and. v! G, @7 c8 K2 n# ]
* `base + maxsize'.9 r4 }. A8 N2 v# s: B# [
*/) ^; h2 m4 ?  h4 X; s1 M
long get_ram_size(long *base, long maxsize)$ a; l, o( f: M. I' y0 l* [
{
$ N! A  I! V6 Y- @        volatile long *addr;- n1 B  X  s* s( T  K2 y0 T. P' X
        long           save[32];0 y) E# l1 o4 z# w: N3 k# v& k
        long           cnt;# @. _1 V* o+ h1 }& r& n# `
        long           val;
: J, I' o0 ^( M        long           size;
, b& |+ @: n8 {( p        int            i = 0;
8 i  L. n+ N% l! x+ C
8 C7 Y$ S2 e& ?9 N7 F; a        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% K  ]; }1 @  G                addr = base + cnt;        /* pointer arith! */. q- p: s+ b/ G7 g  H( N" c& \
                sync ();) d  _! Q' @! l( o, C' ~# G/ P
                save[i++] = *addr;) X7 U# X( s& ]: t6 V
                sync ();
' I0 Q) j: V( R2 C/ R! P                *addr = ~cnt;% J0 W! }- C4 j, f  v2 J9 k3 j& H2 `
        }
* r! L0 ]8 m$ {. j3 j5 b, e. L, {9 z  Z/ A, y3 _4 W5 c1 v4 _1 S
        addr = base;* q4 N/ I: J# z. G
        sync ();4 Q# ^( d: ^* Z5 Z
        save = *addr;
1 p7 R1 G! Z! g( G" G5 V: j  r        sync ();
! W3 G8 i$ q3 m- t! g$ ~" M6 w        *addr = 0;# V( u9 k' T/ [
0 Y2 w3 L$ B1 \* F6 {+ z( s8 D
        sync ();. f. r4 a7 }7 I7 {' j
        if ((val = *addr) != 0) {( ~8 h+ t; T. l3 a/ l
                /* Restore the original data before leaving the function.. _. ^3 V' G9 s" Z. ?+ F3 Z
                 */2 [$ E# @/ z) p, z) N8 }. @
                sync ();7 ?+ K/ ]6 r! K
                *addr = save;) R: D0 F; Y: o2 N+ E/ j1 t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' {# {2 O3 Z1 @- S$ ^# ^  S$ O# ^; _                        addr  = base + cnt;
# f$ O" L" ^9 @: z0 T                        sync ();7 |, p- W: W9 N8 o8 t
                        *addr = save[--i];! S9 |- {5 u! i' M* S
                }, j" ~  ~' Q- R7 v; S: R
                return (0);
/ Z0 B5 h# V/ ]        }( P$ l4 f/ Z5 d

, A' w  F# m6 r/ {" X* ]        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ i8 U$ t, c" [
                addr = base + cnt;        /* pointer arith! */
0 L4 _, m% \0 a1 c# H                val = *addr;
& n2 _. E  Z) N2 \% K" h                *addr = save[--i];
4 _% Z# P( Q2 X- E# @" b9 g                if (val != ~cnt) {
) Q; k- ?' E$ t7 v' G$ U0 Y                        size = cnt * sizeof (long);; D- f% Z5 l+ V( o
                        /* Restore the original data before leaving the function.% I- }3 [$ T( R2 e# z
                         */9 m/ P; O8 y3 \9 R3 a1 G  `' m* L
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 H4 m4 Y1 a( H6 Z. p2 C                                addr  = base + cnt;
# R/ C5 L9 i, }: c                                *addr = save[--i];
2 o2 ?0 \) U1 C8 P" i) H                        }
- G; k$ O# k! C                        return (size);
' a; S, t+ ?" \) C( p9 ~                }$ P6 }' B8 S) R
        }
, B$ a2 f2 B- x! v' g5 }; R" _) a! }: c2 ]% [. o
        return (maxsize);3 s! r+ O; Z: j. b/ Q
}* b' W$ `; E. K
int dram_init(void)
: M. L* m4 E; g' K{
) y. A$ X2 k: ]% `) F' l2 u        /* dram_init must store complete ramsize in gd->ram_size */* K: `: `% k7 _; b) S
        gd->ram_size = get_ram_size(
1 |( M5 f8 |# {                        (void *)CONFIG_SYS_SDRAM_BASE,) B# w1 r& |1 U, ]$ E1 p: }3 v
                        CONFIG_MAX_RAM_BANK_SIZE);# u" B4 T. G" ]6 L+ }
        return 0;, S/ V& c# G. \, e# r# X$ _
}/ b% e! O7 k9 z# c, t# ~

; V/ t1 J1 L  h+ x1 i2 W& O- r, w- C9 V

% m* x/ G6 S. h# L. @6 E: A! c/ j4 f( n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 |1 n  d) U4 Z$ B& \
' p1 w& X7 T7 h" y' _
, x, d( O! J) q& r' I' `: P
* k" l; @( X6 U0 ?9 b$ g( q! [
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-20 03:09 , Processed in 0.037580 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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