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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " w  g3 y6 v2 ^4 |; @4 p# j4 g

" Y/ {3 Q. v* J0 ]8 b问题描述:
7 C5 r4 K9 ?9 X& l8 ~在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- o* J4 U& x: S' r* j  d
! U0 O4 K0 l( a8 z4 I4 c, h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 V! x9 \) O1 l5 ]

9 V9 f8 g/ i7 B5 C+ u% ]测试结果如下:& @/ ?! \* d6 u8 v, O
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( m) M. D6 N- X3 J1 R3 j4 o

$ w. j  p0 Q$ y) ?. C4 x
8 t3 e+ [7 V* u8 J& i备注:
/ d( }" a" d+ o$ q) z5 C" }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: J7 {6 k1 V4 h" T
2、相关代码如下:
$ P2 I: B: S. q. O4 L( q//UPP DMA缓冲大小512字节$ {: f. j1 u0 [5 q3 _) ?
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍% z2 y" ]1 X/ X% [3 I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: M$ L9 M$ A' ?* W; T  l- p  ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. {$ A6 q; ~+ V; S
0 E9 G- e2 {+ l! [' R8 j
% s$ O+ X0 ?3 l5 ~& C2 d% |+ |/ T2 z//upp接收、发送buffer9 a* A9 l8 m! l
#pragma DATA_ALIGN(upp_buffer_a, 8)- |; i/ {" J- h* E
#pragma DATA_ALIGN(upp_buffer_b, 8)0 L7 T1 G4 f. u1 S( \+ c: E2 q8 ~

) u' I5 ^! I3 y( I# _unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 w6 d. I+ h2 Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- o) R' n1 K7 n; g7 s* j, [

/ \( i4 C4 X! j) E# f- ]! O
( f# P) B% a! ?( ustatic bool server_upp_data_recv(Server *server) & q; x/ r+ B6 j
{9 C$ i8 k( Y$ b% \# W! G
    if(server->upp_channel_a_recv == false) {4 |$ X6 ^9 ^- Y' ]6 K
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* r0 \( Y: r1 @
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
) g- O0 p+ }2 X' f. @. ^9 Y            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- Z9 t3 S: k% I& H* j# Y+ y- n, n2 s: T2 l

  S4 r, V2 P/ o' b# C. M            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 i) k/ R. x2 ^& I# k- S
1 r1 P# r& S: p0 i0 g$ Y
            server->upp_channel_a_recv = true;//! E5 B9 R8 M: B  @1 ~. B
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);# d! o8 }' R5 |/ L9 F  _4 m5 K
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 U  T0 _$ K2 {; C+ b" z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 h0 R/ ^; ^# o            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ i% v' p( q4 Z& c- @1 {
) q! v$ |' |; d
            upp_error_count = 0;
/ A- m% T/ B/ X4 `4 L            upp_dmai_int_cut = 0;
+ l; p5 M& q- d) y7 E$ Y
# W4 K9 _2 b- |' s            // fill in data - |( S3 z% D3 y# E) K+ y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 o: ]# ^' T( w: }  J
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 }% p6 C% L9 W% f: x
        }/ c& {. I! L- {: _
    }
* h5 I/ I9 r4 H; a1 h2 ?2 G$ o2 i    else{& `* x+ t1 N8 O& k4 f
        if (upp_dmai_int_cut > 0){
9 s5 T; ^4 A8 B& i            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& M8 S  f( Q" F5 `+ ^0 g            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);8 t& v, }  A3 S+ v6 h

+ z$ I; V0 U4 Z# T2 N) U( \" g) h* a: z" U) F% w, u4 e; K
            //copy data to upp_recv_list_busy, o2 H4 c. ]5 U% j/ t
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! o0 j$ m2 ^. ]' U" |& t$ M& |5 V- j
            //
- v7 h: V$ g6 y4 a- R            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. d! O' O3 c6 s7 ~# J6 c' y8 X2 P
            //( M& J0 Z/ M% y1 S9 D  `% C
            server->upp_channel_a_recv = false;//! }/ B/ W- C" N

; \! W& d  {: r# N4 K7 s            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: f9 [2 I5 x% k- W7 i- g, L8 r6 K$ i        }/ V, x7 @2 M$ G) `
    }% O, s1 c9 [# \1 A  \5 f/ ~! p

, K0 T* _! m$ V0 _% o1 v& H
" e. P4 f/ X4 V7 X    return true;8 t; I4 J) v& d" K" t* ]
}
" ?) f( t! v) x0 C
. T1 T& p, x' f/ B/ ^static bool server_upp_data_send(Server *server)
. `: K& f- q, e( F5 o: @{9 U  ]+ \6 W& ?1 Z- E  v
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% h0 T1 G. R3 j( F
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! w* r$ O# h2 |. S        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. `( a: T  j3 x
        char tmp[128] ={0};
* w( T6 d' [- e1 K, u) W& w# }  E6 |7 V8 ^. E
        server_msg_send(server, APP_CMD_LOG, "upp send: start");- O( g% o, V. Q) c! ?
        print_log(server, data, 64);
+ I1 B- f+ ]7 t
4 s7 D- r& G, m7 G7 T        //( ^' K% ]) @8 L; H" \  r4 {
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- b: E1 W7 S7 N$ b% V
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ T& e. s  q  A+ w( G  [* w5 i        print_log(server, upp_buffer_b, 64);! U) \  _+ n: ]  ^/ D. O0 A# e
2 k  g3 t( K8 Z1 e$ H0 H" g1 x
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! x6 a) n/ u1 e$ Z3 g- G( I        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
9 C' v1 `& h5 j  L7 C' p& a2 `        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
1 @5 s& N0 ~' G" I# J- y        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 I5 P) d4 h) _) F6 L/ U1 ?/ S: [' A' F4 d
        memset(tmp, 0, sizeof(tmp));1 H0 C" S2 c% @; t' c  O
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ j, l0 X1 t9 H) C' @, B            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: H/ A2 g' ~& N& j4 w! c        server_msg_send(server, APP_CMD_LOG, tmp);/ `1 o! S" c$ E) U0 k* q! X6 a

& w6 u0 b2 [4 |8 I+ e) V3 E        upp_error_count = 0;2 V' R& I; Y& e; W# c0 r, G  \
        upp_dmaq_int_cut = 0;
" \9 L% g4 R3 ?" P! s; [# p        // fill in data   L5 c/ c3 N  c  @
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; E8 A+ F4 c1 G% |' k        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ V! Q1 x0 L' f- F( V7 {

  [. R  @4 }. p, b# S2 ]: s        // wait send success
2 p" n# {8 q- \9 B# }0 o2 _        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
: A8 m; F: b& _( {9 d) n2 R
" x# K4 u- S" c9 w+ X( S        // make data node in free list ' R0 S1 ~, b# S8 B' {2 W
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. X+ }3 k- E+ }7 e$ i0 G8 M        server_msg_send(server, APP_CMD_LOG, "upp send: success");- f/ h0 o7 K* y5 i4 t3 L
    }
  G! X, n7 a, I4 O+ C# N/ {    return true;! X' t6 a' ^4 [! O) G  c" {) ~( f- l4 F
}
/ U9 t2 I7 \' t9 C- n
% e* ]% B' Q5 A8 ^- M+ m

3 I3 q/ P7 N) ?) V7 \
) J" M( W0 p8 T

2 w! E- g* m+ |  C* ]6 \; r
9 ]: L! e  O$ W. m) F

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
3 K/ B* ~1 b$ l9 _) b8 s
( W' u0 u/ j- y5 N

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 13:44 , Processed in 0.043246 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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