138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 + v2 A. r8 k, D

' F/ |/ g. |( u6 j# Z1 J问题描述:
! O8 b: M1 X& o% B2 k  y5 z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 `- k4 G" ?/ o8 n) J8 q( g- Q
- d% v: X3 M$ r2 |( g
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% b" p8 }) N$ L+ M
4 k% c7 `& @0 S1 F测试结果如下:
6 w0 p" C/ x8 D/ B) u8 i7 Q$ r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' `1 t( U6 z7 k. a* d  i
% B- q& p" U& A5 V; b$ `& f
; F, m) v" Q" `( V0 c/ R
备注:
& l  I$ I& i- u, i# }, G7 p1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: w$ B' O. |% S, `4 @
2、相关代码如下:- C4 f0 j2 w8 y6 L% k
//UPP DMA缓冲大小512字节
# N6 N3 L8 T2 j* M#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 W3 y! R3 ?* h- N#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 J1 W+ C, g/ {* q1 y3 ]#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! Z8 C2 M0 F: I* f6 B
2 `: }! ~! U* T! q

: v& i: L7 W) E9 I& E) t5 Y//upp接收、发送buffer4 ]0 o: l+ v& @& s' C  R7 w( r. j
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 A9 \/ e! P2 N/ j- M8 Q#pragma DATA_ALIGN(upp_buffer_b, 8)
- F9 d; H. X5 ~* j  w
- o& ]; r4 z) V# z$ P& O! ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& z4 R! ]# n/ P& x! Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# v: P" D) \* k5 z" X  V
: f6 _  J$ W8 P9 l- Z

( C# H4 `7 X- @4 V0 zstatic bool server_upp_data_recv(Server *server) & B; |$ J9 _/ V* |& c' p  u
{
. T) Q! [) J7 V2 A    if(server->upp_channel_a_recv == false) {5 x6 K( N6 c% }) B
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 V% c0 U* s: n" m5 A$ V
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 F5 u: o2 d# h; f' A
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 W$ x+ N8 m* C( d# x: J1 P; _
9 Y, ^2 P" F& q
) j- q; x2 A- R( s            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 U; W; |8 J9 c( c' o% R  l. d7 d8 x3 h% _6 z! Y
            server->upp_channel_a_recv = true;//, e0 O7 O2 E; _! f: g6 N
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 h0 f. o/ P) n2 x+ B2 Z/ y2 j
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
- e, t" W. [& L2 P; M1 w8 k            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;! r0 H. H- R/ f* `. q; c; y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% X7 E7 W# c" l0 `

4 I( H0 t7 P$ V+ o6 H7 W/ n            upp_error_count = 0;! t: m& x% K! N7 Y+ S$ M8 _' E
            upp_dmai_int_cut = 0;
6 _, V, D" f  s1 u9 F0 U. v6 k* o& V  |( o4 A0 C/ @/ _
            // fill in data
+ f% ]9 v% z0 |$ M. n            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 e% j: W" o0 t( M- G0 I            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
' w1 A3 H: H' d; R2 _- w        }
2 h* Y$ p& F" ^9 v8 Q; y; R: a( t    }; N( y* L. I: f& ]
    else{
. S4 e6 O- Y4 u) W% P( C        if (upp_dmai_int_cut > 0){
9 }8 |* F: e0 E5 E4 s            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 \# a" N2 w% r            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 w3 ]& l( H$ `( @+ A8 `/ E, p, u) h/ ^' m4 S( L* _# m- |  l$ F
( S; D2 h% Z) @' ]
            //copy data to upp_recv_list_busy2 }6 ]8 @; |6 H" i, ^8 |, v; Y# l; r
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ W- G: P3 k4 \8 _

  P/ D' Q. S! d6 g- N7 M            //
3 C/ e" A: R- w& `, ?* }6 A5 A            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 k3 f- A* s  H

; l+ ~# I3 L( s% w            //
3 ~8 A- P' }3 J  p: {/ e/ s            server->upp_channel_a_recv = false;//; s# W8 O. G6 j; t4 z3 {
& w- ^" I7 W1 z0 f1 u3 ]6 k
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ ^# g% T# a, m0 [
        }
3 S& ~' j- N. O- M4 k1 X    }
' F/ A9 ]2 f5 u) l: B/ W  M' x
0 |/ o4 m% |7 A4 @& m% K) J! Q
4 z$ J3 F$ E6 ]4 R0 U9 |    return true;7 H& l3 ~9 E, w
}
4 f+ e; W# m2 u9 Y2 o! @! \+ Z, s: U$ S  G/ D
static bool server_upp_data_send(Server *server)
. n/ c# H  x' ?5 B{
  [, d+ r, v5 w6 j) M& R! z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 N4 O# h$ ^; O9 E+ {5 R
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. }9 g5 v3 a" B
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 ?% U" d$ s% ?% p  ]  a+ m3 F" F
        char tmp[128] ={0};9 n* P& \2 L; R! y, v
4 R! Q7 `. t4 l, i  d$ |- V
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" j; Z1 u/ ?( A/ b" \* _  i0 b        print_log(server, data, 64);
1 A9 E. X$ S( I/ J$ m' T, A2 B: M  m% N4 n1 f
        //# d$ J, V  m* r9 i( [+ _# E
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 }6 }* ]* P7 ~        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( K% E( O# n! H5 ~7 C' P# V" n
        print_log(server, upp_buffer_b, 64);
4 Y2 v" l  @# {, }2 @# F1 y( b3 `; B" @
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
6 a: d0 s' ^5 F        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 a, J" r& v' r, l        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
' B0 K. g: w6 k! }, l7 }: N        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) j- I6 y+ {* F7 d( u* J* e6 G% R/ |
* f* T% T% ?' w! e
        memset(tmp, 0, sizeof(tmp));
# l( h% t9 W* p+ t- E1 M/ t+ [        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 T, R: N! Z+ R) }$ J8 {6 a
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' p, V/ |7 H# T; ?6 X* y
        server_msg_send(server, APP_CMD_LOG, tmp);* K/ h% }  q8 R9 m9 a. _- J
3 m9 J6 D- ^8 |9 i
        upp_error_count = 0;9 Q/ w8 _* H0 ?$ N
        upp_dmaq_int_cut = 0;4 z7 l( Y. G. C1 _3 Y
        // fill in data 5 h6 h/ ]! G! }; h! a
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 j) u  o9 T  H        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; p, q" t# q+ s5 `$ W# Q
+ f4 _* ?5 S0 Y
        // wait send success
* m- n# Y$ C2 Z' V' S# K& T) o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
8 [3 d" g; r1 j8 B
' b2 w2 X, l2 L5 A8 \6 M, z3 Y        // make data node in free list
$ s# j/ _. d% N        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; B& m( z! X6 g2 w$ t+ s) i
        server_msg_send(server, APP_CMD_LOG, "upp send: success");  t1 _. q/ O7 [9 K/ p) x  }6 o8 y
    }" T+ d/ ^  E3 e' ]: K! @: O# _
    return true;
+ X# j6 n% n4 E6 I1 H0 B0 l$ i}
  j7 k4 _" g( a3 ]! k
( C: x/ c: ?" b! `0 b

8 n$ D. X( _2 `- O* [5 |- b4 t% n& s

7 A9 M5 U, G; {% Z; J1 @; p8 R4 d4 F( C9 S2 O9 D3 k8 X, I4 Y

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
! W8 X: q# M/ u/ g
0 K% l! d/ e6 r, Y& [

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-27 15:26 , Processed in 0.042043 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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