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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 l; E3 a+ `! D( g
, a6 O: ^$ {) M3 e$ A/ c8 p  ]问题描述:
* i3 W* p  k" T$ o9 X在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% ^9 o$ J2 O6 [# `& I( W8 ?4 @3 }  ]: V( Q- M0 |; c1 O4 T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 P# c! U% I1 O  H- ^& x' C6 V  ^; G8 K9 D! N0 e( W2 Y# p/ |
测试结果如下:9 t8 {( I% Q5 F
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) \' E( b/ H/ N3 y2 ~' G
2 N" C- Q, h% u+ e1 k  P* q" v: u( G/ b+ b% \6 `) R' }
备注:# h' D  M5 I6 \& h- x- m$ e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! s' I. ^( U( n) n% N; `& M
2、相关代码如下:
% @8 a6 `; \* _9 F//UPP DMA缓冲大小512字节' |; m0 c) N9 \# p5 V, F
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 }# M* U0 B; _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 E! ^9 V+ j8 U6 }
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ M0 `) \6 f6 Y& E2 a# n/ L6 b! y6 C; H
) U+ B/ h2 K* v  q9 I% O; r
//upp接收、发送buffer7 p' k# c+ Q" ~/ h* o' X
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 s0 o) s- y, h2 s7 G+ Y#pragma DATA_ALIGN(upp_buffer_b, 8)% K. |2 u# |) [/ G( K6 f
& U/ p( ~1 U% R. _* L% Q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 q( ?7 _6 j( l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 U' V5 u1 I: }* _: s+ T  u% `3 u
. A7 Z2 D' n  l+ N
9 c+ k8 z# P9 v( ostatic bool server_upp_data_recv(Server *server) " {% }% g! Q0 H9 y3 ^
{% U: {! b& I) x& Z1 ]3 {2 U
    if(server->upp_channel_a_recv == false) {( w; a: G9 ]5 b+ L- M. H
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
. I/ M# S3 c& Q9 r0 |6 O  {        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 x* Z3 @! v; [/ j, \, S1 ~* a
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");) [; g. x+ l/ {1 p% K8 ^; W

# c8 O* }2 L* P$ i  h+ G0 Q& ]# F5 F4 {6 B" T
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ ]6 j) n2 K- [1 J% G# [+ `" t, ?
1 D2 v. t" D8 C
            server->upp_channel_a_recv = true;//
0 e4 l; p2 |! Y# E1 K) s            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);- N( j9 B  ~$ a0 W( b1 K: o* W
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
+ Z) y! R% ~7 y            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;$ R; C8 P* X) C# C( n/ i( O, ?- c
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 }9 k! e% i1 {( x) [# b% Q

+ s6 M6 {3 z. Q" m/ i0 x2 M. e; ^            upp_error_count = 0;' C  x! K/ B* R7 @, |, a- p
            upp_dmai_int_cut = 0;
( l" G1 b& o- n# [  p1 }$ a; k4 U) t) @( _5 v' ~8 ?
            // fill in data
6 m$ _% v* }; g. V) t            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* m& ^/ c9 h9 Z5 X7 H/ c' ?, _
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ I+ N, ?2 [7 A3 @( n        }' F+ M4 b2 n: p& q
    }" u4 H! k9 p7 \: `( x1 ]& N
    else{8 b) U5 E5 |  l
        if (upp_dmai_int_cut > 0){) f7 _* b$ Q/ X5 d: F1 P
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ I+ G6 H& s4 t( k7 b
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 B( W6 ?/ {" r

  Q3 r: k; [; H7 J4 K) x
- l2 g. S0 u$ e2 I            //copy data to upp_recv_list_busy1 L" G& o0 Z( _1 B$ I3 s0 g
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& M+ |" u) C0 G2 q  ?$ J; E& L( {3 }" L8 H% T
            //
& v. m' n- P& b5 C            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 o! O: T0 X! ]4 R) q; b
& V* G1 L6 x6 _& T% N* A
            //
4 s. u3 w" Z/ [( b0 l! V! z4 Z3 r2 s            server->upp_channel_a_recv = false;//7 Y4 Q! ~# \4 x8 ]/ g

7 R$ G( D# u" T$ B% L) W/ x0 K" n            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. a# F8 E9 U  `; W& c$ p        }. z- v- l6 ]2 ]( s7 h$ O
    }6 R7 d* v9 L) l" z" [

: q" \8 f9 A. y) M" U/ G. q
# o& L9 g8 f/ B5 `1 \5 q6 p    return true;
" ^& A( T4 {0 _* G3 O}# ^6 \: D5 |1 X; ^* u  K
0 |4 L6 s) s- ^# M4 f" ]
static bool server_upp_data_send(Server *server)" Q1 U3 p3 E; v8 Y3 [  F4 p& c
{
& ^. t1 g4 y% h( G- b: u. y    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; X+ r" i  d! o, d2 @        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 N, z$ v; d' K# |* K/ m7 ?3 o
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 L: h) s1 M7 B1 Y. Z3 m% ]% {
        char tmp[128] ={0};
  ^. A/ o( j+ x( h( n# l
! a" U+ j% q7 O, v        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 [0 |. c! ]* F        print_log(server, data, 64);
! ~" s8 @) L7 M; T2 F
# k, R; D  n& Y, Y$ r) g3 ^        //* r2 R5 ^) D3 o& K
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 p" o' s& Q" b, m! g- m        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* ^4 i1 Q$ [2 D( E: M
        print_log(server, upp_buffer_b, 64);7 L$ t' ~! F! ?! E9 ?
8 ~+ v& Q% x; G4 [* r% t' d; R
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; f$ I! E. h  S# z8 H" g
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
$ _6 d+ z- P& T1 U" R        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; g& y. P# i9 {) l% O. Q) s
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 t# _  \; _5 b5 I2 Z- ]& s; t
4 r9 b$ ]6 a6 E3 D/ ]        memset(tmp, 0, sizeof(tmp));
0 P; W/ d+ T5 y7 t; Z7 }( o        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . l( u" G8 A2 s+ p) ?9 Z
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) V. X4 x( g+ J6 Y, ]8 K7 S- \        server_msg_send(server, APP_CMD_LOG, tmp);
: w. d/ B3 B' L/ J$ k$ B( W0 `. |; f4 s( C& u8 u; b0 z! h
        upp_error_count = 0;# q4 D3 F4 i% B+ t# n
        upp_dmaq_int_cut = 0;- o2 P* v% u- i* P
        // fill in data
1 A. @! U5 L3 e3 g        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; s, K% [- w, P! w& l, n        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 D( v1 O* w' X! O( {: \+ c" K; l' P' O, k
        // wait send success+ U& S0 v. A6 S3 w7 g4 k
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # X. R4 Y$ E% h

, K5 H0 C% L$ z2 |9 ]& g5 Q        // make data node in free list 5 o) b! E5 u2 q, v# E+ X
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( a% d! l) x0 M; h& Z+ O8 i2 j" i- R$ V
        server_msg_send(server, APP_CMD_LOG, "upp send: success");% f; X& n# ?3 |5 ^3 M+ |8 d. Q
    }
. t7 [8 t' |9 [9 i$ _6 t. g    return true;
" g( V6 p' y! U( n  }}
6 Q4 |" a0 S# c* k$ h6 A/ g* m) }. q0 q" u4 x+ T

, h4 o/ K" r  [& E' r% J  n: ~) N8 J) `- t" C
' P# s& U3 I3 r  z" z
( l7 V" f" [/ `6 W& L* R; T' F

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐6 \. d3 R% L5 u, o7 D

: {2 X& O8 @9 b' f/ M) U8 d

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 22:18 , Processed in 0.045020 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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