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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, v7 Q3 G& B' x+ w
, N# M" H4 G" l, `6 B6 p问题描述:
* s+ |5 A+ [" ^6 m在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 m; g4 Z+ |7 B; s7 t9 E* e
9 X6 A$ y: M5 N9 K2 r( I2 f. ?' b8 i图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ a+ s1 }/ J; T

$ `8 S3 V+ ^; W: q$ Z" p; z& o测试结果如下:5 n& s& P1 D: {, [( K# e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. v0 U4 R' L4 g  m% m5 k1 G0 E

: ?" K) Y; e; f6 T6 t6 ?1 ]5 L& w7 W7 j1 f6 c
备注:, N6 `6 K& y8 e+ C! B+ I8 q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 Y9 }2 Q4 F: ]( l- T& K& A* K
2、相关代码如下:
1 i7 D& c0 v4 z+ ^  N1 y7 Z//UPP DMA缓冲大小512字节: B! z3 ^" J+ y9 K( X) F
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* Z. D. o( R* |- }, S#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! m; Z7 f: d* h. Y; ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 R% y& C+ I7 J% C
: X- W4 |% u- }9 o7 t& X7 J

# ]* q& M, q* }//upp接收、发送buffer9 _! b4 l* p6 @; u) r  ?
#pragma DATA_ALIGN(upp_buffer_a, 8)4 J3 O2 T8 l1 H+ T3 u
#pragma DATA_ALIGN(upp_buffer_b, 8)
& \% P$ @4 C% e9 K: V$ b5 |' W, B( w8 ]0 z
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 y7 h; i  A8 e) Z4 f
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 z7 x1 |' ~( C
7 q- w+ Y$ q, g$ O: Y3 x$ K2 b2 a% [. d. O0 i. U2 l
static bool server_upp_data_recv(Server *server) 9 |/ l9 A; I6 J4 u% g8 ?7 V
{
/ N  K' {2 S1 R+ i    if(server->upp_channel_a_recv == false) {
) j: W1 u9 A: ]9 ]        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 q6 \5 ]6 I% `  b  r  C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 E! K1 S6 \- H, X9 b
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) K# H$ w' F, T7 G
/ m& r3 C5 V. }" X
( z( T* j  m3 I, }7 H2 J            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ b' `& N  ]0 U8 x3 L! @* ~
/ }3 A: n  `; P$ }            server->upp_channel_a_recv = true;//* V2 [: _; Z) M+ s1 d6 P; D3 O
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);4 u) V- K' F. f6 H- [1 h7 ?/ H
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 x1 `+ n; H  @; N4 W& X5 I; q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;6 `) m$ l; c7 y( h
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//  N& t$ r( b9 m
9 i4 l& p/ B; J  x
            upp_error_count = 0;8 F' D! a0 e( A7 H7 r
            upp_dmai_int_cut = 0;
; G& |* D! s0 q1 W& _. k+ D& n
, t' h5 J8 M) e2 v/ G1 A9 B            // fill in data
' [9 i* o% N: j4 A8 b/ z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 L% \% u! e+ L+ `8 U
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 K: t4 K3 ^' M( o4 c        }4 o% z2 [( R) X/ N! H# p, G0 c% M- g( s9 u
    }
# i: [3 R/ A6 }4 G; p3 r    else{
) H2 J; E3 ]4 |" r6 b        if (upp_dmai_int_cut > 0){+ b- E- _% V, p- S
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! m/ D6 b; t. C3 P/ O" z
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. K$ y& L, S$ }* R' g8 d, I2 ~
, n; c; F( \' d8 d" k$ k3 j( U( t6 e6 q5 w: Y6 {
            //copy data to upp_recv_list_busy% A) I6 E" P: |  ~+ E
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
$ p  F( j# y. _9 c2 G; P4 p# o
7 h: _: O) W  v, y. A            //
7 S2 S0 `; K% @            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ T5 [8 D) K# X4 k4 q8 Q

* W. q* {; v' y/ Z            //
# K4 z+ Y( _" v7 W0 Z            server->upp_channel_a_recv = false;//
2 ^9 M/ h  v( K8 c% ], s6 J! q% Q. g# n/ M" N; m2 @
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& G* A! s5 C4 k  K
        }8 C9 q) n$ U8 \# `
    }) J9 V9 X. q$ b9 o& q; O6 t* B

+ \- A6 s5 N3 a% @  I- w$ l$ D3 G, k! q
    return true;4 }4 f. b' O/ ^* v+ B- Q
}" n, B5 ?9 N/ f7 A# r0 v+ H
4 }) o' n% o) z) M3 M8 b! e# n
static bool server_upp_data_send(Server *server)
* Z) U. k# x! a" x! H8 v4 d{5 r) \5 k  J: `  \: n
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){, F' F* Z0 U! ^3 M2 g( g
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);& g. z; ?* B# p6 s( }% r% [5 n9 [
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 ]3 c1 N, z1 I, t, J" h! e' s        char tmp[128] ={0};
& p( _! w8 @, x( Y/ y4 \# X* l. H9 x* v% H
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  N0 ]3 D4 z1 N. C        print_log(server, data, 64);- V+ s8 G2 d2 g  C# w- U
& ^. c& D" }2 s7 F
        //
8 Z! ~0 l5 E* q% [9 ]$ i1 i2 m        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& l- z" H7 e  Z( b        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% E, W1 P& c7 L% p$ c        print_log(server, upp_buffer_b, 64);: T  _7 E* b5 n7 Q$ F% r4 _3 E9 I
" @% e: D; N7 M$ z& a
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
9 A6 @! w6 B2 n: V        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; " C# u/ i$ r% w' `# P1 q: `' V
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# s" Q0 ]* Q% U2 m6 N" U
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 l) ~% O8 v7 g; b+ s( L( ~. ~: I+ p) n, q- c3 E
        memset(tmp, 0, sizeof(tmp));
: _9 Y. k4 [4 k        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . W1 \9 y. V  a
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# e, B1 ]5 @8 B$ j/ U: [1 O
        server_msg_send(server, APP_CMD_LOG, tmp);& b: w( o7 e) b8 k' Y: _. d; D1 p

" b. G  M. D& [$ H        upp_error_count = 0;: z2 v5 R- Y$ J1 y3 J2 @
        upp_dmaq_int_cut = 0;& `+ B) s7 \* N/ Z
        // fill in data
% [$ L& y( G: V        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! v) v- x& Q  x" p        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' g' n  U& r1 u* \2 @
  Q: ^. o! K' K& B        // wait send success0 Y, y9 L7 M, c
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 J" m5 b+ L8 }9 ^* W5 ~. n
# L1 e- N& u; k4 ~8 Q
        // make data node in free list
, _5 C* f% t* D        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. `2 D8 I; y" e/ y' W9 D        server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 A. i5 M0 P2 {9 o8 o* f  U    }
2 I. Y( z4 R' k4 \* r0 M    return true;3 E) h* s0 `- [- m+ Y, ?, T
}
6 B/ m0 ~0 U9 e% {! e
. j7 D' F4 P$ G, d: X; \

& J6 w) I* ]% Y" W4 L% X! R/ m
' Y) P1 U4 f+ N( J) s
. Z, J# _3 z' F3 w* n
) d$ ~2 {" Y8 ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐; o+ x- s5 |$ U5 t

4 _- F/ b! b! }# P' [% p1 C4 \

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 15:22 , Processed in 0.041663 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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