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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' b7 n9 h- o( O, T8 \) R, [核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 D$ V, g3 P. |" O* f3 R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' N- M4 \8 @3 S9 C+ b

/ f$ d. o- {% K/ E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! f* a- C# u) u7 }9 I* L( o: m& A1 H- `5 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 @& O# Z( Q9 Q. s/*/ G! u( s  U3 a& s% l
* Check memory range for valid RAM. A simple memory test determines: ?0 L- Y! r7 Q) g7 h
* the actually available RAM size between addresses `base' and7 V( C- \2 ^6 Y$ u0 ^3 n
* `base + maxsize'.
4 z9 v, w6 @% ?6 y, h*/! t( @4 d$ h7 K* G
long get_ram_size(long *base, long maxsize)
: t9 l+ q- k8 ~  K{
5 T# V+ g9 d) f' O  |3 V3 W        volatile long *addr;0 \; R/ f+ B9 t9 n" H
        long           save[32];( @6 J4 B2 p  j# T
        long           cnt;! j7 a/ }8 h" J+ h8 ~6 L( B; d0 o
        long           val;; P) S1 A, |5 {2 ~
        long           size;0 z: T6 C$ a( Q
        int            i = 0;( N) k5 l$ [1 `

# @5 U' r6 u, I5 q! s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 }/ S& m6 L) B                addr = base + cnt;        /* pointer arith! */3 {/ F* Y1 X# u2 Z6 t2 m2 s3 U
                sync ();0 X: G/ I0 Z6 P  T! C" Q
                save[i++] = *addr;; P' k% R( a9 X* a/ `
                sync ();
0 T5 x7 Y; M' @$ d) Y5 S                *addr = ~cnt;
) h1 N# n+ c/ ]6 g5 C- @/ I. c7 A        }7 O4 e7 n% @: p  J5 ~3 c! F
3 Q# ~7 ]- u* _2 `7 j! c
        addr = base;
' R4 Y, m) q% d; u& S2 ?8 E5 K* Z        sync ();' T& O9 b- \! b
        save = *addr;
  F4 e( x: l$ r5 i3 x- t! Q$ W        sync ();4 V( C, n5 ?- }9 _7 E; p9 N9 a
        *addr = 0;
; X5 p7 @; |: Y0 q. p6 J
+ p7 k) q/ Q7 G. ^0 d' j$ u) {$ r        sync ();8 I1 m  s6 ?8 ^1 K( D& F; @
        if ((val = *addr) != 0) {
( M9 }8 i) `  G6 U- v) {                /* Restore the original data before leaving the function.
+ U" |$ T" ^: _  B- J                 */# r9 j6 L% h: K' q9 J7 ?% q% W
                sync ();
" f; z0 X5 `1 D+ f3 q' f2 i% s                *addr = save;% _3 t& I# l6 R* s" N7 o$ Q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ x  k2 c! R, d! M/ D- E: @3 ^: U
                        addr  = base + cnt;
  H2 ?# ~7 g3 C2 c; k0 \                        sync ();8 U2 P+ v% w8 m- I% x7 u9 i
                        *addr = save[--i];
/ r- A8 p" o1 v8 Z+ z                }  t  j5 L! V4 j9 ^1 x: y: \4 ^  Y' G
                return (0);1 ^% [$ U" u$ T
        }5 t  S: j+ J, K/ f

- M5 R) W6 @$ z8 }; \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  Z8 `. a3 K7 r% B% A* w# @9 E
                addr = base + cnt;        /* pointer arith! */
( B7 K  `% f8 ~/ R( ]1 @4 p) u( c# A                val = *addr;
! @& o( E* j5 T2 D; `                *addr = save[--i];
  V+ \1 l1 W+ `4 n# Q2 Q4 G                if (val != ~cnt) {% Y; d; e- L( j* ~) |! q* }
                        size = cnt * sizeof (long);
6 A3 n" E5 T  w" S/ T                        /* Restore the original data before leaving the function.  A2 l% G" a# O+ E9 F
                         */
: @9 L# A- q0 T! |" y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* ?+ X) q0 L% k5 q                                addr  = base + cnt;
) X: U9 n9 K8 L/ A* B$ ]. t8 X" ~                                *addr = save[--i];
' P+ |: `5 P! ^: P1 Z3 k4 V                        }7 ?2 v, Z/ r: a
                        return (size);
2 b0 p9 _, J6 ^1 D# S                }+ k) Z8 J- O& f9 X7 o4 k; S# A
        }
! F! u1 I" O* j+ Z$ s' N: L" ~7 _
" {2 R8 h, b8 `* m$ h        return (maxsize);
, t# q. D! j# w) S}1 L+ h0 B& \' h2 [' f1 |8 C
int dram_init(void)
: O  z3 M1 R7 \6 X{+ D6 u, _- d( c; {% Q
        /* dram_init must store complete ramsize in gd->ram_size */
/ }" a; {* F; S+ q9 v  p        gd->ram_size = get_ram_size(4 v. c7 x! Q% ^0 S4 i( |
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 Q3 B" R" u% @! Q8 z/ J( B! E$ J9 J                        CONFIG_MAX_RAM_BANK_SIZE);
2 ~( ]: g: m! R1 d4 @7 u' q        return 0;
2 O# P5 l% l* g" ]; }}
4 Z, _' ]) s- x
. s! S: \3 i& Q, ~5 \; {& a. O* n$ a: E$ v
) @  ]) u) `8 D. }- R+ l% e

& A. K. E. }6 ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% |8 t! ?% B% C8 ]2 h3 O# K
; x8 p0 H! q0 f7 T# c
5 U5 {6 P6 d+ s( o/ S' f& T

) k' k5 p0 e0 P8 v# S
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 09:47 , Processed in 0.040082 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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