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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : o  J+ E" p7 m' H- n/ A: r- Z

7 `0 i3 V' g$ I! I" `0 q7 X问题描述:
0 C2 @  X, F6 t2 S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ U# O) a( [0 U& m  ^6 Q
" j5 o4 r2 X, L9 z# c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
0 A5 [5 N" O% Q* a8 }, x
7 ^" g* N" t/ [/ J" V. l2 u1 N, X; Q测试结果如下:- |# I' j9 r+ C4 h7 u, r6 x- A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 ]9 g% Q0 u1 G1 z8 Y
8 M# J) H2 V1 U1 t! n! t) N4 A( p
& [7 T! Y5 [; o% O; n备注:" d% k/ A2 W2 N* N
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; j, E* g! ^# x% h
2、相关代码如下:
9 V2 s5 G# _1 n& n2 N) _* A//UPP DMA缓冲大小512字节
9 M: O/ O3 w+ \$ u( w9 |2 H#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 q0 X, A1 U. }4 |& t9 {! R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# u& ^; A1 x0 u. y* g0 P#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# D1 ]5 x$ b' H0 O1 K" {( q, r. h

% Q! X5 z3 b5 Z5 i2 |6 ~& F
( b, b, b( g; e, T; D4 M8 N//upp接收、发送buffer
1 `8 ?$ X) D* f  C( A% o#pragma DATA_ALIGN(upp_buffer_a, 8)( i* b/ {! z" h6 D7 X
#pragma DATA_ALIGN(upp_buffer_b, 8)
/ j  D0 e8 }/ I) [, z0 `
! k! c2 r$ ^7 Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ D9 P; s0 b; \# T0 }- M- {0 u' Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: a+ G7 [' t- V: ]- C2 @
0 V; F; D5 I; h0 F: r- g% t4 l; W/ i' N1 Y* U, c4 q4 c3 O. R; Y
static bool server_upp_data_recv(Server *server)
% u5 p0 O, e0 ]{1 |# y  [2 p) t
    if(server->upp_channel_a_recv == false) {5 Y, R7 R6 I% X, S
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 K$ s+ X9 B5 a3 o        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 a8 a4 t" [7 A2 t4 g, ]$ m& R% j( ?5 q            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 R( @7 {( Z. l$ T5 C7 B' \2 c; U9 x# c

5 s2 }2 o  J" r( P7 v7 Z0 V
* N* g7 u5 d. s4 F            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 j7 ~$ S% f9 l5 T1 N% L: J* e, C. ]5 U3 I1 o
            server->upp_channel_a_recv = true;//' a' V2 m4 l. p6 d& b. G) y
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! U, R5 x5 h9 x! P' K' ]# c            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 \" Z/ d6 U+ G; P% P) x
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;( T0 f; [' j1 ?. u" D, f
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 ~! G' m( M# c4 p% {9 J! S8 W6 N7 \1 t* K6 c: O
            upp_error_count = 0;, W" A( J$ N* {- U
            upp_dmai_int_cut = 0;( J8 }9 Y) P" p7 o  ]

& u/ x- g) ]! Y* t" h( h# D4 F            // fill in data
3 R& Z; O4 \$ Q- H            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, A8 T1 H( q7 i
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 I* e* D. l, v* x
        }9 D7 D) i: D" ^  D* s: ^0 B4 y
    }! ?8 u0 D- ~% c4 w, D
    else{
. ^- G: \+ B# f' Z        if (upp_dmai_int_cut > 0){
0 G- U: v( R" f2 \  @. L% F& |            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 X2 ]4 Z: D- y! z$ M$ ?            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 E, d, W8 q2 D5 ]" m6 @

' K3 R3 a+ L6 o' q! |2 r3 N- ?- \7 z7 E6 w& `, o
            //copy data to upp_recv_list_busy# q: c. `8 ?# h6 L" K* L$ B
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. v; y- U: R5 o# m, }& C
0 D' ~, U: S' c0 r( G" u6 W7 j
            //
1 F. C9 R  z  |! K9 D! B            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( v, X( z1 W) D+ V1 Z* D
* i0 W: F$ N/ M) E9 a0 Z            //
+ ~+ E, Y6 J4 v! R9 n8 c            server->upp_channel_a_recv = false;//& t6 C, B0 l( Q1 H+ `/ Y3 u
& g6 m9 r: l) [. d* U! n
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ q" c) p0 J0 x3 A, M+ J0 b        }
" g6 \5 y, A9 E% h5 y( |! `    }, s9 C6 ?  d1 x/ o- M! y: n
) q; q' [2 K) Z

$ T, Y) Y7 m1 e6 I# M3 v  q6 R    return true;4 L7 U8 d! W7 U) i7 ?2 K5 r1 v
}
, @% ^2 [' C* J+ i8 _# a5 w! z8 Q. l% a9 O
static bool server_upp_data_send(Server *server)" t1 k5 [0 w( H7 W6 D
{* c7 V- z7 ~$ n' Z6 q
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){- y0 R0 Z5 o4 A3 a) u
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 p+ X/ L# k* Z; g2 f* s" ~1 Q" F
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% q; ^5 m) b9 U; H        char tmp[128] ={0};' p! g* U! [7 O1 W1 i

4 X1 C9 H) l. ?) }* [7 U        server_msg_send(server, APP_CMD_LOG, "upp send: start");
# z/ I7 X& e+ i        print_log(server, data, 64);
6 k, X3 X' c2 H' \+ ]5 C+ [
9 ]6 r1 m8 S' ?% E        //5 `' Q1 l8 k" ~; U$ h% g! }
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 I1 z0 F2 R, M2 O6 Y& ]
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 |3 P' ~4 c1 G/ s  ?0 p/ A6 ~        print_log(server, upp_buffer_b, 64);
) C# G( I. {& r7 I' c5 s- W4 o, X
4 S3 L9 J% Y0 r) n# E4 h+ {' X4 c        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
1 ~. J  b% s: W9 _4 W- M" G        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 5 H) G9 V4 p3 ?+ ]% i
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
( @! k9 O2 i" ~  i        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 C& j- i6 T& ?4 g! z- ]
, L* G6 ]- J9 M4 n; W! O        memset(tmp, 0, sizeof(tmp));4 W! d. @* {% K2 K2 z3 C, s2 D" ^% _
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . P& T5 Y. u4 o
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" E% l  ~8 ]% Q        server_msg_send(server, APP_CMD_LOG, tmp);
& p$ R% p6 P2 o7 X* A
7 @: M" V! n0 t- ~8 O+ P3 J) [2 E        upp_error_count = 0;
7 k. S, l# p# ~3 U. S1 N! b        upp_dmaq_int_cut = 0;
$ G5 L# _* t9 x3 F7 ~        // fill in data ' S) e) g" x" }, R
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 l5 x# Q' F/ [) K8 p% \  ~
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 E& j2 u3 f/ D2 Z1 Q6 L% b# S  v8 A4 m/ s0 H
        // wait send success6 v1 M8 c% L" K/ H# l
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " `, r0 v3 W3 J5 T5 J3 ^

/ b2 d5 z+ t3 Y        // make data node in free list " ~( b; v2 g8 ^& c9 z: C, y: |
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; g5 @8 U( D. R$ |- }" j1 q) Z        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; ?/ u" t8 E9 r1 U. Z* K    }
* R* ^% Q% h7 t    return true;
; D% U0 v. o: `' @* C* x7 T  I}7 k' n; X: M9 p) ~' `
1 B8 Z! Y! j6 A  H: e" i
; _- Y5 s4 n% |- H- U
7 ~( f7 k* Y5 v9 Z/ ]

/ ^# u# s, q0 u8 G7 y8 _; S2 W3 W$ |/ {- ^9 n. B  q) K+ T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
! C4 M. [" m+ \8 c- U2 p" @
% W# }' s6 V1 i  Q: R' {8 @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 23:55 , Processed in 0.042469 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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