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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 a9 A+ `& e4 _0 W. r9 I0 _; V3 ~3 q; A7 @1 _1 w* s
问题描述:4 B0 ?" X' _3 U+ [" P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ c/ S* X* E  s+ s( J" \
: T6 _8 r1 c4 A0 m6 E) K
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- i) ~* y2 P5 e( A7 G( }7 b1 ^1 d; S" ?, T
测试结果如下:
* g1 F2 E* {: h/ t6 t; F138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( `8 k7 b) `) q
9 W3 _; W. K* ?- J5 |* K5 S
6 A9 T1 w/ X  N# S! @3 ~' W0 t
备注:! }8 ~) Z& Z( Q# D, i' t! v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 Y1 f/ M0 ^/ @1 E7 z6 L# [* W% O
2、相关代码如下:
# g$ Q0 y0 c, E( z, z0 K" ^//UPP DMA缓冲大小512字节
! {( W  T: ]& S! w7 ~1 W/ {. ~' I#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( l/ V3 K7 O" N* {! n& T
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! a2 [9 W+ n- T+ o+ m  M
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 n/ T, C  i9 g# K/ w( R. u: Y; X- y* [0 D0 I8 e! r

( h; g5 ^. t; ~: V1 K//upp接收、发送buffer
0 X5 V5 v0 o3 V; ?$ m4 x#pragma DATA_ALIGN(upp_buffer_a, 8)
8 O3 r) W4 v1 B, S3 @#pragma DATA_ALIGN(upp_buffer_b, 8)3 X( x6 s" `% G3 F  y5 E1 a2 f$ e" T

5 S6 j5 c7 Q! nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 M' p7 y0 L& d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
. y  O1 a- `1 A" h0 w/ I" ~: V6 [2 r6 k
3 Z5 K5 r3 \& F6 G/ _4 H
static bool server_upp_data_recv(Server *server) / q! [; E9 `! B& j' d9 I
{* M  O- R! @+ r4 ~1 X& z; h: ^1 L- C
    if(server->upp_channel_a_recv == false) {5 ?+ L: B$ i, t4 ]0 S4 T1 A9 i/ @
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* M" D3 d; L  C! z
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
  f+ A; A$ K# z; j- N) j* ~            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 O1 }# ~( ~; D0 d8 b! n9 e9 a  a, {' K. J3 X3 F

3 j( b2 d" g/ K, `$ {            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* t9 C" `3 {( Z# ?% Y' p/ i
# O0 d" b* i, W0 l2 P8 L/ S, H            server->upp_channel_a_recv = true;//+ E! `" Q, n, N1 n* @& Z
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);4 v( E% }- J% E8 e
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;$ E# p/ W/ {! K# e) r' N9 T
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;9 G$ u( r; x4 g' S$ u
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% }0 M4 k7 S6 Y) d+ H. ~/ r
1 O. x: p9 R0 e. f3 S; ?6 h
            upp_error_count = 0;7 ^1 M) z, q4 W8 g
            upp_dmai_int_cut = 0;/ D: Y+ Q! F  P& A7 n
, _* k/ W+ R( W1 p
            // fill in data " E4 z) [. e. w+ P2 B  u/ _
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. z9 v& o5 @3 ], B* x            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 ?6 W) G$ Z8 P- z2 I, s6 J
        }
: y4 A7 U8 j4 W    }) W5 ~$ x* z8 e' S- H2 y
    else{
3 o! B8 ~* F( T4 r- n        if (upp_dmai_int_cut > 0){# g4 e0 n6 Y; h% X
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 P) ^% l. F# l            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  P+ R' p! G  v! O( K5 n; `" W4 r. B* n
5 _; W; S# c0 F  \! a% \! J
            //copy data to upp_recv_list_busy
2 w( C, b3 c" I: F$ O5 C: u            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 Q' K" ^3 B8 i! D: _( V3 M+ y& \9 H) J
            //2 P2 r" |' \  ~0 E: R" v; Y
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! a  \( {' ?. ~- Y* e. G* c

: b% Q0 }, E: M            //
3 I) S- o) Q& w# q% ^0 G: Y% V, t            server->upp_channel_a_recv = false;//
' v1 u$ w1 X/ q, \3 ]; C0 g# i+ G* {6 {2 D3 y- t; ]3 {  a9 W* d' L
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");) I6 I1 h- P4 B$ `$ N+ z
        }
3 s, q  z, l. l& b8 t5 r4 x    }
8 I3 [; n/ g, Q( E- \; c: U+ _8 c* _; E% g
% e; e$ V+ h" t  w1 y
    return true;$ S, A& n/ {# [, E* A  a
}
) H: o! f7 i, c7 d. z/ k2 K2 \% }2 h0 `( h0 W6 ?
static bool server_upp_data_send(Server *server)
# D8 e. [/ s' {{; f# O- }7 V6 O  ^7 R" Q2 }* ~7 }
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* ~) t# B0 R8 _, Q- i        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ a2 U2 ~/ D9 y& }8 @6 }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, @( a8 A! c" z: Z+ m% A        char tmp[128] ={0};
6 J8 P1 s9 E4 V+ P
9 P0 i2 n6 p0 S2 d1 B* x4 F2 |        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 W# V. G- ]2 t) E# n+ ?7 N
        print_log(server, data, 64);
* w- j7 L( G( ~) D4 @: d
3 r, M& d4 J3 A0 ]  d5 i  w  v        //
4 a' }( P. O/ b6 m0 w- O( d& f$ h        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 v( r/ B% q6 }" A3 m6 w        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 X' `* p1 b: y9 ?
        print_log(server, upp_buffer_b, 64);; p/ _) Z: k% M+ Y! Q3 h
8 M: @( N: e( N$ `) G: l% Y
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);! q' l2 ]& U( g/ _, S$ v% Y5 v
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
1 d. g& @9 |5 y1 y9 ]        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
, G, ]1 i# @( g9 M3 ?9 x$ D/ x" j        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 P4 @0 n3 \  d1 S1 V4 y6 ]+ \8 o( X: O
        memset(tmp, 0, sizeof(tmp));/ X$ I4 x( j( |, K" U/ J
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 G6 P3 }, X% C2 W
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ t8 f( ^) J# [
        server_msg_send(server, APP_CMD_LOG, tmp);
* _' G) T4 ]1 N% ]! A# d
3 K! i+ S/ |  ^) }        upp_error_count = 0;
8 A4 Y1 d) }, N& f- ?6 e6 w; o% e        upp_dmaq_int_cut = 0;
, X. z+ H% p) ?1 |* A' ~1 G  F" J        // fill in data
- T  K/ q1 c0 V        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 u& K% T, A2 O) t# [7 Z9 K
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) c# D3 v6 K9 i; U9 D* F. k% {' e9 H/ ]' R- k+ q# h; ~
        // wait send success
  s4 F6 W9 O+ a+ l! Y2 b/ r        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; w& M) D* H* G: x7 h* D5 L! B: v
( H$ ?) N6 A( \4 D* t
        // make data node in free list
. Y4 U9 ]% t# x) f9 y/ ~        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) C' h* r9 S; Y  g( {* r' c
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
9 t& G! b. d) C9 X" i" u) N# S% E' @. I    }8 |6 ~" a( q. t7 Z
    return true;: g- R4 A, m3 `
}9 X/ c2 m1 |; B' E1 \, F/ m

! ?# l% f. \9 v+ k, w$ i7 H+ ~9 k$ u1 b
8 U3 J1 G2 Q/ O& o
' @, {: b& R: x" T

+ G/ J6 s, \4 Q: L/ b$ P. Q, e3 Z+ t* b  J- d! z% W! U

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐3 x" n1 X' b( S- j  e/ N( e

8 W/ B: l9 v: b9 {( |/ _& g1 @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 02:46 , Processed in 0.044268 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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