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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & v4 {- P5 F. H4 J$ N' @
0 {/ {! ?1 X. A# Z/ q
问题描述:
5 j" C9 |  e. E: i& @. a在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:# @* I0 e- t. Q, Y0 ?

* d1 z' v8 _8 a% [0 ], Y- k$ N图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 X+ z& v% K' v+ d

, m- P2 f6 W9 o( g, F4 M测试结果如下:3 A4 G5 H6 W# d% `8 P8 ]4 j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 l7 Z' u6 x5 [1 {- n# ?2 O
2 ]# _  b6 ^, z( j$ F$ v
' Q2 q) d' R5 ?2 J; E备注:
$ m7 x( W0 s; y1 i2 O/ Z" f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ h+ S* ~1 x2 c7 }
2、相关代码如下:" w" W( V0 p; F  P1 M; j8 L
//UPP DMA缓冲大小512字节
" k& K, @/ v8 I#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
% R* `" P6 s0 @. a- c& i8 U- e9 G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! x- X1 D4 I( r. G3 x, H% T# a
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 `, O+ K8 k( n9 T3 v1 \! R$ `

( f7 \! V9 f, F+ p5 F7 K) O( h* |3 s  g0 G- b
//upp接收、发送buffer( u/ I) Y2 X) K2 x% K, ?, N
#pragma DATA_ALIGN(upp_buffer_a, 8)
& }1 s3 ]( l% X. m2 w! R! C9 B#pragma DATA_ALIGN(upp_buffer_b, 8)
9 w; S( A8 ~' x. u* j% ?$ s1 r2 {- g7 j$ D
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];+ i+ l4 J" A5 j4 e1 b5 O
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  D7 s/ M0 @" k. P2 |+ `
% D6 V4 Z1 F. a) Q) M8 d$ q, W
3 `5 W) D; O: D9 O
static bool server_upp_data_recv(Server *server)
9 D- w% w" o4 z. J0 N" V" e{+ @; t# w7 Y: X
    if(server->upp_channel_a_recv == false) {
8 I' g3 e0 h" x+ y  e: T/ t: i9 g1 P        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! {  W8 S/ a+ N/ G        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 e- h/ T) {' @
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! x3 L6 a. t# q. u. E, i+ r
' Y1 u% j4 ?) U7 q* f5 ~; |4 P

: H$ {4 H' G* q* N& |- \            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
  }# Z" D3 `( P6 ?  T* a- Q9 p' [
            server->upp_channel_a_recv = true;//
5 k" |2 |7 \. w, J8 m# f0 A7 ]# p            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 d1 V# i1 S5 s9 K8 R            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
2 `8 v, C; R9 ^            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% _9 L7 O+ i+ r, X2 M
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 u$ h1 D# ~0 ?" L( o. a9 P9 E
+ e. J3 y/ Z0 j6 \( f            upp_error_count = 0;- b. }. l% O' @
            upp_dmai_int_cut = 0;/ t' q9 H5 a4 A, s- F) K/ H* Z: P
2 S$ b9 w5 {' I7 b$ e
            // fill in data
* r; I# f  \+ }            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 j* i5 v' ]6 ?& F" T( x- w: V8 l
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 k" z* m4 K8 V- {
        }. R5 N% B$ I( j' L, R/ l
    }
" A+ i- Q# w7 t9 F& w; D    else{
- J3 q5 |$ Z0 |4 u6 N/ e/ R9 o- t7 |/ p        if (upp_dmai_int_cut > 0){
. t8 g1 `+ b8 b2 ^- @& K. O: B6 W            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  n8 O) \: j+ N& D- W" i, _2 x            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 L4 I5 G" F" q6 ~4 P
8 s. ]! P4 k' \9 Q! r& X  J/ ?  w$ `
7 k. ~8 P- P, a+ x/ u% {
            //copy data to upp_recv_list_busy
" J( O0 y* m& y3 K# M, J: [            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
5 @5 C* Q1 Z+ ^7 _5 X' U# f8 k% P* W' ^
            //, q$ L. u  w9 c6 W! }$ f
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. Z  p: q7 |9 D
2 F) @$ p9 `! J0 Q
            //
" G0 B* Z- `& A2 v: O            server->upp_channel_a_recv = false;//
9 f7 Q# r9 n& ~4 k7 ]+ A6 r- |, y" `& h. N: r
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, s. P- [( ]4 s! d        }& N9 c7 |: D- M
    }  {% }" i  _$ F
! D/ T6 \/ Y9 g! p

6 |# y, \9 D6 e: }0 C# W  y    return true;
2 H! i2 j; S! C0 ]& ?}% T- J* w  T; O& D! e
$ d! _7 l$ @( N9 k, m. H) m
static bool server_upp_data_send(Server *server)
% g9 v9 [4 O9 U/ Q0 C8 B" \3 a{1 d7 X( C! j2 j; Q" w
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){5 J* x" b3 P7 F, @. P, Q+ X$ M
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 S. J9 h7 w) J2 l        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* E" a$ C0 R! v+ r- t        char tmp[128] ={0};
+ ]8 M) j* J# M% y
  N2 l# f: g* ^7 F" h) M7 m; u        server_msg_send(server, APP_CMD_LOG, "upp send: start");) n: D; c9 i6 ?; D+ ~5 Q
        print_log(server, data, 64);/ H* |( l) m- [- Q4 ]/ ~. a

' D0 V* n, k% m' X5 |4 [        //
8 E5 ~$ [" p9 d) v$ H        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. p2 h! s  N% d/ E$ {, q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);# n5 G& {/ x- ?1 K( T
        print_log(server, upp_buffer_b, 64);- U, @# T1 I! d4 b( I1 \8 g; X# W

4 H0 C  s% K) ]- y- b# a$ u2 c        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
: Q- t5 h' `$ S1 ^* z$ I5 K        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
5 Y) Z2 u; y) i' @! @1 I, u        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ O# Z1 t6 o& U: B8 b
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 v# o; r* J$ s' y* s, c+ Z+ B8 c* z5 f3 D. g3 i1 M/ k
        memset(tmp, 0, sizeof(tmp));
8 n9 }# r: C' G7 [# r0 _* L        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " j* Z; g$ H, ]: ~6 }5 _
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: ^; ~! E; C) q        server_msg_send(server, APP_CMD_LOG, tmp);
( M5 g6 d5 F( o8 J6 J" t9 l% B* C8 V- h* j; E4 n2 d% E
        upp_error_count = 0;
: K& V& V, G/ U& p' [; G% R2 y* `0 y        upp_dmaq_int_cut = 0;* O. G8 Z4 \9 }  Y, ?
        // fill in data # b$ z  e: X7 F5 @  s+ E1 k
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * @% x6 ]0 g2 Q/ K/ z- P
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 q3 V8 C! {3 {5 |, G, x+ P( r- f  f" \3 {/ p# H
        // wait send success
4 y2 Y4 ?- ~$ a. Y+ B        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & [  ?) @& k# ?6 N

: @7 u+ c5 G9 Q! \8 ^. y        // make data node in free list
& J0 }, l6 w' F# F" ~4 @: x2 Y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; T8 E  F7 D2 p  |3 ~/ \4 V        server_msg_send(server, APP_CMD_LOG, "upp send: success");( d9 Z$ S6 c' _% F" v0 U7 U' d
    }
* _1 w3 b8 L) |3 B    return true;8 M& S' n6 a( W  ~0 k
}
$ V% U( Q/ l9 F# o; ^+ l/ r1 j7 T7 D6 V5 u/ l$ G- C
" O; N, _  O5 M! z0 `3 V4 f

4 O- K5 Q8 z9 |1 S8 W9 p* z/ h
' H) X, H' G+ d9 q" A+ c! }# O7 C

& C# q% V. t4 |. x: K( q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- Y: [" d6 {+ @3 ~9 p* Y4 z$ W3 @3 E8 y; h

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-7 14:33 , Processed in 0.041783 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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