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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* E' Q4 d$ P7 ]- {
核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 k/ ^) p( f+ T: I% A- e/ R, c  h; h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 Z/ B) Y- Y. t$ O
9 m2 G% J; f5 b9 H% G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* A( g8 r! I+ P" \# F; m: G# D
/ T( \/ t7 n# g# N$ A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 |/ Q1 p0 J  M- T/*9 y0 ?6 `* U0 r/ p+ m; o
* Check memory range for valid RAM. A simple memory test determines$ t) e& r4 p2 f, v8 {
* the actually available RAM size between addresses `base' and; T; \7 p4 y7 O/ u  d1 M- n
* `base + maxsize'.: G; I. }' D+ y+ u6 q7 t. i/ [3 }
*/
. |. i# t3 A% A9 C: J9 b- h$ b, @long get_ram_size(long *base, long maxsize)- m8 {4 S; {5 X- @& X! g( t
{0 x. g: z. I- p- `4 m; A1 W
        volatile long *addr;5 a( k+ \, H, I
        long           save[32];
  o- W: [! M1 C6 a) `3 j, }        long           cnt;, r0 {  n8 \5 D1 S$ Q+ P' N
        long           val;! m# A, O, h: T& d% N: S
        long           size;
/ l% y, t9 c) n- T3 d        int            i = 0;
6 ^$ c5 R& F' c' T9 P& j9 B- k& C" V
' X1 B' @, E: R  I        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; v1 _/ Q* y4 V" L
                addr = base + cnt;        /* pointer arith! */0 n* S4 d/ P6 m2 K/ t
                sync ();
! t$ F9 B8 f' j                save[i++] = *addr;6 F3 S. r+ f6 D5 |" i& ]
                sync ();
, I2 f% h' l% b/ u1 p9 y                *addr = ~cnt;
/ V4 e) y- h9 E; c( W: Y7 C. L        }
2 f5 \0 K/ ]  y6 g- t% F* k) J3 C0 }1 ?
1 Y( `$ T+ E* T3 O* @, M        addr = base;7 o: o0 Z6 ?# w) y  Z6 z
        sync ();
0 K8 z3 g8 U$ z+ T, i! A  D: W1 J        save = *addr;/ [. g+ E9 o' L# M* j
        sync ();
+ ~0 |' @# w  h7 f7 l% k8 l. G        *addr = 0;
# p6 y' h0 s9 \* N2 Z; m3 f) O0 J& g, E+ {0 m5 W3 Z1 L
        sync ();
# l7 |6 l" m$ i- S        if ((val = *addr) != 0) {( M. R; G/ r) y
                /* Restore the original data before leaving the function.( @  x3 p* `. Q$ O
                 */% o* Y/ h& s2 i; ^: N: e( J0 m
                sync ();( O! x+ s8 x2 S9 K. u
                *addr = save;% E0 e* D' I2 z, [4 x: W
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. h8 l6 t  J- [) H4 I                        addr  = base + cnt;
/ x$ H1 Q" e9 w                        sync ();
, l5 N/ w7 w5 r  L4 D, T                        *addr = save[--i];
0 v8 u- c8 u9 _& g6 _9 L& k                }: U  |, _6 O3 k/ D9 _% S, r" L
                return (0);' p, S: W/ s) {# c
        }9 k( ], ^+ u. V( ~6 `

" T! U* T1 ?& x0 K        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% Q' c& w" R  f4 R' E6 |! ]7 T' q
                addr = base + cnt;        /* pointer arith! */
: V8 K4 C2 I! D* H8 E! v                val = *addr;
! p$ K+ @( I0 X                *addr = save[--i];
" z0 F# e8 T* f% n8 I6 ^; V                if (val != ~cnt) {2 T1 N8 s2 F5 c1 W/ `+ g4 @
                        size = cnt * sizeof (long);
6 B; L% ]* l+ B; m: `9 T( Z                        /* Restore the original data before leaving the function.* h( E1 D' c# x( Q6 P+ N$ P
                         */! _4 T$ K) h4 R3 `2 g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 ?: b) t0 |5 N' U5 Y
                                addr  = base + cnt;
9 h* a( i% A7 C+ R2 p, h; w% z+ i                                *addr = save[--i];
/ \3 ~. N9 p4 x# Y! {) O2 M/ }( \                        }
9 y; }/ ~( H% N+ O& c9 h& ~                        return (size);
  S! O. ^* K5 C1 H                }- ]- {" x( E  m+ P4 Q
        }1 p% ^1 s1 q8 K

5 V* Q: n" D6 V" p' d        return (maxsize);4 M* j4 e* y. x$ e( N" A
}0 N7 s  Y' G- l1 V7 D# A3 C0 x8 q* b
int dram_init(void)/ V' M2 ]4 W) e$ Q
{
3 k& X. o0 q. t% q8 E" X        /* dram_init must store complete ramsize in gd->ram_size */5 t' r2 S, f/ ^; [
        gd->ram_size = get_ram_size(
/ z+ Y5 M; c# q9 `( N                        (void *)CONFIG_SYS_SDRAM_BASE,
# H2 U! ?5 j' d6 g9 i+ R                        CONFIG_MAX_RAM_BANK_SIZE);1 {( z, C5 A  _7 m
        return 0;. m, w: |+ q: P) b& r. u5 b+ _
}
/ q, z9 \0 Y# {7 s
6 w" ~/ e3 ], n/ N8 [+ p
7 a  `6 ?* I8 ]; ^% j0 |- ^  ]
+ a% n5 Y; n+ H* C3 t; K2 v0 x, z0 q' d8 ^; V$ t7 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 I+ O. Z! k% _2 `) E4 V+ q% d6 i8 f" f: C2 B
4 a9 n& x2 C: l) r4 T
7 l' E2 A7 F& \& J6 Y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-19 18:47 , Processed in 0.041708 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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