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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" I, g- u5 o% x( ]核心板2:DDR2 256M Byte   NAND FLASH 8G bit. N' C0 a4 z* I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 j" N8 ~  G6 N
6 }! G6 O3 i8 v; B" [是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 N7 q2 ]7 r  _6 A1 o: J  ]" i  E9 w/ `7 G( Q# \8 @* |% f! J. Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 D- {2 v& M: ^; H3 K9 o- N7 z
/*
4 [. o6 T' c# t9 m* Check memory range for valid RAM. A simple memory test determines" D* d. y' ]1 y# v# @. ?) e+ ^
* the actually available RAM size between addresses `base' and
$ h2 Y  c: b2 N0 u5 A& b* `base + maxsize'.
* C. a% n2 `7 R  N/ e, U/ @" ?*/
- }: t* }6 W: F% V. Hlong get_ram_size(long *base, long maxsize)
$ K' i( f* H: |  A5 ~3 A{
3 {. c; M+ ]) h' M# w* j* Q) R5 |        volatile long *addr;# R$ P' @8 q5 Q' G% A. Q; C( k5 I6 V
        long           save[32];
" N+ Y6 V) [$ k        long           cnt;( t. ~, [, V/ j# f9 {% a4 `; h
        long           val;& t3 V8 A$ j' u- [; g9 n
        long           size;
; j0 b9 T6 O6 X        int            i = 0;) b6 i2 f  j2 y$ f8 {! s2 J1 J* f
* z* S- h3 r/ l3 J
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' f% m% R; y" G1 [7 x1 ^; z( g$ N3 y                addr = base + cnt;        /* pointer arith! */
; F7 k% r3 x' o# O' k                sync ();
4 X/ b1 X3 H' W, L! o& k                save[i++] = *addr;
6 T. Y/ S+ w5 r* t$ E' a, B                sync ();( E) b2 O" r, Y! {1 u: R- y
                *addr = ~cnt;
  ?+ C3 B- W' c" b; ~) [$ r        }
" j- e5 Y' Q8 B5 l
9 `% Z: K: h! r% [+ ~" m. U        addr = base;0 |9 H) e/ v+ F6 M  U
        sync ();, I/ m% c, d+ Y5 y" O* Y- j8 V
        save = *addr;
5 K5 ~  W% L3 a) K. {        sync ();+ r- k# R* T. Q+ s
        *addr = 0;
$ [) d. u( y4 g3 b& \! m
: }% Z# {# X3 u        sync ();
9 `' N4 Y/ A( J# J; W% {- u6 T$ t        if ((val = *addr) != 0) {
8 g' ~2 X$ N/ ~' E; I! S$ g                /* Restore the original data before leaving the function.. x: {, x# g, M1 y2 D
                 */
1 q& b( _8 a- ~6 M6 M                sync ();4 ~! j# F$ v. f% \8 C
                *addr = save;
- a$ z  V$ Y  c( t* K4 n7 \( @0 h, X8 ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 O4 B* ?1 ^) p2 ]
                        addr  = base + cnt;
# t4 P) I! `4 d8 S                        sync ();! @* v$ [6 f: T1 z! D
                        *addr = save[--i];
. d% \9 Y7 J+ ~% l* a                }
% X. I2 h! _/ Q* P. N0 P* Q                return (0);
$ c% A! D* N: d1 H4 |/ y: O& `        }9 _+ c) W- I4 w3 j7 h( x* b

6 k4 m  V: u# p' c. B        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ Z9 S' L! y" s$ p3 x                addr = base + cnt;        /* pointer arith! */
% G' j* i8 g" S1 J- p                val = *addr;
8 G/ V- C9 }/ D6 r                *addr = save[--i];. e7 o) t: K: \0 H0 N, |/ K7 W( b, P
                if (val != ~cnt) {
( _7 G- Y+ V' u- v  q; C1 g                        size = cnt * sizeof (long);8 g% n0 L" f# y
                        /* Restore the original data before leaving the function.
8 m! g3 [$ f- m6 P! }' d1 f                         */) y7 z$ O, ^. d8 R1 }* R' D. x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' |0 p8 z& i6 H" Z! o' C1 J* w
                                addr  = base + cnt;
7 w' R- K' Z' R1 d; p                                *addr = save[--i];
7 W2 n: h* ]1 \& m+ \                        }/ O$ ^* k, t3 s; t/ t# S
                        return (size);
, m7 a- J: j1 ?2 D1 {) q                }; E" Y, s. g' }& J: H
        }
+ t3 q+ w7 ]* u! ]* c4 X! n8 }( D2 g
( S# X8 C5 }9 X5 ^8 H5 T7 ]        return (maxsize);4 G/ M7 ]  p4 G
}- x4 b0 T, w; B; E
int dram_init(void)- p' B% z! M$ |
{
: X+ p! Z' \# V3 y8 N        /* dram_init must store complete ramsize in gd->ram_size */
0 h& ~7 r( l3 A( y0 m' A' g        gd->ram_size = get_ram_size(
- y% k; @" N( P/ U                        (void *)CONFIG_SYS_SDRAM_BASE,
/ Y9 ]( L% W7 Q, e                        CONFIG_MAX_RAM_BANK_SIZE);
' h. p( O9 |( E2 ^, q        return 0;
6 H1 M- F! N8 W0 v0 N. D9 Z; B}+ K2 B6 B& k# d. k

0 k3 b% B+ M+ T3 K8 D8 A
% J7 t! |3 L+ N9 s( d' A+ |- S9 }1 A; c
/ \& d/ y  W# K0 _$ s3 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. _, o1 y4 V$ ]0 t+ c2 W! p! X; {7 e9 t* ^9 X* Q* Z/ k' p
1 p) _! @. q* i3 a

& O; P2 x0 f9 a6 }" _0 ]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 18:03 , Processed in 0.038121 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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