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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! q+ k2 u6 p0 [2 P$ P" @
3 H/ T$ Z2 d+ ?0 R4 r- F
问题描述:6 @6 r7 m; Z' s2 X7 h# D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
8 }! r2 _! B6 {3 O8 Z5 k( Z5 ~/ a1 X( x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. t. z1 ^3 N1 n8 \0 c( I0 Q" x+ R- [
2 l; D. U7 S$ j' t$ n/ r
测试结果如下:
4 `, Z. t& g  q) i/ q; }. ~138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 K1 N0 D' ~9 l$ j. D9 T8 a+ ~
" r7 U# H# C" u' x7 J8 z& L
( ^0 D0 h6 y- r9 i' y8 F备注:& C* r- M) `9 C: u/ D
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 ]. P* a8 r& V, B
2、相关代码如下:
  v4 R( y9 a- T+ v4 a* y//UPP DMA缓冲大小512字节
! F- ^. g0 I- x' W& K3 V#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ _9 n5 O% x3 Z" r8 y$ ], `$ k9 `
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 b3 O; }' d) P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( J& \# G" w% J; a- r$ T* H8 a6 \/ X7 i" z( H, N0 G$ \
2 d6 w, A" @( G3 l' c7 o" Z, R
//upp接收、发送buffer$ o" \3 q/ u/ E, u
#pragma DATA_ALIGN(upp_buffer_a, 8)' w, k8 U0 Z. D2 d) ~
#pragma DATA_ALIGN(upp_buffer_b, 8)
2 o7 A* ^# ~; `- J. V7 E- A$ _) I& c. n0 f: N, W
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 P2 n. t" M# w2 `. v9 Punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) e- P$ F. m$ l4 J( I

+ h, F9 \) X6 s
7 ^1 r1 a. P; _7 F. F4 o: Y2 ]static bool server_upp_data_recv(Server *server)
# N' k" Y0 P* w% }% y" W. Z; X{6 A, t' O4 v9 A2 O
    if(server->upp_channel_a_recv == false) {$ m. n' `/ l+ X% P
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! E) Z9 d4 i: P# J  P+ L9 w$ d% H" v8 x' a        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ R, T' Y% F/ X( S            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 Z0 Y9 ]; j7 j, b" w$ K  w" R& w' n

& X9 z) }3 K6 A- r1 @
. @& x% Z0 T9 `# b: e8 ]7 G5 S            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 \& g) P1 x* a2 K& E4 y& B- j3 U

1 I+ A) c2 q$ h+ S: N5 F6 |            server->upp_channel_a_recv = true;//
, b4 d- T" {+ V  R* g& g            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% a' u2 Q% ^( b% s" ^
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
! O6 m9 y  t0 i: ]" T            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;8 F$ j, b( |+ e$ w9 i; X5 [
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//# R3 e3 a2 J% A( y1 t1 f6 e

* \% c1 ~  c2 ]            upp_error_count = 0;
, w0 ^0 }9 I* L+ \            upp_dmai_int_cut = 0;, o/ N( r  w" P- u& P: w' o

* }6 c. c- |3 y% M; x7 ]; L            // fill in data
# b, B$ h) q0 s- C) p( e            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 x, a$ K1 O: k# L" V, _9 U' e            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' V9 N4 h: [# w6 }) G" V! b* Z& M
        }
) t. r; `: f6 W; L1 q    }
2 N% D& J, u% l  D    else{
& _, u& h9 y1 {7 d3 e        if (upp_dmai_int_cut > 0){- Q. N1 _: ?+ ~; ^
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);) q% v. L8 T: Z2 s4 \5 Q
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! T* j8 d3 {* d7 ^1 A" w1 Q  t" v2 j' f- ^: @+ T* @, r

/ G6 F5 j; o1 }5 ~2 u) v  A            //copy data to upp_recv_list_busy
4 g+ X5 I% T+ Q! g# l* |$ X            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( C2 a9 A6 ?! z) v+ N; M3 c
7 s" W% L  w% H; A5 L            //
! u% @( u0 b  Z- w, d" q7 Q            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ Y; ^. p0 Y& d2 I' m, q0 y
8 q! \# h0 F: U( Q' i
            //2 v3 u1 [" n, B% b8 H! I# J8 h
            server->upp_channel_a_recv = false;//
+ k* ]* `5 }1 b8 C! a; V
$ z* S. G% Z8 N" O# y* B            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 T% @! K1 o: \+ I% ^* K8 J        }
6 R; F/ p# d! Z* J5 V' T+ `% L    }" ]% A" u# x- O1 g0 t

# u( V' N/ ?2 M1 M2 }! J( q/ ]
1 Q! U9 P0 A+ r. E5 E2 a    return true;) D9 E, ]" {; ^5 K
}& D  n$ T" a4 N# a; D
8 r9 ?/ k4 ?4 r0 G6 h: @
static bool server_upp_data_send(Server *server)8 J9 }& a" d# y
{  P+ ^0 P9 o$ E' f7 N3 f' u( T& b
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){" U, r) p2 u& {
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! D2 M0 t5 R- \/ w" Z8 P
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. I" {: U4 ]2 ^' g# _        char tmp[128] ={0};
1 ?1 Q  E! {. a0 o
( M+ r& m* O+ S( P* s        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  v- f5 N5 B$ F0 |# p  }! k" Q        print_log(server, data, 64);
% _% o! C5 i. V' J% d+ O, r0 n6 A% R" F6 \. b4 q) J% ~( X& e
        //
" P, y# v& Z; e/ S! Y+ _1 p        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, q) C$ p( w$ |: C0 K( Y$ K        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. R' P4 p8 H9 I. ]9 C        print_log(server, upp_buffer_b, 64);
0 N) _+ q( [) @" R
/ {' h- V8 z- W% F, n) \  N        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) _! k1 J% @- @/ j3 f
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; # V, w! S; z  b! P7 V: {6 R8 {
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
6 r' M% r* x% j9 y1 E        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 q5 w  }6 Z0 N6 D* T) C
9 d; \# t' c/ C) \5 [
        memset(tmp, 0, sizeof(tmp));, n4 _0 o8 {: g' v) w9 W/ S
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 `+ E2 q) W9 w+ }. g$ G            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# G2 }3 s3 g& ]6 V! K2 b% q* V
        server_msg_send(server, APP_CMD_LOG, tmp);
7 A! H8 S% M! j8 F% \: x. W4 t
4 S; S0 q# c7 }. [/ c- ?        upp_error_count = 0;. i8 S* b5 O* u7 q8 m* H
        upp_dmaq_int_cut = 0;
2 z$ x7 O8 `+ J2 F        // fill in data " `# _: F9 I: j/ z3 M: i! }  z
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( E: W) [6 j2 x* V0 F& j' ~
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
  k" I/ y- L0 `: q5 _: O4 E8 J1 R, g. Q$ _
        // wait send success$ y! _' \- u# E
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 r2 `1 A3 O! B0 V3 H+ G  L2 J7 E
: Z; I5 j& b7 ?' X& E5 _( _        // make data node in free list ' h' r2 l' c& E( V
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# G4 \4 k: H- u9 [0 B
        server_msg_send(server, APP_CMD_LOG, "upp send: success");: p, d' L, _# f. _0 W
    }
3 \0 o$ S+ H  J    return true;
' N2 D% {) c# m. U& [8 ?}
# t* `9 N. Z" x
/ s  `/ U7 |5 ?0 W& S- Y
# f+ S: I. h+ Z" V6 @

# i/ @; L1 @' j# R' [$ Y

0 U% N8 O/ x. h+ e; G7 z  q$ C3 T  ]2 |% L2 w  U8 H  {; r- j5 V

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐( I- N5 w! D1 U1 g* B- _
1 f) l" M5 p1 {2 o+ q. f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 21:53 , Processed in 0.039464 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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