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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 {3 L7 P# [) V& w( T

' O" i- x- N! S3 ^3 \$ V问题描述:; f8 `" E) A! B% |' _
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, \" A: P3 c) f5 }7 L% @. B" b8 N
5 \1 B1 z: W9 d) n. c8 Z; [9 Q# E3 a: p
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 {( C3 o% ^, V1 M  O4 H. W

2 H3 w8 k, l. J" r! v8 k% R测试结果如下:
2 n6 T$ P2 f/ R2 D; O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  l1 R, o; H, V: l& U- t+ d, b

3 \; Z3 F) q; ^
! W$ Y( S* B) ~6 ]( _备注:
: T& V. Q, _+ @. O; g1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! S' x+ `' l- t5 I3 ~5 ~9 }
2、相关代码如下:* |* ?/ E9 E4 v( o. P5 ?+ F5 c- Q
//UPP DMA缓冲大小512字节$ E7 X' N: l* }" d6 X
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 K* A& R' D. X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, O' B5 K8 Q1 t% Z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); g- p6 w* v* D5 u- Q- z

+ \' \, n0 K& C2 R! f
5 k6 Z5 S2 L6 I4 o' n' d+ n, V//upp接收、发送buffer
- c2 U6 b' z( K/ h  F. Y#pragma DATA_ALIGN(upp_buffer_a, 8)+ x6 {. F( n, R& P% |
#pragma DATA_ALIGN(upp_buffer_b, 8)* m- F2 e+ G; ?
8 a4 s- I+ c' e' X9 ]9 @$ T
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 e- R/ `, H' R4 ], P
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; E! Y, G1 a5 [' s7 T" j/ a
& Z& R# \' M8 ?( v) `3 V' F& F, l6 H% Y5 S5 m7 g
static bool server_upp_data_recv(Server *server) 8 d7 P; K3 E! k2 t& V! C3 z3 B
{
1 H+ f  Y) Z- c# g* Y' g+ C    if(server->upp_channel_a_recv == false) {
7 j5 X& ]+ T3 w# b        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, J1 ~; |) L+ U: R$ V        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 a, g3 l# H; ?2 ?* f
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 ~* t1 Y+ ?: N. A; V5 [( a
/ o2 c3 E9 x# f4 O, ?9 L5 s% w6 W
  L( a# z5 Q) o            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 c0 {( M  H% K6 `+ ]) v
$ L) E# d( R; i
            server->upp_channel_a_recv = true;//1 D1 }% i5 h% _3 w$ t  B$ h6 D5 p, ^3 ?
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
  X; E4 T7 T  m, a; ~            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;% k- W1 z; `: x4 L2 O
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
$ ~5 X; }$ @6 K+ b: ~' ~6 u) @            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 C7 I; R3 N* }. s- ]5 t6 T. S
  q7 q! F. B  Z
            upp_error_count = 0;
. K/ b* I' g% m8 f4 _/ d0 Z            upp_dmai_int_cut = 0;, ?8 B' o5 B) S

' B# Z+ F9 ]% g  o5 b) x            // fill in data
) S% z5 H4 @+ V# T- C            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 |# S4 E" b& r: I3 R
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: t5 y" I# p& C5 L! B5 B        }1 q8 K0 I4 F% J& R( O1 U( f8 z
    }. m# a3 j7 d4 t+ p) Y* C  f
    else{( Z# _( Q& v8 Y; y$ w8 j
        if (upp_dmai_int_cut > 0){
, x; x& v4 D* X1 U            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ ?5 S7 @( S, s, R1 H            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 b; E4 ~! I9 D# S& C: V  @
5 D1 T. G7 w9 o; ^& l2 T/ Q( v4 u

: Y9 Z1 }. m3 v6 j9 t6 \6 G9 B0 g- H            //copy data to upp_recv_list_busy
9 H2 Z- c. d: C6 @8 H9 S$ n' _! o            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* d  b+ l4 w. K$ }" a/ R7 T  l; f( R
6 O4 P, A/ W1 l% Z
            //' B: s1 ?" Z( z9 y9 p2 h: U
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& W1 p. l+ K; {& Z- \  I% N6 Z

( E( s! q  m4 y; d! M            //+ k2 T" r: W2 q) v
            server->upp_channel_a_recv = false;//( d- ?1 U% [$ O
3 h" [. w2 Y1 w  i
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");# m; A# v# c; g, E& o
        }
1 R' I, V5 A& Q9 t* C; |( d    }) P0 X- c( l# A" Z
; e& P! W0 y5 l  U1 `3 Z
  P" k; V7 |* k$ O
    return true;
% Q. m' w+ @+ A- Z( d( D}
# _# s6 c1 h+ Y: i) J7 u) \8 U, v9 B" [! a
static bool server_upp_data_send(Server *server)7 g% E  @) Q; f
{
2 q8 S* y  o3 J) u5 X- b( ~+ z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' h3 ]4 D6 M  g, {/ R
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* b& u, @9 X/ L" t$ O- N* a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) t+ d4 D1 n! P: [
        char tmp[128] ={0};4 c$ u( {7 H9 p' u" O
9 M* W& p. F: h. I  U. h
        server_msg_send(server, APP_CMD_LOG, "upp send: start");& }- W/ K8 L1 N' J  k9 P$ Y6 X
        print_log(server, data, 64);
, J* w% |5 b7 g3 x$ r- h1 E) C
' U: h, S( n+ s  _* G        //& e3 _* u% B, m4 E6 y
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ q  V- X/ t8 J9 V8 H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; n0 T9 O9 L/ g2 x        print_log(server, upp_buffer_b, 64);
3 \: a! t+ K: f+ H3 S/ W& q+ |2 `( \% x5 Y; \/ S. S+ |
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);8 ]/ @) R& z; ]
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 7 b; b9 }% v. o# u
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ R7 W" n; n7 s7 C( p: k/ Y        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 L, z% R9 p2 W+ y) ]1 D. v5 X( R) H% N/ ]9 G
        memset(tmp, 0, sizeof(tmp));- H2 I5 f( c& t0 X' c/ `
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' D2 R( S" D  ~2 S& Y5 `) r1 e            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ n9 `/ G4 u2 N        server_msg_send(server, APP_CMD_LOG, tmp);
+ L1 A, j, T# G' K7 l" k6 L
7 Q8 n6 @* Q# I: J0 @) ^$ C7 M        upp_error_count = 0;
% I$ \- c6 K& i, _/ u        upp_dmaq_int_cut = 0;
7 A7 s6 F- P  z4 q/ k& E: Z        // fill in data
- V8 ^; t0 v1 c. ?& [+ P4 m        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - e# d7 A- m9 q0 }% Q
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' S+ \1 p% j' P7 ~: {! f+ `
1 ~6 X- t6 M% B$ S% {        // wait send success: B4 c! Z  T& n8 K' \  e( I6 a6 t$ F
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 M: I' M+ ~- A6 W* ~  d5 L
+ @; |. `/ X9 g2 H6 e7 G
        // make data node in free list / ?$ v0 J  P0 J7 g" g
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 H4 }; t& G% d0 u" G
        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 y; i6 f/ N  g8 }& K1 g8 I: ?3 |/ u
    }3 W; T1 d2 w* ]
    return true;' C! a& l- p& _( C) H
}
' M; |& R7 R. a' k0 X1 W
! X; `% s3 Q6 B' ?" u
9 e/ J+ r- K/ T5 O8 v4 u
; f" O$ p5 q1 F5 q' @- k% k7 e
' D* w  f4 @$ X6 G4 Y
$ E) y% {; d: E) m- \

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐8 X: n) ]( y; O5 z  T% Y5 d

2 ]! n5 c3 u% E4 V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 17:10 , Processed in 0.042803 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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