嵌入式开发者社区

标题: Omapl138 emif cs5 挂接16c554总线没有动作问题 [打印本页]

作者: custar    时间: 2014-11-26 11:32
标题: Omapl138 emif cs5 挂接16c554总线没有动作问题
您好! 我们使用 创龙omapl138核心板 + 自制底板的方案通过emif cs5 扩展 16c554,使用最新的u-boot和内核,通过sd卡启动,内核和文件系统全部在SD卡上,在这种情况下在Board_da850_evm.c中的da850_set_emif_clk_rate里修改设置CE5CFG寄存器值为0x8005,用来设置EMIF总线频率为456M/6=76M,但是发现操作CS5对应的ioremap后的地址,总线地址线并没有动作。我想请教一下:( ]$ O( _% i4 F( O

/ G6 m5 j$ D$ n6 D1.最新的u-boot里的emif总线频率设置是多少?在u-boot中从SD卡启动内核和运行文件系统,emif总线是否使能了?9 M/ @5 K/ |. {( Y+ q, c+ A1 _$ F
2.在board_da850_evm.c中的da850_set_emif_clk_rate里修改设置CE5CFG寄存器值为0x8005, 这样设置是否能起作用?( C* V" _: d# y7 i  s; A' a
3.要让cs5正常工作需要注意哪些寄存器的设置,目前只设置了CE5CFG寄存器。& O* M: L# \4 P, Y3 |  _0 u
- j. y; v2 [! ^9 F% D! O9 m4 b2 g9 I: z
搞了好久CS5都不能正常工作,还请帮忙解答一下疑问,多谢!
7 `% w/ B2 t% }6 s1 a1 U* B, \5 j! C3 q

作者: custar    时间: 2014-11-26 22:20
纠正一下问题 OMAPL138的U-BOOT和内核设置PLLM和POSTDIV之后到SYS0_CLK3的频率是多少,内核默认配置sys0_clk3的分频系数是2 也就是div3% p7 O) Q8 Z- s' l" E) n3 _

作者: teddy    时间: 2014-11-27 10:03
1.最新的u-boot里的emif总线频率设置是多少?在u-boot中从SD卡启动内核和运行文件系统,emif总线是否使能了?
/ R0 q2 Z4 Q- z, I现在emifa在u-boot里面配置的频率是114M;无论从那个地方启动,emifa总线模块是使能的。
2 W* q; c6 P/ u0 a/ L5 [8 G2.在board_da850_evm.c中的da850_set_emif_clk_rate里修改设置CE5CFG寄存器值为0x8005, 这样设置是否能起作用?
- J0 v% x7 s- f可以起作用的,不过需要使用ioremap对物理地址做映射,内核才能访问。
& \  N2 J) P3 N3.要让cs5正常工作需要注意哪些寄存器的设置,目前只设置了CE5CFG寄存器。% M8 Q2 A/ ?# m' g
下面我给的是CS2的一个配置例子,您可以参考下:
( I4 G- K. J; N' {#define DA8XX_AEMIF_CE2CFG_OFFSET        0x108 l( O; {3 R2 J
#define DA8XX_AEMIF_CE4CFG_OFFSET        0x18
+ M, W) M$ u' ?0 g4 A6 ?( G! w#define DA8XX_AEMIF_CE5CFG_OFFSET        0x1c. {6 C8 \% T* K' W
#define DA8XX_AEMIF_ASIZE_MASK                0x3$ S+ g% X. ?' ]
#define DA8XX_AEMIF_ASIZE_16BIT                0x11 v5 Q! j/ F3 F* B( U4 ]
#define DA8XX_AEMIF_ASIZE_8BIT                0x0/ G# G; h: R3 q

8 n" }( m5 s1 {& F#if defined(CONFIG_MACH_DAVINCI_DA850_PHYSMAP_FLASH)+ c/ K4 Q1 U; z- ~! A8 I
static void __init da850_evm_init_nor(void)
: i* l  l9 S0 z5 H  T{
4 \* g- i. ?' |& k$ V& T) B6 d! P        void __iomem *aemif_addr;
0 D% x: h, j; d3 L. @' _4 u  Z. L% u% U# d' _2 V: Z0 @' d! ~
        aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
3 e6 ]9 _+ q/ f( ]; s' J1 e/ ?8 H3 ]/ k4 K/ @2 f9 R8 g
        /* Configure data bus width of CS2 to 16 bit */
! P* K" c2 G1 n. ?( ]: D* E        writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |4 f5 r! s/ L% Y+ F0 m
                DA8XX_AEMIF_ASIZE_16BIT,
8 Y( o4 I" u, A2 A- o4 s                aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);! D/ z# @3 @, q% a9 A

0 \2 z1 B; H1 t* Z( K        iounmap(aemif_addr);! v* r" b9 O7 O; i
}- q8 h4 t! q0 h
#endif4 {4 a" Q$ ?; }  z  z( }

作者: custar    时间: 2014-11-27 14:10
teddy 发表于 2014-11-27 10:03$ N" B& h: L: R
1.最新的u-boot里的emif总线频率设置是多少?在u-boot中从SD卡启动内核和运行文件系统,emif总线是否使能了 ...

6 n4 D) q4 W7 y) X' B' P多谢您的解答,还有些问题没搞明白
4 B7 N6 ^, D1 c- y1.目前我在board_da850_evm.c中的da850_set_emif_clk_rate里打印出来sys0_clk3的寄存器为0x8002 也就是div3 = 76M, 可是在davinci_nand.c中的davinci_aemif_setup_timing初始化nand时序时设置时使用的时钟频率为aemif,而aemif在clk初始化的时候添加打印打印出来的时钟是114000000,这样的话EMIF是哪一个频率?" r" ~3 i8 O- f' i. `8 k; P- q% [
        aemif_clk = clk_get(NULL, "aemif");
+ Q* l& F6 U$ t, G& ~        if (IS_ERR(aemif_clk))4 @' ]  l- O) K
                return PTR_ERR(aemif_clk);' I. x" p5 k8 q9 i0 p* j# y6 D- S

1 N3 E. Q: e& j1 U  W+ f3 {. }& C        clkrate = clk_get_rate(aemif_clk);
, F" \( T, r9 X% w4 e" T; T6 q9 _2 b- m- l; s) W) C; ]
        clkrate /= 1000;        /* turn clock into kHz for ease of use */
' z6 X0 q8 P" B; j! K) [4 W$ N7 q5 w/ a1 r; Z7 k" _8 h
        ta        = aemif_calc_rate(t->ta, clkrate, TA_MAX);
( X4 K8 {4 n- [& U7 r        rhold        = aemif_calc_rate(t->rhold, clkrate, RHOLD_MAX);9 O* d: f7 v3 D! J
        rstrobe        = aemif_calc_rate(t->rstrobe, clkrate, RSTROBE_MAX);
- {  V5 ~' X6 h5 |+ r4 z* \        rsetup        = aemif_calc_rate(t->rsetup, clkrate, RSETUP_MAX);
* d" _- g% }9 u! U, v6 K5 Y, L        whold        = aemif_calc_rate(t->whold, clkrate, WHOLD_MAX);, L, ?4 U( K; `, c( G  q* `% N
        wstrobe        = aemif_calc_rate(t->wstrobe, clkrate, WSTROBE_MAX);7 A  j) Q+ B" x0 b" }: ^* J+ g% G! I
        wsetup        = aemif_calc_rate(t->wsetup, clkrate, WSETUP_MAX);
* n% ~3 P7 h- K) ?  ]" O, i4 y7 h2.我的板子上接的16c554只连接了8根数据线,所以设置成8bit数据位宽,地址线接了A15---A10结合片选CS5做译码,A4---A2接到16C554的A2--A0, 在这种情况下不停的用内核定时器访问0x6600E000物理地址进行 io_remap后的虚拟地址,板子上cs5没有动作,地址线上只有A2-A0有动作,我们这样的硬件设计和软件配置有没有问题,是不是应该配置成16位数据位宽,计算CS5的物理地址是不是应该做一下地址移位和映射?
0 i$ x+ [6 h. S! R. x! s
$ \' d8 u8 B% u0 C4 {期待您的解答。( Y- O8 f) L! E( Y; O# K. i

作者: teddy    时间: 2014-11-30 16:48
你好,456/4=114M。请注意emifa 8bit 数据的连接方式(如附件)。
1 |( `; R+ \* f  d2 P
/ p* _4 |- j; j! Z
作者: custar    时间: 2014-12-1 14:19
teddy 发表于 2014-11-30 16:484 e7 {, i+ [/ U+ }' I
你好,456/4=114M。请注意emifa 8bit 数据的连接方式(如附件)。

! G. h8 r8 d! Y. g  ?, x好的! teddy, EMIF时钟频率还是没搞清楚,在开发板系统起来之后,通过仿真器去查看寄存器 prediv、pllm和postdiv以及pll0_sysclk3寄存器, prediv 的ratio = 0,pllm的值为18, postdiv的ratio = 0, pll0_sysclk3的ratio = 00010,
  f8 E' n; }, g; R如果核心板用的是24M晶振,那么24x1= 24, 24 x 19 = 456, 456/1 = 456, 456/3 = 152, 那么EMIF应该是152M, 可是davinci_nand.c中按照aemif的114M频率来配置时序,能否帮忙详细解释一下开发板的时钟频率的设置。! {2 L+ l5 I' P5 P1 E

作者: teddy    时间: 2014-12-1 22:39
您好!请确认你的pll0_sysclk3的ratio = 00010是否正确,这里的值应该是0x8003。0 n: X9 C8 Y/ }+ |7 [6 ^

作者: custar    时间: 2014-12-2 08:32
teddy 发表于 2014-12-1 22:39
7 `( D( z5 @/ ~您好!请确认你的pll0_sysclk3的ratio = 00010是否正确,这里的值应该是0x8003。
+ s+ }# I4 c  c$ \# Q! G  E  u
teddy,  pll0_sysclk3的值是0x8002,内核是百度网盘上2014.11.06最新版本
( R5 z, a* c4 E7 H# C/ {, [/ @4 }
作者: custar    时间: 2014-12-2 08:37
在11.06号的内核代码里board-da850-evm.c的da850_evm_init中会调用da850_set_emif_clk_rate函数去设置pll0_sysclk3寄存器为0x8002,通过仿真器,从dsp端读出的寄存器值也是0x8002
% p, N1 w4 A! d" |$ k- _. C, I1 m" D




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4