138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' A1 ]$ W" X5 F9 I; |$ I4 m2 b
3 l4 Z: j" ]$ t- T1 T% t
问题描述:
" j* N( H! T; T0 w% q) g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" q8 D7 X% N. ]
# ^: |. z  S8 q$ P4 @" l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* E+ [: V4 I5 U

4 N, \: }) ?9 w; |* l测试结果如下:
% }1 G- d6 @+ M- k+ S138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: u( D+ f; K. n& i6 w( `- y# o! w) Y) B+ B& z

" S' v( G8 [1 A! D" a备注:- X" A( N/ L. @1 A
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 O  H( t% u9 _
2、相关代码如下:0 ]# m6 f# ^8 {% y7 h) }+ b7 Q: D
//UPP DMA缓冲大小512字节1 r8 r+ I* w6 A% @- s) N8 |7 x9 ]6 _
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! e# o4 Y- `) k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! A* C* @5 H1 I5 S) g2 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
: ~9 f9 _9 {  H' Q3 c- i0 R9 q& {* `# e# [7 \1 _% @: T" u) u. x9 O5 h. r

9 j8 _  i6 |, M+ k0 @//upp接收、发送buffer! \3 _! q+ Q5 @  ~' q
#pragma DATA_ALIGN(upp_buffer_a, 8)3 K5 H, ?* j+ ~9 e% f
#pragma DATA_ALIGN(upp_buffer_b, 8)7 ~2 m1 l0 O& T' u. H

3 h% I: p& O$ u& ^5 G+ A& n6 gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 s! v& c5 _4 h& j
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) _5 ]! p" W6 ^/ T2 U1 @$ z: v
* d" W# b$ w1 `$ B4 F
8 v1 w+ ~8 g7 L1 f! j
static bool server_upp_data_recv(Server *server) # D8 w  o- s0 q' q5 z
{& S" [) M2 @. {3 A/ \- m4 v7 Z% t  @
    if(server->upp_channel_a_recv == false) {
* V# S* @5 e) ?! h7 W4 c8 p        server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 D* E% t8 `% k: w" T
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {  `7 J0 A$ j7 _$ n
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");6 o3 x% D8 l6 a# Y
- ^2 ?/ b1 L( x
' g; o; W8 a. V! x+ N: \
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ o7 |" b5 _* F  w/ @4 `3 ~) Y
; N! a! w5 @0 n% M            server->upp_channel_a_recv = true;//: w! g/ Y3 N1 n
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
  w) ~: `# [# [6 k            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 [6 L" V& U/ G0 h" j) [5 O            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
7 E# d8 `4 ]8 c            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& X( Y7 I* k' `! H. M: n1 z* Q

9 a6 C. P/ Y) @9 k6 s" x            upp_error_count = 0;& c/ ~% e# t1 m4 p; ?. d' p5 t& m
            upp_dmai_int_cut = 0;
* D, h1 b/ F, k) D$ m. i! }, n, K7 A# o# G
            // fill in data
6 y% ?; w- [( V! X' l; ^            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( r+ A; ^* l" `4 U; X/ O6 F8 u2 D
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# m- [7 q* m9 M! [        }
: o4 J* {8 R8 T& z    }2 U1 j) w4 V8 ]9 T
    else{
) s$ e8 h, Y: }0 K        if (upp_dmai_int_cut > 0){; ]+ }8 I. J% d
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) H8 h+ c# a/ H- x' z            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 {; ?3 O) s0 {4 ]
  R2 N+ r1 y! J/ ?5 D# Z3 J0 J, K7 r' I) _4 Y
            //copy data to upp_recv_list_busy
2 i5 r2 G4 c  B( ~; A; t            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 `$ U+ |) [# Q' ~; O  Z7 g( K$ a5 Y% B' e' J" g6 a
            //- R  z! H* {0 B0 Z/ ?% M
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  j# w7 y1 W+ m, v
1 m# |. n% N+ K6 `9 X2 I            //, G, n) x/ c& W8 \' M4 _
            server->upp_channel_a_recv = false;//- P1 E* I# d+ r

$ L4 T7 J- O8 N' R6 ~+ m            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) {( T) I3 s9 w        }
) c" Z0 S. M' a1 e* \3 q7 a9 g3 @    }
/ V0 M1 F# O- W0 R& C7 ]/ N( U! ?$ h$ L4 K  O, s
( l6 {$ d! I  }7 e2 T# w$ H+ P
    return true;% e  M* A6 @! k8 @$ T( f5 z
}, m/ S) f+ G; q1 ]1 O

+ q" X+ q, {7 dstatic bool server_upp_data_send(Server *server)$ `4 X9 B2 I& |" e, t
{
1 Z+ k, ~3 ^. [( W% _    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! h0 H. Z' V/ _' H9 o2 o. E
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. ]& A- M1 q1 w; n; l2 y: b% x
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
/ o& f3 k% F. J8 m        char tmp[128] ={0};: g' w) o+ J$ P+ t7 }( @4 R6 n. J, A

) P+ U7 \0 B8 g- ?        server_msg_send(server, APP_CMD_LOG, "upp send: start");
; w0 z; N+ p; g$ \0 y, C        print_log(server, data, 64);3 U2 V+ G0 Y+ A  k  E& D

6 _! q2 q" U. ~1 d        //
1 O7 b4 h# X! `+ y' N- H        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# f; w# Z& T; }& k8 S5 U
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' x% K7 [6 e+ }. M6 ^3 K3 E9 f8 n
        print_log(server, upp_buffer_b, 64);; w! y9 _. t3 _# H4 x' M/ F3 w
3 m7 L; z0 M5 o3 Q) e
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 x% O& Y( z& \; `1 c
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" S2 U; M) F2 ^# l4 U$ B9 `8 r        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- n% l2 p5 s2 E) f5 T; |0 P, L
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; M. I. Z  Z' V1 `5 g0 K
0 h% ], T) n! ?) V, H
        memset(tmp, 0, sizeof(tmp));
8 z0 K) ^' l0 S, K( k4 z        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 y* K" J) ?9 a- u2 i
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 R! a1 L6 f4 o, V
        server_msg_send(server, APP_CMD_LOG, tmp);
/ e- e1 M9 y4 N/ t3 Q. ^" x' q0 W2 j' T- b9 @$ @+ z6 m
        upp_error_count = 0;
  E$ b) a7 M! I! D        upp_dmaq_int_cut = 0;
9 s4 k" H9 u1 [; ^  V* g3 |4 H        // fill in data * R9 S) X% ]/ ?& A, H% E
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. D" ?- X: g1 [/ W$ q3 ~1 e: R! c6 j        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' b  W8 Q2 m3 P' Q  P( P4 e1 L: c6 S& A& q  x9 S" C
        // wait send success
! w$ u" w) p- w$ f: z' {+ H0 H) J        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 E3 Q5 f% R2 }6 i9 I
9 n/ U# C- M& U0 a* `' e& Q
        // make data node in free list ; a0 i+ K$ @+ f5 s1 @6 h. i
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 \/ ?% b% Q8 `+ S. }: e# Y        server_msg_send(server, APP_CMD_LOG, "upp send: success");6 x2 G/ u* U2 |% @% p. l$ ~
    }
& u9 [9 q8 X; Q4 l    return true;
3 f1 L' Y2 X& x}
( ^& A! o+ z% y% T2 L( y0 P! U8 n( A+ ]. ?% @' R" ^
7 z9 n4 R5 o  N5 B" I) f' Y

5 @* y$ h$ q, e) E3 [6 H6 r8 p* A  a
" Z8 p7 ^# h$ X/ Q  v
. h% m' r4 @# r" W, z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
( S/ p- @. t8 x2 C& s6 I" {4 t7 e' h% Z" S. i. k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 18:01 , Processed in 0.055569 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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