TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 Y4 h* b7 G% A% a3 f% b  s核心板2:DDR2 256M Byte   NAND FLASH 8G bit- P$ S1 c( U* x& z5 r8 A+ z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, H& m8 P7 m0 p$ T
) F! g- s7 O; H0 J; R& R6 T是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) k3 c6 Z* {( K7 R. c3 K
0 j% _" M7 j: }4 i0 H0 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 D9 s( C* g7 u2 a( E1 n% G/*
4 n+ E$ B) s# s* Check memory range for valid RAM. A simple memory test determines; g2 U0 A! ]' T7 f
* the actually available RAM size between addresses `base' and6 i% g; X7 g/ W8 U
* `base + maxsize'.8 j" `$ d2 w" f9 \) O8 t8 g
*/
0 L1 @" ^- K% Jlong get_ram_size(long *base, long maxsize)' S' Y3 n9 R$ l; ?1 K% S8 A
{- x+ c. k0 k& H
        volatile long *addr;
. M" ?- H% J8 f2 {- }        long           save[32];; a$ i9 x! G# I
        long           cnt;$ `" x& [9 e2 Z4 Q' G5 J7 J  s) q
        long           val;
; q" R1 i' C2 v3 J2 e$ P  x  q        long           size;1 a+ x! K$ a$ l4 t* X
        int            i = 0;
3 o7 J& n- i% ^2 |. [; I# M
% |( l! D" l4 s) w8 D/ @% `$ s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: Y8 I0 W- k; M: E5 x/ z& m. @( E
                addr = base + cnt;        /* pointer arith! */, b# b' j- A% ^4 o- j2 d3 Z
                sync ();
" r% h! @* {/ F; [. l% e                save[i++] = *addr;
* S. O' n. X! H/ r' k7 e                sync ();
  _6 m! e. V8 J9 _1 y                *addr = ~cnt;
& i" N8 N# u: g( q        }
9 ~9 ]" ]" E/ o) p4 h
+ }" ?# G4 c2 K$ r; g        addr = base;
1 U* z. j/ [$ K; g7 T2 f  n* v        sync ();
0 Y! S8 k! E  j8 E        save = *addr;) w1 Y) C* k" f# C9 g& o
        sync ();7 M) E) Y, v5 w8 J& R8 ~
        *addr = 0;
. B% M* R" k# ~" k
# y. A: K; H4 F        sync ();
5 }  f* l& K$ q- ?, }        if ((val = *addr) != 0) {+ t* a9 p* F; v$ D# t* G
                /* Restore the original data before leaving the function.
& `% [( H& m" f2 {) r                 */3 o! _' A# D2 m7 n: G% C4 }) K
                sync ();
* b5 M4 d1 a$ b' y$ G" X                *addr = save;( r( b& T6 Z. o- M, T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: s5 j8 Y/ _) t( K                        addr  = base + cnt;5 m: X0 p3 i  L2 {' O* i
                        sync ();
; o+ P* g, Q9 |2 m& `                        *addr = save[--i];7 M' E& P" e) L$ S
                }
0 H( l! @( \; d& S" ]' y. ^                return (0);8 e) {4 m6 H* x4 Z" d5 C
        }
$ B- T! D: A3 V1 {$ s( H
1 }( t- [  w% j( o+ S        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, c$ H) @* z, a
                addr = base + cnt;        /* pointer arith! *// z6 X* O! {' n
                val = *addr;
$ ^$ K6 D5 b4 }, a8 p                *addr = save[--i];
, {" o$ L3 R6 c! V8 ^3 i                if (val != ~cnt) {9 \4 v9 [9 j7 O; a* L+ l, Y# F
                        size = cnt * sizeof (long);
# Y2 X) M4 h( V7 q                        /* Restore the original data before leaving the function.- {! i. s' |5 A" P- s1 u/ H- `
                         */$ T  s% P: z5 T$ q  _. f; t( f
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" t% T1 v/ z3 K$ S* G, K                                addr  = base + cnt;- i" v8 V) I3 A4 ^6 {# X
                                *addr = save[--i];
% z/ ]% J2 A+ N/ ?3 l/ T! t                        }6 S% h' z( ^5 A$ u# c" d8 V: J
                        return (size);  T: u6 Q  |1 b
                }5 ^. q4 N" s* P/ Z  @. A! J8 P5 R. \# }
        }
" G1 u4 |/ |8 S6 X& r
# a+ u; a' \2 c/ f9 Z& K        return (maxsize);9 F" u4 ]* k2 j% [, h
}
( G( ~1 H8 x2 E9 s: i0 v3 ~int dram_init(void)
7 }) w, B8 I1 t  c0 |{! ~* ^% N1 \6 ?6 Q; P0 v
        /* dram_init must store complete ramsize in gd->ram_size */
( q6 x9 t+ R& w) b" c, b' ~2 S        gd->ram_size = get_ram_size(
! z) r' Z- Z  W/ R3 B* a! t, A5 R2 Y                        (void *)CONFIG_SYS_SDRAM_BASE,% W6 |* O5 L1 T& l" v/ ?$ w( ?
                        CONFIG_MAX_RAM_BANK_SIZE);
9 o2 I/ ]3 ?& S: x7 m) [        return 0;
1 r6 i' [3 W1 h* y$ j}5 G9 R# N# k1 w7 @# [
) t& r) ~2 N+ g& W4 i' M
9 a2 ?; I- c. r8 I" ^- L% j: [% O
/ E4 @2 S5 M* v0 j# \; \( q; p
3 k1 l" R% r% R  N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ }( g3 S4 _  y

; \  I! O4 c! a3 R) k9 y' `9 \4 b, J& R3 x8 e

+ M: \8 k+ i0 k7 |0 y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 23:10 , Processed in 0.037591 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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