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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑   J1 }" e( Y- _/ ]! O0 v! ?
( X& ], j' N4 ]7 t$ S5 G) e$ D, Y
问题描述:4 l# t" d2 Q, c! o8 D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 }) @  i, _6 \. R' f* O* r5 K" a: @2 v
* d' d) w+ b3 `/ H; Q3 B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; H, V% t% Y/ i: L( _+ i3 J% ?% C3 s; E
测试结果如下:/ I  W5 D: [$ _
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ r* n0 s' f/ u" }

* N) d  p" S7 Z4 o6 L4 w4 s8 j
! W3 ^0 c$ c& U, P# P& G3 W# n8 e  Z备注:
7 D5 Z  F3 a" |$ `, U* `% f# s1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ U. ~% o" Q4 a$ v+ n! h
2、相关代码如下:
: `. G8 e: j( C3 c//UPP DMA缓冲大小512字节! Z; Q/ n6 [! m
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* _* H/ e( x6 y/ ^5 R* C0 r
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' v1 v  b7 k5 q; e8 a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ d7 `0 b8 F7 I9 ?9 P9 b( l+ ~7 E
. _# K2 z8 @" N# J: }5 A% C# b; A; H* d$ P- j! c  v5 F# o. \
//upp接收、发送buffer, z; S/ o2 }3 m% I8 X' ?
#pragma DATA_ALIGN(upp_buffer_a, 8)7 \/ A; O: M; k" `* H/ G
#pragma DATA_ALIGN(upp_buffer_b, 8). L$ a; o) S. X) h3 I- ~

; O! B* A4 z0 runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];- h8 o! V" `+ [$ \  w7 A
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 ]- e3 B# W0 c( N( e+ n) Z

8 Z# I' C% a# O  Q1 z/ M. n) v( h9 N* m) N
static bool server_upp_data_recv(Server *server)
/ f; E. k( r& i, T" H" X{
  P* P& D  q9 T; h1 W7 {    if(server->upp_channel_a_recv == false) {' d; I" `- f( D) Y8 e( |' z: m  K8 r
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% p$ t/ \' {0 |/ r6 j        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. s& E' n8 s0 D            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ Z& u$ Y  D# V. s' }# S4 ~

& m8 r% s% O# r! ]- u3 z; s* i: T  c1 r
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- \- P$ |  }5 u9 ?  W

4 o$ [* P( F4 @; L1 u5 [% V6 h            server->upp_channel_a_recv = true;//5 x* S. [2 B$ c1 }/ [4 Y. q- l
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- L$ e) J7 l5 `# M            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
6 G. J8 F; Y8 U) h& R% q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;, C9 M( {5 U! K7 Y& P+ K' b2 y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) f4 X; ~3 Z9 M2 y

; c5 E  i  S9 \            upp_error_count = 0;
0 b9 ^8 z- ^/ ]% X$ ]$ F            upp_dmai_int_cut = 0;/ r+ c# w- L3 y3 j# J, V& `+ o/ P
0 C$ v$ T( S- c+ q$ b4 e8 D
            // fill in data ) r7 G: s" }; z, e; r2 D
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  Q0 W; h% I! A. {
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, [- X4 Z( s1 |        }( o+ X( L/ j0 Z! i' h2 I9 N3 ~. A
    }
5 O& f" c& s' p/ B  f    else{
" C( O# H0 z+ k$ [        if (upp_dmai_int_cut > 0){6 l  ~3 }5 f, X& O4 @! q- a& q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
- j0 b" N# S4 `3 c            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- p& M& w" Z5 S+ V0 j) Z5 t
, C; R0 o% A# S; j
) e  r" s* n- i( Z2 k: X# I4 J5 N: B( q# c            //copy data to upp_recv_list_busy3 L2 z5 `$ f6 e, N2 W  f; K& e( i
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ @2 a1 l* p! N" h$ P4 T$ w
! F2 t& W$ |4 D$ E( Z
            //  T% S. i2 _1 B/ P) k. l
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& Y' B$ c" a7 Q6 n5 }/ Q8 n4 Z* \

! |0 C- b/ D. K+ v: L9 S            //
4 ~1 G( S+ T8 Z            server->upp_channel_a_recv = false;//0 k" S" v+ e! q# }# j! y

$ E+ T& j7 z7 b: r            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 c6 m3 Z# g3 ]* E; \6 R! \        }
6 z/ p6 V! H5 l/ ?. y8 ?    }
' `* n1 ^1 R% n
( a  v! U/ G% d0 ^, v/ r0 Q) ~  f& _
! n+ [* F# b% H/ l    return true;
- j- \/ G  w- T}- ~7 C  @$ |2 \5 y  W/ ~* Y
& C4 t8 j! n" a  _) P
static bool server_upp_data_send(Server *server)$ d% R9 L# f5 y; y& i$ ~
{
; r9 d1 L8 Q! \    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. C; D% R7 _: S% W' U! M        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ w) X$ y% g1 `" {$ A) U0 o7 J        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) s$ Z3 e( n/ K
        char tmp[128] ={0};
: q4 x; ]* I4 [# N4 r+ Q% W2 x( |  f' c0 m" }( a" L& @
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
6 ]% u3 k0 z: h: B8 {  [: y0 }        print_log(server, data, 64);
3 |4 }8 Q2 [$ O3 i& l7 M% E- F$ e5 a3 [# X, n; N
        //
, x& q, r4 e2 M/ h  D        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ d1 W$ w# s2 D. _% i7 M% H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& M- O1 _2 q& _) Y0 m
        print_log(server, upp_buffer_b, 64);
. R+ h1 [6 [- X/ g# A& h
, T' W- `- A" T+ N        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
; n1 G1 T7 y; C, k- {( {        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
, E1 h6 Y" D% R) r5 g2 X        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;5 z4 f/ P4 M+ [- r4 V% ~' ]
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
; B, b: G; Y5 |: T8 o7 q) N& M) r! A+ M/ T
        memset(tmp, 0, sizeof(tmp));
3 A4 h  B, j- R4 {% W* O/ l$ q        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; N! s! P4 b) O! }+ H4 l* U
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, _: e! O% A6 O# i: h( V        server_msg_send(server, APP_CMD_LOG, tmp);
9 v, T! ^  e  x
' Z8 h) S5 Z6 j- K8 f: G$ _8 o        upp_error_count = 0;9 W5 h/ k$ B3 }# B. E, \
        upp_dmaq_int_cut = 0;
2 C7 q- @4 ?! `        // fill in data 7 n7 d8 A4 m: ~) l
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 D; f6 G6 B& E        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 e4 Y* d) Z: G' W# k+ z1 d
" C  R7 Q- T6 I
        // wait send success
5 H$ h) Z4 p5 e8 t; _' b) v        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : I, e) {1 D7 C8 p) w  G
& y# q1 l3 x8 @) g4 m
        // make data node in free list : M. ]! c3 O4 b0 O- l# f- W
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. t. `9 b/ B; R8 v* M% s, {        server_msg_send(server, APP_CMD_LOG, "upp send: success");, A4 `/ j- [: Z) E! R
    }
  n6 Q9 a0 a9 J/ E, B  \5 n    return true;3 R; E! o; l: B: O& I
}' m$ D3 U8 r  a3 `
7 }! B: c* @3 A2 S, j( f3 q
( r/ O) g9 N9 _) r* c' N& B
" W9 b! _( K1 }! D
7 A6 e' m* K/ K: _

, M0 ~+ q" d+ k5 N

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 j( P$ J. I! t+ Q
7 s) ^% s' ^% b4 z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 20:35 , Processed in 0.040259 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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