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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' f% N, f& U% q, i5 ]3 y核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 {" Z/ T( s5 j1 d这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ [$ s2 z; H( U/ F

- T; o7 d, {' k) r$ X) T) Q2 [是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. d! [/ e2 K3 ~6 d

3 E8 U" K- W  B& D' G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 x; a  ?2 K* S# O+ E6 i/*
* ~' p: |0 l$ ]! |* Check memory range for valid RAM. A simple memory test determines
  W5 B  g% O" }+ S  u, S& K* the actually available RAM size between addresses `base' and2 `- c) V1 y5 w+ }6 G5 s
* `base + maxsize'.
" w9 r1 O5 ?, l/ N# I+ I7 O; @*/9 {5 A- N8 O7 R! o1 X
long get_ram_size(long *base, long maxsize)
4 k) K- u) j# F/ |. V7 n9 J9 r! C{
( _( b5 `) H. Q/ O        volatile long *addr;
( M2 D1 ?! b# ~) s4 x  s2 a        long           save[32];
3 N5 G4 l' V# R6 t7 d# i7 S$ W        long           cnt;7 d! x+ x' u; r1 J& v( q
        long           val;
! i: U* V- G/ S% I- N' K        long           size;
* a- ^- t/ \( k( i/ e+ @6 J* ]        int            i = 0;5 m4 m0 D5 U" W" v4 g4 F9 n

& |; }$ M. x: P$ C" Z  Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 l' o+ N0 o. k; d                addr = base + cnt;        /* pointer arith! */
% s: P3 R% E! H0 Z+ X! k                sync ();7 I! k: i5 `2 j# M; l0 \
                save[i++] = *addr;
5 w/ J$ w- n8 a3 d" ~* z* I' {                sync ();! D9 J! y* q4 D1 m( {
                *addr = ~cnt;
" {- Q$ w! K4 e; F# _( X        }* q& L5 H; j2 }  _& a& r
1 O3 o7 J. |, L# {! Z
        addr = base;- t" X, a' D6 f2 }
        sync ();& N7 p  E% q- o
        save = *addr;
. _, o3 s$ b; S- v1 ]: r' N        sync ();
; b2 u! G0 J% t  x% i% |        *addr = 0;8 h1 @2 e) W7 \) {
( P7 w! ]5 l8 v! q/ U/ \
        sync ();
6 ]5 g" Q5 V. [  \        if ((val = *addr) != 0) {8 m$ C. Y$ x1 v+ W+ t9 r  K) T
                /* Restore the original data before leaving the function.
" S0 |: w+ h6 S% p                 */
! R1 D: ^5 `, U                sync ();
1 G9 [: q3 u0 z6 L4 _/ E7 \                *addr = save;
6 O* W  j4 @7 }2 m0 j2 M- V* b/ |                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% a" x, i0 w' T$ [                        addr  = base + cnt;& l$ v' _1 k' }( w' y; o6 W7 j
                        sync ();
7 c/ S( p, T+ z' k/ v9 ~                        *addr = save[--i];5 Z% |7 \! O8 ~4 L% X# O4 e4 X8 Y5 R" O5 x+ a
                }) \- @, W" B5 E$ \7 d- l7 `
                return (0);
6 N6 ]2 U, M4 M0 ?        }8 m5 y0 z4 b( h: Q) q7 B
# ^4 z3 D& F5 S; a6 M3 Y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 ^1 t3 P, N: m1 w- }0 ?                addr = base + cnt;        /* pointer arith! */
; r9 I* W) P. ]' q3 O% O) F                val = *addr;- Z7 N5 ^/ k  r1 }% Z+ c! }6 P# I
                *addr = save[--i];' K; v7 C, q  r) o$ m- F
                if (val != ~cnt) {
+ i, K" c' @& T- \% O& a) {                        size = cnt * sizeof (long);/ m0 O% Y: p2 d# h/ o& m! T
                        /* Restore the original data before leaving the function.) {9 _: a/ ?1 y
                         */' C8 g% c3 E) ~- q9 p6 j
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! M$ s+ g) j8 S* d  v# G                                addr  = base + cnt;  B# e* Z+ T, [5 ~5 u4 G" j( G4 r
                                *addr = save[--i];; J# `) x& s8 x
                        }3 _9 R6 t. H6 g1 v0 U/ ~
                        return (size);
1 a: K# V8 X" B9 i% u8 c( I: L. ]' t                }2 G* T3 a: o) p) B
        }
2 @# {( Y+ k! f& V2 s& u2 G6 P+ G. X, a% u$ N% D
        return (maxsize);
7 D# L/ ~$ m* u7 T# [}2 Q& f2 l0 A! d$ D6 C
int dram_init(void)
7 \: r; W. Y, g6 I& b) @{
! y1 X' x! e3 B$ Q8 q# Y        /* dram_init must store complete ramsize in gd->ram_size */% `& I7 M9 Q) s0 a$ {( i
        gd->ram_size = get_ram_size(
0 E  ]) v) u6 O5 p                        (void *)CONFIG_SYS_SDRAM_BASE,
7 w, i) h% J/ v7 j! ?- X                        CONFIG_MAX_RAM_BANK_SIZE);
) y: z5 A4 w* ~  J" @) K  Q        return 0;. |9 Y9 _3 [! U/ M4 I9 p, B
}. y+ I! l% w; g) {( F, y, f

2 U, Q& L0 x6 G: E, f7 _9 @5 i# p! Q/ S1 Z8 p- G

; F( z5 X/ r# x3 `. B, E" ]' [. _: W8 c4 W2 L, p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 n  e: u1 G) s/ q- q

. w/ V% {- z$ B# I' C) e' k
' A/ V- M& u" {. ]* [
' E& }- R; ]: f3 U3 c  e2 y, P
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 00:34 , Processed in 0.096614 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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