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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% W" L5 r$ H+ \; V1 e核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 l4 k# b: @# W. X0 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# j% i- k# m! i
% l* i5 R! |' Y5 N& t% x; j% r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" {! q, ^+ Q; d2 b  `2 f
' L% _. {& v/ D! N. T) o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. p5 ~- I8 E# ~+ U; ]6 Z+ }/*
$ ?% L+ W1 @) q& W* Check memory range for valid RAM. A simple memory test determines
& ?* B' X( ]* l) A- I1 p* the actually available RAM size between addresses `base' and
, I* t2 j$ `& X0 k( J) D. G( q* `base + maxsize'." a$ _! z& [. m. Q! S# J% }6 u
*/
. l8 ]7 N' `& v, Ilong get_ram_size(long *base, long maxsize)
8 w1 \/ O2 k$ P: M8 O{
$ P" B, x" _8 E: J- G2 v% s$ k        volatile long *addr;+ U5 q! n  U" @( u% f, s
        long           save[32];$ A' N9 ^* G1 ?. {& U& _
        long           cnt;
9 y5 m' O& B0 p; \' D" y8 d0 f) r        long           val;
+ i) }/ O% P5 p2 ^) t) g1 p' s        long           size;
4 m7 A- s% |6 ~0 d* X        int            i = 0;1 [* W! t: Q7 B, Q( l; E' f- I, F
! o& c& s, [7 N+ Y1 B
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& }1 W7 G: F; n! B                addr = base + cnt;        /* pointer arith! */
. U; Y8 @, d; M" d0 r% n                sync ();
' T& z  t& `( ?6 B+ k; U                save[i++] = *addr;
1 K. @0 |9 g. ~& s5 a                sync ();
; X% k' o) q2 o( K0 N                *addr = ~cnt;
" U% U- V/ l& K% l$ c) d3 F2 v) b( v        }
6 T& g% l  h  o6 G" o4 u5 X, B2 M$ R2 z* f* o( i
        addr = base;% x. D, ^1 Y5 W4 Y4 a) d5 [3 i' m/ G
        sync ();; z4 k! v, _4 S1 Q! |# T( [  ~
        save = *addr;0 {6 o8 y# M( l; n5 Q- o
        sync ();
+ J2 W9 W+ ^% Y2 u2 c9 z+ u9 R        *addr = 0;/ o1 Z& Y+ _/ E) Y; t7 h

5 {; Z: {/ s7 u% T/ q# @& O        sync ();
" |$ y# o+ u3 r* \: T0 j9 v# k        if ((val = *addr) != 0) {: X% W) G0 n8 D4 i8 K
                /* Restore the original data before leaving the function.& t) d4 F, K* y2 K/ @/ n
                 */) J$ X$ S9 P6 l- S5 v) T
                sync ();* k- q, n) A8 o  t! H% e9 f
                *addr = save;0 O) K+ V2 N0 c" I( C, E5 C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& _9 G& `: G! Y/ X                        addr  = base + cnt;
$ f+ B2 e, k/ S) z6 |, e1 b' q/ {# S  l                        sync ();; T. k/ A1 R9 s+ k- q. X
                        *addr = save[--i];
0 j1 W4 ^. l0 T                }
! h/ v2 x& X  Y% d                return (0);
# i  f& P8 B- @2 e0 X- w- L, u' z        }! G( f' G" S: S6 k
$ `; s( t4 V9 S% Y; x9 u3 |
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( `& P2 R5 Q8 |( I3 V                addr = base + cnt;        /* pointer arith! */
# B3 L: J' Z8 H1 @; D                val = *addr;
! _, z/ ]( k% T2 E/ C* W  o8 @                *addr = save[--i];/ k+ i1 Q1 E, o/ h6 H
                if (val != ~cnt) {- s  `& v. _( K5 D
                        size = cnt * sizeof (long);
4 e2 [* H5 ^2 `* i3 p/ y/ N5 r' x                        /* Restore the original data before leaving the function., a) {; o% R# n% [6 L  n  y
                         */. _, H. @& g* E  d8 X; y# ]
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, `& j( L3 y# e; M1 f
                                addr  = base + cnt;- B/ y) |9 Z  _( z. \( h, g+ g
                                *addr = save[--i];
+ D0 }" l3 s' _% E1 c                        }1 {# k8 h$ h: ~1 d& B) K# Q" I! U4 D
                        return (size);% i7 ~$ N; v+ J2 v
                }
1 ~7 R3 E8 k) d, K( P: j# Q        }/ ^  K( L+ h1 T6 ]8 V( N; h) _( z

: d, O: m7 `, L        return (maxsize);
6 E/ {( M" s; A3 c% d9 ~( n  j}& q2 }2 p4 b& G  ?  N' `" y
int dram_init(void)' ~% g: V) f1 V
{
8 N- ]7 v. ^3 ~, e% l, ?/ t        /* dram_init must store complete ramsize in gd->ram_size */
7 S6 x6 o& a2 w$ u1 U; ~+ V        gd->ram_size = get_ram_size(
5 Z# j" n, _1 p0 H) I! @. X                        (void *)CONFIG_SYS_SDRAM_BASE,
$ V+ q0 u. U4 _5 x. m3 A. {6 }  B                        CONFIG_MAX_RAM_BANK_SIZE);5 N, H: O' A! P( a
        return 0;
$ l0 ]& Z. \; k8 s2 I  F}! z/ Z4 z" O& c+ {' f' i
, a- Z, v- j& z+ a
! ?: v3 Z5 s* b7 r2 v- O& J4 q
& u  O& N! F7 `2 c& G& _3 E$ o5 N

7 l: q/ Q. C$ o# \3 J# x1 NFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. Q% f% E6 Y% D5 D$ y2 m" c* g
* f. p! {. b( l( t  l& j7 ?! O3 X. \6 S
3 k6 I. g7 A' y- ?7 O
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-9 16:49 , Processed in 0.041778 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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