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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" X6 @; ]; y6 m/ R4 S9 \& m/ s. Q/ ^
问题描述:, c" A; X2 R% c7 L8 X
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( {5 R  \" }& P+ r; t# t

: p$ f1 t2 Z# C- D图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- B1 h3 ?' B" z1 I  o. t" D
1 ?; k7 t& o% R% l/ \7 i测试结果如下:% O2 A' T9 x- l! K0 Y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ c( _* [) H5 R0 Z: G! m
2 V+ D+ [& s' u$ ]. K# {" l+ t4 `, A" ]0 H3 [- z" R
备注:
, T; g+ Y3 ^. _6 l6 ]" z9 g1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ S0 o$ A8 I+ i! g& U) U/ h
2、相关代码如下:1 l( o$ O1 M% V1 t' L8 q' ]
//UPP DMA缓冲大小512字节0 H5 i- B* Y1 K
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) K& ^/ X2 ?0 y* C
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( U# s. W) M% @  ]% V( q#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& X( a' Z! V3 l" D4 }* |& o

& d" D) R+ {2 D% z( o7 P' i: R, O: o8 w: a
//upp接收、发送buffer0 n# J6 k# S  s: H* Y) Z; D9 }
#pragma DATA_ALIGN(upp_buffer_a, 8)
  _' g! b! ^& J$ U8 B#pragma DATA_ALIGN(upp_buffer_b, 8)/ @& a  w* M# L9 s
3 f! n2 a3 ~; y/ Y& r" p6 \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. n! H  x$ z3 {; [% Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& S2 @. H& E* r9 p. ?. g+ F: s

# L8 G. S) p( R) a8 J1 u8 _9 ]$ {
' Q4 Y+ i$ O+ Y! A6 n2 i" }: R; ostatic bool server_upp_data_recv(Server *server)
" A# ^% Q4 L' u$ c{! A6 l, ^( K) g1 x9 Q! F
    if(server->upp_channel_a_recv == false) {( I4 m, Q3 V" P6 W% n% w* h
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");) j  C% O' g* Y8 |$ X+ n
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 d5 a: T: |2 g; `7 R            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 B% s8 u& ?! n* G0 t9 B0 C- J4 I7 \& d. ^
( @8 e6 a& i, B+ z% ]
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ M9 O3 u" u& ]
+ y, O  f" a& }" V$ g            server->upp_channel_a_recv = true;//
) l# E8 P5 p# I! B* a            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
; d) Y9 m2 N: l* y! @  S            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;6 X7 q7 l# x4 E2 i9 x' q
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;7 x. H! F$ Y7 v6 }9 W2 ^' a
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
  P) P9 |- n. T4 z4 J, ]0 w+ a% `8 q/ I& Q! g3 W; n# _5 k
            upp_error_count = 0;
$ e5 T7 P8 W/ [) C1 Z( @8 t7 t            upp_dmai_int_cut = 0;. v) V3 J$ m: N$ M5 S: o0 Y
* A  E! W  ?8 O
            // fill in data - C" m3 l# L0 K" X( m0 i) p& S
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- R, k4 ?: j# g3 h* Q. J: P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. a: e0 Q3 B+ N7 Y2 G' B        }
4 g+ W' F- W- _) ]/ B    }  h/ `  a) L# q* Q
    else{
# L6 U# i5 t0 `( }        if (upp_dmai_int_cut > 0){
' [4 o: \6 @: a. p6 h9 _. {7 u            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 K& _# p8 P& e% m) F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: b0 T* W" H$ u, M9 F8 ^' r$ h. w% G+ W2 y; U1 {3 o

+ Q" m$ |3 s" C2 e1 A1 G2 |6 A            //copy data to upp_recv_list_busy5 V; T+ c: s( p+ J4 }% ?
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
5 L2 s& |6 _8 Q: L, P  U7 D$ C% x6 `+ q/ c) o- @( U
            //
) @5 d& a2 e8 v% n0 p) ^, `            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. Q5 D; A; m' a" x
8 w6 ~% `" t5 D$ M# ?0 Q+ d            //% ~' W& I% w2 j& Q5 r
            server->upp_channel_a_recv = false;//
7 R7 @! l1 x1 S6 D/ F( s5 \4 g1 Q1 F, o, u( k% g
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* ^2 f4 H8 n: c. Z; O8 b        }. ~3 W# A9 ~4 `( g
    }
0 K+ z1 r! \" q* V
0 q3 W( n: D# h  A1 d' A1 F
, t0 V4 c( Q; X  d9 L    return true;, R$ Q: \3 [; h9 ]* K8 p
}
! E+ H! S3 Q9 K; S6 \) @
' F1 T' b. V  z) Dstatic bool server_upp_data_send(Server *server)
) Z: u( n. e0 }9 a2 L) r1 X{
) f( f2 b8 Z/ k- v1 x    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 }2 I# |4 J9 c        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
0 a" F( U! \. G* T2 }/ Y2 G        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% r/ _$ y0 Y: n5 p: M
        char tmp[128] ={0};$ t& ~; H- o: v' w
; t8 @% m, h( e5 e7 a  m( F
        server_msg_send(server, APP_CMD_LOG, "upp send: start");* I$ F7 E' A% f. B3 T3 B' d: f
        print_log(server, data, 64);; ^; `; ]7 S; {* K& `0 s

/ X) @' w* I! M& f  Z/ D        //
0 d" e% [  [& X6 x3 v        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; g1 ?! l0 p: T  [        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 L4 C" |! `7 B: D
        print_log(server, upp_buffer_b, 64);
3 R5 v, u8 l8 k! v
7 H5 k$ F/ O9 X9 _( P3 b" U2 y' Y        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& r" Q: W: q# S! f6 C( Z        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
' {1 N! e3 F( m* P0 G        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
% b. K7 x8 X+ d, r9 T$ U* g        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 M/ v2 r, Q* j( q: i4 X! x. G

' D0 O' W+ y1 y% ]: R0 n9 `        memset(tmp, 0, sizeof(tmp));
" O  ?+ _4 F" a+ m* K        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! L& Q$ N$ D4 q5 D+ _
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! I. ]/ Z9 r6 S1 t! X1 N5 E
        server_msg_send(server, APP_CMD_LOG, tmp);) `* @: }. [3 e5 g% y9 q4 X
9 I' d, I# O8 A2 t) @
        upp_error_count = 0;
) I  u' Z* g3 {, d. B        upp_dmaq_int_cut = 0;: S: R. l! I2 U# V8 }6 O& a6 f
        // fill in data 1 s# l3 F# \0 f0 t  l
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   [8 H! L8 s! A3 c% V
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, q/ S+ A" N  }2 I. r( X" O# ]8 f! j
        // wait send success% K  E& v5 q1 i/ K5 l" r
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 H- l. L7 e4 O. d8 t& H2 {

7 ^5 g% ~+ X4 j. p% M  P        // make data node in free list 9 v' F5 C) Z4 A% ~/ Q; ?3 X4 k
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
6 j, V% X6 w5 n, f& X0 i$ W# V. q2 ^        server_msg_send(server, APP_CMD_LOG, "upp send: success");# o4 q1 l3 D. s# f% L( b0 H
    }- R$ v# n) y( t
    return true;/ X# O! e& m, w3 @
}; C6 u$ m( ^, W1 v9 g2 X
4 T- }  J( G8 |& i9 B: y% r/ j

. x2 k; E0 f# \" g) M6 l8 C% G% W' ]1 q6 ]$ i
0 s  k. Q0 L: x
/ E# A& x# A$ t$ U/ k0 w( Q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
' e5 [5 p! L& a9 P, p4 z( W$ O7 _9 g; t8 Q" G, f. B

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 13:50 , Processed in 0.040433 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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