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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
; t" ~/ A3 j$ k8 B. F4 e$ c. @/ U7 a; Z9 s: D5 X, M1 e1 r8 s
问题描述:
) ^; V( W7 l4 d在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:1 S8 h8 g5 h8 Q# A% [: }3 l  g
- j0 H8 b" Z- R/ w* t4 I
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 }1 H0 u) j- e. l+ L& v2 G
9 Z4 X* H  _, A4 `
测试结果如下:
/ k( L8 @& h8 L7 d9 F& X138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
* x" M7 p( r5 u6 W$ z: b7 \1 O7 u, x

7 I. ^  h" o3 }, F! k备注:4 L% ?+ e* r0 I
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* f- G' l) L1 C% o
2、相关代码如下:
- k9 w  g( ?- X2 A4 u//UPP DMA缓冲大小512字节
& l3 Y3 [( r5 Y4 }: [1 |4 G8 [- F+ ~#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! @$ i* _/ Y( u: f; T7 ]3 u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( x( p# {' g3 \, y% j#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 H( r) K2 }- ^4 b$ ~5 O3 `3 n/ ^; D; v* S8 O; a1 w% [/ [! [( \& g

5 ^' j, `; n8 {8 R. Q8 a  J//upp接收、发送buffer/ J; o3 y* U3 E, @) S; S
#pragma DATA_ALIGN(upp_buffer_a, 8)
( M5 {8 I) V( z#pragma DATA_ALIGN(upp_buffer_b, 8)$ t4 b1 i8 p: c$ o5 p
3 C% D; H$ L! z4 A( {* J5 V
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! {! b8 q: C8 r$ Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ |: X8 N9 J3 V' v+ t$ k: g$ g

# Q& j* ^; x1 n( K: i& W. {$ I' t, k0 j6 g* j2 ]! c
static bool server_upp_data_recv(Server *server) 5 z! V0 Y6 t6 x
{
+ r& b4 ?) @% ?. L3 i( J    if(server->upp_channel_a_recv == false) {
. j# L$ G7 N$ @  d        server_msg_send(server, APP_CMD_LOG, "upp recv: start");, w  ?2 Z; o2 a% \6 @
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: `% E6 P/ R) O* ]            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( Z( h( d+ f6 h

8 |8 K$ {. l* i& ?( a
! F; C+ I$ T# ?            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 R1 {& j' }4 n- j" Q6 c& l/ b3 a0 ]0 O0 ~- y  s) ^. ]5 x- L" G4 g, A
            server->upp_channel_a_recv = true;//
6 v# Z4 k2 l+ y( y, [! `            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
+ O& k8 \: Z4 f1 O/ d, @* W            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;/ R+ N6 p! ?7 T' m9 @! X( F9 x
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
6 K7 Z9 F) \, S            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
  L# u( t# B+ S* ^& v! Y4 Z
2 a5 p- M% q# C, q( G6 S            upp_error_count = 0;
! R8 e7 x% h$ g7 h% f' d            upp_dmai_int_cut = 0;2 y& U. n. W& a; F

6 Y5 D  H& ~6 r5 V* q            // fill in data
+ d* }8 d  U. C# A  O            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* h, ?/ P: g2 {6 W
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! n# b) ~) ]2 v
        }
: w+ }) Z! s( F" Z! k/ Z* T$ j    }
' b7 ^& K6 q. y  F: J: H    else{
/ E/ ^! I8 k' I7 F/ N- T# R        if (upp_dmai_int_cut > 0){0 {, m# L; @( d, A
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 t# l* k& v& {- J9 V. `5 H            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( V$ ^8 W  e. V7 G# K/ U/ a: n7 P* M. ?7 e# @% O

9 Q3 m, g/ [8 P- W% h' O% h            //copy data to upp_recv_list_busy- P! ]- o' [* D* p" T0 u+ T5 i
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);( L$ n) _4 D9 [  r/ p
2 m# y: h$ O$ v6 I, |3 X
            //8 r! U' `# h6 [6 b# O! M1 F1 T; I
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* P, a! F/ c( @
* v8 L4 n3 z8 H  G- t            //( H9 g% v1 `, o! b1 {+ b
            server->upp_channel_a_recv = false;//$ V! u' D: k: ~4 g* v4 {/ _8 l/ ^9 ~. i
& \& D; C; c% [+ a9 O
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: F0 ^6 v/ @1 W8 c        }
3 N9 a/ l, R: l2 `( ~% t    }
+ v" ~% L9 n/ h: a/ b. a4 d( n1 ?& e4 e

, u/ E+ G4 Y6 ?$ r$ @    return true;5 i$ A% j' X( m  {) y
}! Y! @  A( a  d- O6 p- ?! \! y
- @1 L% O& |; M, P% Y$ f
static bool server_upp_data_send(Server *server). ]( s+ u# o/ }6 S3 R, v
{$ [2 |  Z3 s& Z) m, |
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* N* b. i( h2 @, k1 f' `6 p/ @% W
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  `! w, m; K8 O! s2 t( P
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
  R1 T( v$ A/ i/ d+ g        char tmp[128] ={0};
  P, k) e/ X/ }) j2 ]
) T) I# i  |1 s4 `' C  H        server_msg_send(server, APP_CMD_LOG, "upp send: start");% S' h* _- ^7 _! s5 p- @
        print_log(server, data, 64);, B) D) g9 N& ?4 u9 |% l
. Y, }8 m$ G0 Y8 C6 k5 v1 L5 m' U# ~
        //: ^8 v" `( u8 z0 S. ~
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, z" s4 H9 v  T' T
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( R8 D$ a! m6 O# C
        print_log(server, upp_buffer_b, 64);2 T' x6 ]/ n# g  N* @* P: Q
4 D/ T& q2 v4 J2 l' |
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);- H% \3 L: z* j7 u0 Y
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
* j% E5 H/ Y. a4 C) u8 H        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;( J" J/ @2 G) v8 J5 q
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 B8 X- O4 c! n+ X/ I# @
0 d- b% a* y3 J% y1 N) a        memset(tmp, 0, sizeof(tmp));
3 `/ v/ B; Z7 o/ o5 L6 V9 p        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # X" f& b- P6 j/ N
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, B' X  |& \/ z0 N! U8 u
        server_msg_send(server, APP_CMD_LOG, tmp);% v# Y1 ~6 {! @0 a" s
' ?, i# ^1 B6 ]# h2 p: ]
        upp_error_count = 0;
$ I. N  D8 _1 @6 y# m        upp_dmaq_int_cut = 0;- @0 w- g3 i: m7 |# C9 o! k
        // fill in data 7 K4 |; E& p% A, ?
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : ]% ~) s2 Y+ y' R0 P
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 J9 g$ ]2 Z' ~1 b4 G* P0 R! ]3 e! N. G5 M/ F, y
        // wait send success
* c( F( z! ^+ `        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   @, p8 H4 ?5 Q7 o- \! v

* A; w  j# G1 M/ v! x2 `        // make data node in free list : D) z" M4 z; g+ Y3 U) c
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% G" Z) y2 x, \2 Z* K        server_msg_send(server, APP_CMD_LOG, "upp send: success");# }$ B, Y% U4 j
    }
+ U$ M3 C! Z+ ~" U    return true;
, r; N7 N% S6 c/ O8 i}
% Z  j# j: C7 _" g) C3 P' v9 {  E+ g$ E& {( a" `) }* @
- S, p1 |; E* K1 }

3 N2 `& Z" i  c$ p% ^: z
2 W5 S" F. h1 \% A  N
) H" k' o- S4 w* O! q' f5 k2 l% ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* z( h1 g# ]+ ?2 G$ u9 \9 J* D

+ `- y$ R7 B* |

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-21 10:09 , Processed in 0.046768 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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