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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 S) _% c! h$ a- j+ j" u5 L& C5 @2 S* D1 e
问题描述:
; |4 @8 A9 E' q& P' b+ Q. x4 j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 O, O; _7 u' ~( P/ e) I. [; D- f8 X) Q3 o; ]( ]5 l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 ]: O7 l$ y: X

; L7 s3 a$ X- F. a1 S测试结果如下:
, O5 W7 g: W5 _3 k- R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- i  o3 Q( \. B% Y8 [$ ~& W3 Y6 e1 t5 ?
5 y9 [4 K' }6 }

0 r0 a, C& Y5 K* Y  Y6 L( Q/ a3 A备注:: g. n4 T+ I+ W" E8 y6 B& {
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 g9 P% A6 l. h: I: d4 q( @9 t' h
2、相关代码如下:7 u# L0 s! H- b: I
//UPP DMA缓冲大小512字节
0 G/ ?, `+ J* R2 s& t% R  _#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍5 ], [3 p$ G" W; ?! e, f5 X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. N2 R5 t% z; h6 n* c2 _, ]#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)  N1 ^9 w1 D" q! }% u

) K' v& E2 V4 n: K
# s+ L9 n# C1 n$ N" b2 i: Q//upp接收、发送buffer' b7 u) A0 \2 Q* U+ {9 S8 p
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 p: E& ?, e% z) V5 w#pragma DATA_ALIGN(upp_buffer_b, 8)
8 ^6 h3 C7 Y" V( f! J* }# {- ?. U8 P* w  g) `
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' Y" S# h4 x3 ]- u* y+ wunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, X7 O! z# D7 M! a/ J, _
  f- Z4 E* n: H# \# Q6 p4 p  {4 \4 Y
static bool server_upp_data_recv(Server *server)
, ?1 a4 D+ S) Z/ X  T; S2 [' R6 ], Z{
2 W; E( \7 H- n% f; C    if(server->upp_channel_a_recv == false) {9 T' p. O% w& h1 M/ g7 l! a
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");! W4 _( y+ d4 s5 E
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 }4 ^, ?9 e, D: m( l% [% e* h
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 L/ @, Q, m5 ^" V: V% `  ?, m% X9 B- K  I6 _* D' J1 N

/ s$ [8 u5 P  B  X            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" \) N0 U1 \( v" e" d( c2 N0 ]7 l9 M! u0 P1 f) n8 k0 p
            server->upp_channel_a_recv = true;//7 _" u' P8 l( h. K$ g% d
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! B- h$ D" D/ T; }/ U$ i& v; Q            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, K  ?5 b- D& K6 M, u; _
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' A# K& N9 [' F1 f' U0 I
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 B& h0 d$ u7 C
$ E4 N2 X. a5 H. D! }; {  T            upp_error_count = 0;) }6 p  t7 N6 j* W
            upp_dmai_int_cut = 0;
- |6 [% T* E2 d1 N
9 h$ w& \8 y* c! o( r- _1 k            // fill in data ( L; K1 P. ~! M, d& q/ Q- G/ s1 H) ~
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 K- \2 _# ~- L! W& G& I+ [" |
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 b1 T% S1 L" y; @+ y9 b7 w& c3 n        }! _+ x0 Z0 y4 V1 A6 G
    }
) ^0 l2 ~4 e7 S4 y, `' u! b    else{
8 V- A( z# q( q+ ~        if (upp_dmai_int_cut > 0){5 D+ n- M1 O8 Z# g, R
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ \& M! ^2 M; H; V6 x5 G4 W
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% M: a$ B" [1 z- D) m6 I9 B. A2 y

4 y8 j6 X5 {6 g  L) Z5 J
) F8 x8 N1 L3 F: ~3 s            //copy data to upp_recv_list_busy4 E7 m' w# B0 X4 p
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);  L5 ?$ `! N5 l  Q) E$ G2 D' L
) {, s* K8 z2 p9 ?
            //2 z  S6 w1 o) f- G$ P) {& t
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. o9 y" Y% m' S2 n7 [2 f1 Z; X1 Y' {+ M

3 n5 v% i6 k- r            //
! @( ]$ |! [: d3 o& A            server->upp_channel_a_recv = false;/// \2 _% u1 c, ]

3 E- ]$ N, V* B, {# m            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 m% q: l9 g3 b& M& w0 L6 o
        }# I6 K6 b7 d, Q0 x+ O/ }$ W
    }
0 K5 H  N9 O$ X: }, \4 ~2 T7 y2 F7 ]# J$ y5 T5 f3 A# ?# C# Z# w; N

8 k# T9 m* w' Y0 \# [    return true;+ B2 Y* I/ S0 h* O
}6 ?' S% z2 M: C1 Z! j
# S1 V0 W6 o$ E( x. F. b0 ^) h' l
static bool server_upp_data_send(Server *server)
: r# l, p  T) w6 v6 D! |{
5 d) e1 p1 v. x; C8 G& B4 C5 `    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ _' g$ j% S' E! l& @% `        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  h* P, L8 y1 x3 |        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: Y" n; C. [0 Y% \4 \( X; Y8 O        char tmp[128] ={0};+ k9 q* y& T4 H8 Y( a7 e& |0 {
% r1 c" d7 z0 v& F
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. \- b& w: N$ e! E, H# b        print_log(server, data, 64);9 x2 M6 o" u5 \; e# ^6 ^' k0 k
7 [# P& h+ q+ N
        //
% B6 ^7 F4 T" j. f, \        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 L0 M$ e! L# f: \! D! U3 ^
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* H7 D  o1 V- |; d  P; k        print_log(server, upp_buffer_b, 64);
. A. }, G3 Z" u5 z6 Q5 k
+ n& s1 A$ _  w        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);0 e+ A6 P" m/ ]) z$ S: J  T% o
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
$ Q8 ~# y7 `7 g* K/ ]4 v        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 }2 a" H+ a* ?! V4 j+ `3 q        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- q8 v4 L0 j$ s% ~

0 z# X% r' \4 ~; w3 N& D( q4 L( V        memset(tmp, 0, sizeof(tmp));
' n0 H* L/ q; g        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * @: J2 {$ A5 w4 I1 u. ~
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" E8 Q/ ?+ f3 e7 v
        server_msg_send(server, APP_CMD_LOG, tmp);
) z; Y2 j) J5 C$ z# t! U2 F4 r5 T. L$ ~) t8 ^) l# j4 G3 C
        upp_error_count = 0;
, K  o; ?; O7 g2 d- w: @        upp_dmaq_int_cut = 0;
% i0 b6 L% g: U. i9 `; u: }        // fill in data
7 J7 G1 q: P% x        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * n% z; _; s6 u$ b+ `
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 U- h( P6 O0 ?3 f, o1 g

1 r8 d( @, I# i1 W# X# z        // wait send success
" {' v/ M/ I" _5 A# m- t        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( x. S9 n" U  d5 r: T0 ?+ q+ B* u4 ^
        // make data node in free list
8 }9 k4 O. E' f( s! q        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" g/ s& t1 f4 q1 t0 e        server_msg_send(server, APP_CMD_LOG, "upp send: success");" s: ]" R+ Q  \$ E0 T. }# Q8 l
    }
# `: ?8 _$ s( H# P) f! O# @    return true;
; o1 O! o; ^# Y}8 v" D0 S: g# J* W
. i: \9 F' Y5 D' l

, n: E8 |4 g( n
% B5 M9 G/ F1 n- s' p

. k* A, O1 F: N/ L+ ~' h8 U- q# S) }/ J' N2 v) c) `

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐! i" U9 ~# [  X$ G
- I' P. X6 W. q2 o# R

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 18:25 , Processed in 0.042518 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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