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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- ^! h3 H+ q9 W' @2 _- s核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 H0 h5 m  t7 q1 m1 q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 H  x" ]7 M/ K8 t7 `/ C3 D
+ I+ E1 {* d. a0 `0 d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- b, d, @$ K4 o. s7 Z% y
6 `; Q; w8 T- [* J1 Q- n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 q* J+ K" g- F: I6 q' A5 f
/*
; c9 H7 i( }: Z$ @, L" |* Check memory range for valid RAM. A simple memory test determines# V! ]; A0 n9 q
* the actually available RAM size between addresses `base' and
, f% U' w" C& o4 ?6 z* `base + maxsize'.
# x; }" Q9 B, p' g6 ?*/  _9 K1 o4 M9 s1 `8 ^3 p5 Q
long get_ram_size(long *base, long maxsize)1 B( d7 g" Q2 i) A% D0 ^
{6 p# T- L4 \% e6 m7 c, R! G( e
        volatile long *addr;0 [% u( O9 [6 Z3 v
        long           save[32];
" P- m6 r, W) |8 c  V* ^        long           cnt;
; A% |% j8 T0 G5 U0 s        long           val;% p) f0 @' a: d5 {
        long           size;
* b( ^( T; B7 k" b& E2 f        int            i = 0;; J, R# x: p7 V

* q" |; l" w. @! e) S+ \        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 B1 @: L9 _- T' A
                addr = base + cnt;        /* pointer arith! */
& t1 ]0 Y" B+ J) l8 M- t; U                sync ();
4 ^9 F8 w8 D' b6 `9 y! m                save[i++] = *addr;
# `; \! D& z3 k/ `5 j- x0 ?                sync ();. Z: y2 x: Z/ ^" J
                *addr = ~cnt;
9 p! j$ L% S; U! j: F0 Q# |. H        }* d2 {& i  S4 i, X0 I( c# K

4 v1 @/ Z2 e( {- O        addr = base;
9 U# y5 c: z) \: i. L        sync ();
# _! {' J7 d- x& D7 H        save = *addr;
% }1 z, k6 A6 x        sync ();* d* y8 d& J* g% r. X! g/ R8 ^  {
        *addr = 0;4 s2 @0 P5 K( C: q6 V
" Y8 I. A$ q/ A1 }% h
        sync ();* }$ ^) d* r7 E4 m& F
        if ((val = *addr) != 0) {. Y9 A. m* T( `6 Q* w7 M6 j; N
                /* Restore the original data before leaving the function.6 R" Z8 B# c& J- {9 m$ _
                 */# E+ K- S% f+ ^% S& x1 p8 j
                sync ();& X7 G  z# p( O- {- q7 C2 p, {! M
                *addr = save;* B- Z' `; z: q9 P8 o: D
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  m) a7 B( t9 {                        addr  = base + cnt;
3 ]! t: H& O5 F! Z; h9 r. e                        sync ();
  d6 A$ X+ t9 V2 [  H                        *addr = save[--i];5 ]# B+ e) K. p+ z" O% q" q) }
                }, z* K, e& L: R! a4 v
                return (0);
2 g& i  X: D2 ~+ t( l        }+ g1 T/ n/ m  H! E1 b" m
( b5 o4 d" Z* @  {" N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- c9 N7 g. g& V% `                addr = base + cnt;        /* pointer arith! */
* A) H% v0 ~/ O  t2 @6 D4 {                val = *addr;
+ ~9 K- s5 h: R! V                *addr = save[--i];
1 U) P& {  G$ c8 z: }! s- z4 O                if (val != ~cnt) {: W2 l- s2 n% n* N$ ?: D
                        size = cnt * sizeof (long);8 a& B- s- s) b/ e& W- n
                        /* Restore the original data before leaving the function.
8 I7 f7 w! L9 w3 I                         */  |4 e9 B0 R/ c* U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* o4 T* `3 X1 D7 [( C1 l
                                addr  = base + cnt;- f( U6 q, A2 y0 [
                                *addr = save[--i];
- N0 K, x! R9 L                        }
5 x: k/ e3 y& L3 [) |& V6 e                        return (size);
* i, C# V. }' M+ u                }
( w+ A' {# S& W2 Q        }
6 k) X# Y! Y& O+ j% ]" v* U" J: T' \5 q# @1 ?! f. v5 Q
        return (maxsize);
% \# f! S* [8 l& d1 C}( h0 O7 L* p! S" u2 n- j
int dram_init(void)( k5 J; e3 m; e3 |
{
6 S  Y- y+ F4 g5 l! o$ g        /* dram_init must store complete ramsize in gd->ram_size */
) h3 K9 h3 W1 w: \& Y) P# I        gd->ram_size = get_ram_size(' u: k( Y, @( x$ o- H3 t/ z; E
                        (void *)CONFIG_SYS_SDRAM_BASE,7 c  W) r2 S, {1 C0 P- r
                        CONFIG_MAX_RAM_BANK_SIZE);
& y6 A6 v0 P' b& [- Q        return 0;
) l3 y$ j+ b" E$ P9 Y1 d7 G& {# ~}' U5 q: G" a; A  B6 ~: l# G
, X4 w3 a( B8 Q% U. z

& G  g8 z  l1 w( S8 t# R- L( `9 ?9 I& h9 Q
4 B: c+ Y: a$ j! ?; O/ o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 V1 f* X; y* b$ J- ], \+ c

# L3 }6 m1 S" t, D1 h4 ^6 M5 N8 [- Y
" r  T3 \. U3 F1 l# q! b$ ]

6 l  N2 G3 K9 L4 `  d! u8 L; I
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 23:26 , Processed in 0.041741 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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