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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( T7 h* V3 T+ M4 {% Y+ n1 l, s# U; d# u: @' L8 q9 `
问题描述:
! ~& q& g2 h/ m& [$ ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) d5 B5 D" H* E" _, O2 ^* y; o: r# x- ]0 L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; B/ I% S* B  `  W# l% H. x' r* P
8 z3 u3 c1 f' H/ ?( d
测试结果如下:
9 D: k, b! A% S8 p) d' O$ y+ U138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 Q2 q6 a6 n1 q1 [1 K% ]

- \+ Q6 r% L  P" `5 ]$ \  B/ a5 T* A+ `3 }1 H, u: y
备注:: h' V# b. A% O' V* }& [7 b; n6 M* z
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 Q7 M" T! O  r0 M1 P8 Q* k/ x/ F
2、相关代码如下:
/ V' y0 x, {# x2 x5 F//UPP DMA缓冲大小512字节
" p1 `: X' ?; l7 w( g#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 T2 Z6 b1 y8 f2 `7 K8 D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ E" B0 F8 n. h- w# f5 H
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 V% G" C  H( ?+ a' F# v5 }

6 i! {3 }. i2 L( w( c6 L' w' l: x6 Z0 w5 K
//upp接收、发送buffer( q; R/ X( ?7 X: j: L; w: y
#pragma DATA_ALIGN(upp_buffer_a, 8)
: Z8 u( H* M6 V) a& U& r3 y#pragma DATA_ALIGN(upp_buffer_b, 8)
6 q' |7 n0 ^/ K+ f: `6 D' o
2 w- s" p0 k* w! }" U" M) Xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( S$ l3 ?% ~8 [
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! B  d) ~5 J% _* m& r. u! R/ ^5 i
& s! K( D- r) w8 n, C5 k' M# R. n- V) H: ?9 f; @" O& m
static bool server_upp_data_recv(Server *server) 6 L& D- R7 c, G% F3 y) G/ T
{2 y' O. s  ~, H6 {
    if(server->upp_channel_a_recv == false) {" O  E6 s' P; M; i: h4 s6 _
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
5 ^3 T& k/ ~1 X4 r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ B& M; A' M9 h* n% [4 W& ~9 d
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
7 V- G: Y1 C, a; A' a/ w% g* h3 p7 k8 L3 o2 s& O/ B1 r
2 e; [. h' W- N3 q6 h( f: B) b
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);. |* p% @5 h% ~
1 ]) Q! }; u2 S. n! _1 r0 L: M
            server->upp_channel_a_recv = true;//
1 w# b# [: v: Y            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
( h# P, i! g. \2 f8 O2 F            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 E+ ~0 o, e7 r& X! [& A2 m            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. i& p! P3 V6 o5 j" S            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! |# l/ u2 [% N; W" ^4 M" M$ _, T# S: U2 v  e1 R! T3 ?
            upp_error_count = 0;
- }3 D0 f$ c2 ?- x            upp_dmai_int_cut = 0;+ e* n. B5 l3 Y8 F3 v5 j3 M

: c, k  i0 N, ]; Q6 R* }4 N            // fill in data / \3 S" @4 G0 a" x  k2 o* L  L
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# E- u/ r, z3 D0 i$ i4 {0 w* m
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. c6 _' X4 P" X+ O3 |% G: s. V( x        }# a& b& Z# Q) u) C! Y
    }! T- q8 N, F3 ?) z' E& {$ m; Q8 ]
    else{
* B; l7 H6 c; i6 t6 C0 Q* Q        if (upp_dmai_int_cut > 0){
. e6 S9 k; L+ F' @- S- N            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- B: G4 m: ^; Q
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* f8 ?' t' F( k
: v. {* Q" l1 x- f# O; n) A
0 W; x2 I( U, w
            //copy data to upp_recv_list_busy
4 O# q5 G' c# P# |4 Z3 H6 s            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* x9 A$ q% R$ [1 w9 f2 U1 o! Y. l/ R* l2 U1 _/ F# s) `) I; T
            //
" S4 [% O: b' v! y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' l8 S) ]! `7 A% t% n

0 Y1 H& |: ~4 F" P4 J) J            //
3 l0 a- q- y% n! g& q; `: W            server->upp_channel_a_recv = false;//6 H, n: p9 L- c" a, O  u4 m3 j

8 z0 O) \2 u' I. C/ |            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 l' K% n% C& p: y  F        }
+ N  J  m- K$ Q. d    }
: s* R  ?& f* b6 F2 `  P, `! T
5 m4 |- m- z7 V. z; n$ R6 x, x( W5 j1 W' f
    return true;4 J7 h8 P& i+ S/ U
}7 j$ K. u1 N1 N% d' Z

2 J  g0 f0 p3 h9 J. X, N' l# Gstatic bool server_upp_data_send(Server *server). j+ r& ~% K: Z- P# C
{
) Q/ J  W: l6 ~3 \! K6 R& [5 i    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% Z9 P: @* ?2 f' a5 w" l( m# M9 |
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ [& s( P$ ?0 P) V7 W' k( w+ F        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 g# e& r. f1 x
        char tmp[128] ={0};
) ~; {" V/ e' k" {6 [
( C& ^2 E, \- y* V9 D        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 K& d2 O  c1 y# a* Z        print_log(server, data, 64);
% t! V% U2 E+ Q0 J
: ?# p0 V) ^! D. S8 |+ D        //
- r/ `9 B) V1 o4 J  o! C        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 `: M5 A* c3 O, K) r* b7 U, k; [        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. H; I; ?/ O. o( R3 _        print_log(server, upp_buffer_b, 64);; P5 h' l) X% t3 N" r) z7 }

8 L  U  |+ E0 y  }& n3 n        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  z. m* N1 a0 Q+ Y7 j4 d2 C        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! l7 P4 m9 @! S9 ~
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. o' }, v7 h" i0 U4 L( i        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 A$ |) l+ V$ e. W- [) ~5 J

: s4 z( K3 O+ X        memset(tmp, 0, sizeof(tmp));& d  Y1 a2 n( f
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; k$ ~4 @, F0 d, t
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ Z# E/ W) w# c6 R$ K! z        server_msg_send(server, APP_CMD_LOG, tmp);
, p, N( m& I6 o& c& b7 y8 L) v' B
  f7 E3 x; U6 l% \+ l! E3 {        upp_error_count = 0;2 N% K. [8 B( a# b6 B
        upp_dmaq_int_cut = 0;
5 f, p& `* A. P% k& ?        // fill in data
8 v  Y- s7 p4 G" u        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % n' d( R+ m: c1 z% a9 Y) r
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# Y" j' s, D0 ?
- e: X2 L5 J0 _. f2 ~8 w2 j        // wait send success) X# f" s5 Z( x4 w& _" c. W2 a( }
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " X+ w- T. \2 i

. S) M7 X8 M7 V6 h5 ~! ?        // make data node in free list 1 d, _# H/ ?/ F& ?
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 o: o" S( A2 |; T/ K9 I        server_msg_send(server, APP_CMD_LOG, "upp send: success");
' p. R3 j3 z. n    }5 t6 t& S: E9 P! s4 x6 f, ^
    return true;$ w( @8 M9 n4 D" i+ F" T& `+ I
}
/ W( S8 p4 {$ Z1 |: B$ ^
7 u1 n0 s' [5 Y1 y. M: C
. o4 q: G: Z  Y& M- U" r" }
; a  h; \( h1 k' }. c' X" V" l
4 d% V4 m& U& ~( W! u
7 j$ x, @0 u" q6 M

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: G2 }$ ^6 f2 h$ `

9 g" ]* a; N, j9 L& j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 20:30 , Processed in 0.046127 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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