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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 x7 Q, i1 b$ O& X
9 t& {. s2 ?9 {, J* x2 F8 m问题描述:+ S# y; Y7 F- B5 I9 }
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; F% n; a; X1 k; m7 l# S7 `* p6 t. j( O2 _* T3 B. v
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 |  D5 e7 R4 i3 X/ q' k. R

) V+ p- A: O% y5 l" m6 Y" Q测试结果如下:  c5 W/ ~, p2 o% E% i" U
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ Z; O: c4 z  [( u, p7 P. f9 j4 A" W! `& v7 g9 V6 A

/ v% O; e$ U7 x9 f  D/ c9 a备注:
/ h; G6 b: `1 o* J1 ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 v7 c0 a" b8 r* N) E6 c5 s
2、相关代码如下:
5 c( `8 o; z; m9 Q1 U# L# e; }//UPP DMA缓冲大小512字节
, O# {: g6 g" V3 u  e* p) I#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' [/ m0 S1 R) h$ M  O7 K% I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. ~1 q! P: L3 i' z: H& a: ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 @* y7 o- _# ^
  n7 i4 z) M( p, O" Q$ e) ?, {6 t5 B4 t% i8 N' A. ~% N% x
//upp接收、发送buffer
) E% y1 Y/ G4 A  y8 V/ e#pragma DATA_ALIGN(upp_buffer_a, 8)" p& Y& o7 q% r3 h' ?( s/ P% ~
#pragma DATA_ALIGN(upp_buffer_b, 8)" J9 ^. x& r/ D+ Y0 W
' |9 X. G1 l. z2 {5 l
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 W& C3 f; \7 Y5 D2 w$ p2 u
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# W: n5 ]  l8 f, A2 W: W8 \
( `' c, C" ?9 x/ J5 x
1 N' b& I" n# u5 |% e$ \static bool server_upp_data_recv(Server *server)
7 w$ u9 h" W( B/ {{  K( T3 A" n+ a/ z( \3 M$ B  x
    if(server->upp_channel_a_recv == false) {
5 H' P: _: n- R' X, g2 c4 N        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& U8 n& X9 e2 F* ]( L        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 |7 m  X2 x+ S/ W" y/ ?* @. r
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 y8 U  E3 ?2 z! H) \3 R
: o; A3 u2 }7 V6 x
( D( u4 l% O5 D. U3 n- q! N            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 V( n/ R' Q" ^; c! T6 B

. X& w: o* Q6 n5 [: \4 V            server->upp_channel_a_recv = true;//
, x: ], x* p, G1 f            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);" j9 t, M* G" r: |9 L, q0 x
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;7 a: Y- U& O) ^5 X& X
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 S! C- g0 q/ }2 g) ?+ p            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! U1 T4 ^2 L( V: P1 b

2 J$ m9 _5 Z8 G            upp_error_count = 0;% q0 }5 t$ f  Y# g8 v
            upp_dmai_int_cut = 0;
5 }2 A7 j3 Q( ^4 L$ ]6 s' y( K
6 d9 R' ^, r* ?0 M            // fill in data ' W' X7 n% L0 P* M7 l
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. Y7 x: L5 [- c
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 S  i4 L2 u9 ^( c        }
% L2 m& K' ~1 m; ^    }
7 T! ~8 [( a- K    else{1 a" H# m* G$ A$ [& \
        if (upp_dmai_int_cut > 0){
7 J$ k9 N6 S  [' I0 k9 \7 z            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 k+ [9 m/ ^: V
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# U* z4 q  u1 l/ F8 P. u5 B! y4 P' v
) Q0 S5 Q1 g2 \7 }6 K3 y
) H5 F5 R+ M9 `, A7 h, W+ Q            //copy data to upp_recv_list_busy0 U" r9 T( I' ]5 v/ }; A4 T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! A( A& ], G  N' c$ r
: h  L* E' O. W5 G# P+ g/ v( `            //% q% ~9 e! a( t9 Y4 u
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: {- Z7 W2 f# \4 Q: E+ g, H4 O% Y9 J) b$ G+ I9 m7 ?
            //
: s2 _3 Q+ S- q, D7 E            server->upp_channel_a_recv = false;//7 b; Q( r  M1 y6 E. }
; j9 M0 r# `! ^3 ^* @. k9 o
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 P2 Q& s/ Q: i6 ]! e  a$ A        }. @  z1 k7 ?$ ]  c2 X3 m! h- r3 ?
    }, b. a5 U3 F- e

& e/ \5 q% t& a0 v5 X+ }3 @/ M5 T5 Q# U' T. w
    return true;; M* g# R, p4 q. Q
}
% o9 Z# C( r: M
2 B5 H' {$ x: A" _static bool server_upp_data_send(Server *server)
$ J  _6 F  B$ W# @$ e$ O. M, Y  ?, `{
& w% b# R6 O! ~0 N0 d: B    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% x$ O6 X( [. v9 J$ g2 h3 `* W/ H
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) l. ~. a# b2 s/ `
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 `; b7 L9 O0 I$ w9 t+ z
        char tmp[128] ={0};! @$ T  ^4 H/ f
3 _+ |  i! U9 p1 X6 i! S
        server_msg_send(server, APP_CMD_LOG, "upp send: start");$ e* X" \# F) M+ N' Z: x
        print_log(server, data, 64);) [" M. M$ [! ?6 d, e& m

- u$ P* E' c) V6 K        //2 L3 G% v& @; j+ {  [  w7 E
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& s- }! j0 y- `# u* T
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 V% G/ p! j6 q0 c$ Y) ~
        print_log(server, upp_buffer_b, 64);% z$ f7 j) M$ E' A

3 ^+ y) y$ U. `2 e' s( R8 P3 p        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" r, H) N* w$ y) G3 |' f$ H        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- k: N8 v' k/ K* X, f9 m% X0 ]        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ l0 U& w  q& o        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
8 M) {0 M# x! W8 A4 E3 }
) f' a6 j' y8 t        memset(tmp, 0, sizeof(tmp));
; X1 H/ n  w. v0 V! K) l) m. P( A        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % \7 w' n6 W- U# y9 \
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ X4 O# G9 q3 ^5 I9 F4 n
        server_msg_send(server, APP_CMD_LOG, tmp);8 N8 ]# K) Y% X
$ _7 Z7 j+ V8 c( @# r* @
        upp_error_count = 0;2 \4 H7 v6 Y' r" o; x8 L% E5 R
        upp_dmaq_int_cut = 0;
0 {& Q; ~2 j) o1 }        // fill in data   b% ~$ R& O3 r' O8 }
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ |. C  E+ a  ^7 ]9 Z        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
$ R  K2 H* J& O3 _- \
: h# ~7 Q7 y* m2 ^$ j% _" Q7 f        // wait send success/ a2 K. ^# X  a, [4 F  R$ ^/ Z% k
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 h' B2 I* j3 m; j

2 H; A/ F$ u. e* _        // make data node in free list
9 L8 d6 a- `, Q        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' u! b9 p* l& ~6 A3 |. Y6 n# }
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ T, {9 x  h6 d( E
    }  D# x0 Z, e! F  f6 R$ S$ q
    return true;2 q. c0 r9 n' z
}* T- W' [/ n& m
' R: T% _% O( |
1 e: ^0 p" ^5 Z
7 G( Z/ g+ _' `+ |* ^9 Z4 q

$ [5 L6 i' @* P, k0 O  \8 ^. O: l! L  x

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% [, _4 W2 F7 O2 s5 g) m
. E2 Z0 C/ L. `+ [; |6 b5 A

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 14:11 , Processed in 0.044723 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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