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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, \+ |1 z1 m8 R2 l; @6 Q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 e( v$ y& M. F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 j: O/ O1 d6 w) `6 L+ P! z2 s5 `- i  S0 s/ A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( r" A$ J4 C5 i4 T/ P5 r
& |3 I# E" V/ z& B4 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- ^8 u5 K7 w" e) i- r# g/*/ Y2 d( Y" f- \2 S* N3 l
* Check memory range for valid RAM. A simple memory test determines* B# k  e) i8 u6 `+ ^
* the actually available RAM size between addresses `base' and# N0 u' [1 L3 j+ F5 N" v6 \* A
* `base + maxsize'.
% u5 d4 Y/ P9 F2 G*/6 r- T% a- M6 @: o  w
long get_ram_size(long *base, long maxsize)# P) i, q) `* w5 L' L
{
, g% c1 z2 ]4 B4 o& U" X        volatile long *addr;
6 X$ k: p  ~' E' l" T        long           save[32];5 d7 b  }! u0 b9 Q' R
        long           cnt;# H8 P, L9 R# v7 J7 B+ ?
        long           val;7 m; z. g$ a$ b
        long           size;* {2 z# O# W2 t2 q/ H" b4 A
        int            i = 0;, ^5 _. Y: W' d7 E

% S4 Q) G4 g5 [' z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 d5 I6 T: h. j* |: x
                addr = base + cnt;        /* pointer arith! */; x; W" t! U( S' D2 E2 H
                sync ();
! D" [1 M( E* k% W- E: I) B" b                save[i++] = *addr;
2 h2 [" i7 n% L8 H" q# l" U' v, A                sync ();' b# s* o! \+ H, `3 a8 }
                *addr = ~cnt;
) R+ t" F* H: Z! B        }
; I0 j6 m7 T# q$ e: B, p- C4 r; ]0 u7 F
        addr = base;
% A- P' \0 j; z" P+ n- b- \4 Y        sync ();
7 ^' w4 W9 V; l6 E6 u. v        save = *addr;8 e3 w: p( [7 b5 F# {
        sync ();7 |: ~6 W% _0 f6 G* |
        *addr = 0;7 N& }' Q9 |2 m8 S/ c5 q

0 `' y/ x" }' P* H. n. E        sync ();# e& J9 w4 u1 t; d# X* D0 X- V( f
        if ((val = *addr) != 0) {
; D% M) j5 h( }. d                /* Restore the original data before leaving the function.* r. v2 R4 k' ]' B0 ~  t# S
                 */
2 K# v( @7 y7 Q7 E# E( Q                sync ();
0 {4 G. z9 ]4 M) t                *addr = save;* q- o. Z# f9 I  |
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 d$ u5 ], ~# }. e                        addr  = base + cnt;
. k+ t7 m! r& {+ y4 F# ]                        sync ();3 e2 H) Z; M4 ]' \7 w; X+ o
                        *addr = save[--i];0 {; S: Q! M! m( q$ Z2 ^3 Q1 m9 C4 j
                }
5 b8 R* g* i6 }& B! I  ^                return (0);6 r/ C' l6 e; H/ ~# F0 I
        }
) [# |* G0 V- y+ m" M) [8 Q2 W7 f6 G% u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& c4 |: r  D+ n2 J- d) _* ^3 e                addr = base + cnt;        /* pointer arith! */
  M+ @9 o( b- ?% Z                val = *addr;
2 R+ M7 I) g& d+ b                *addr = save[--i];) ?% R5 ]5 X2 s9 A
                if (val != ~cnt) {
9 \! {1 t/ A) ?                        size = cnt * sizeof (long);
4 C( N! E5 h. \; R( H                        /* Restore the original data before leaving the function.( s+ j8 U9 [( N( T8 Y6 t' K2 J
                         */
& U4 `; r5 M* g2 f' @* X                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 u6 N" c: C0 H  G6 }% ~                                addr  = base + cnt;
8 u* i" K0 ?/ o& d7 r$ P                                *addr = save[--i];
0 l+ K: C: q; V- n6 U8 s                        }1 R4 ~$ W5 W5 `* ~
                        return (size);0 \% l3 u% F' {7 w1 e5 A$ c" w
                }8 T' C# C$ J6 B: u- D; g5 l4 O
        }6 u( [' I. w* a- m8 P! \
1 {' @  N0 M, H" f/ [7 |
        return (maxsize);" T% x( |) P4 r: |7 t' l& D* j/ }( R
}
7 r+ K  }$ |# ?4 Aint dram_init(void)6 J: l, @* h" f4 p/ g; L
{2 t! N  P' ~- L" m- v* B- ?% D8 l
        /* dram_init must store complete ramsize in gd->ram_size */4 U; o. e* o& I: d
        gd->ram_size = get_ram_size(: i# @: y4 c* k* X' n4 m
                        (void *)CONFIG_SYS_SDRAM_BASE,
6 f% @# O9 P) x: m                        CONFIG_MAX_RAM_BANK_SIZE);$ s9 ~+ m6 _& ?: Q5 l: }) l3 T
        return 0;6 h9 U8 {  h! ^3 s$ l
}  R/ z0 \& @; q

0 K) a; A- b1 Q8 h* F# H+ ~( S5 \8 k$ L+ N0 z
7 K- ?2 @% r6 H6 g+ |( c

+ H* U2 U; m! {/ s5 |FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, ^1 T1 p  x7 c; s  [
* v! y! A! f3 O% T" h4 }: {
. F, E3 f6 Y4 [9 [( g! i

9 F2 l3 X/ `+ c+ d( s
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 20:12 , Processed in 0.039182 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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