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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 r. W% e" D  X) `7 c* {5 H! b% |
0 C6 }2 a- l( e3 t问题描述:+ J; \9 w( Q; T2 `. M3 r( u
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ v& h: d) u( D3 N' K6 E7 w1 ~- A9 C
+ u0 ^, p' ^; M7 o
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 x& L: A9 f$ S* v' d% P  [5 q; i( W8 G5 e) h
测试结果如下:
0 H+ j  b6 N' C2 `( s# m138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. B4 D7 \- C# @( }, K+ H7 p7 L$ d) ~; A4 E8 M
" v5 I5 U. N- D. l+ W/ ?
备注:( Y( w$ Q9 j9 Y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 L! t0 y, s# }- n0 p7 @
2、相关代码如下:
0 R# L: e7 H* V//UPP DMA缓冲大小512字节
9 ~" P0 Y7 t) k' D#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) C8 q6 U, c$ Z" I& [
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! g% t/ c6 S/ a5 X# {* B. `
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)) p9 }7 f; K) d6 b) |/ O& J, Z. l

/ _0 n. e& {6 W* j* X
8 I0 i" @# W- m5 U' l0 N//upp接收、发送buffer) M; O. ^& \9 @, y- \0 a
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 ?& J7 R' o) m& M8 L. d. j- P#pragma DATA_ALIGN(upp_buffer_b, 8)# R/ F! J+ K+ A& T' X

; Q- Y  [% @5 s1 \3 Ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 {+ `! F/ v' R# G7 `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];' `$ I: d6 C3 @. h

1 w. C; E; o7 y" ~5 G9 g
+ F4 g* W4 T& z& y. `5 {static bool server_upp_data_recv(Server *server) 9 H3 }, Y  M# V: n8 \
{' q+ |% C; u0 K; x1 k
    if(server->upp_channel_a_recv == false) {
- ?; Z& T/ E( {8 x6 J, i$ b) l        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: ?! S! w5 G7 ^2 n; \9 \, M. n
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: \2 Y: f- e1 C$ l0 e
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. s$ Z0 @* w0 n; q2 x, I
) U! p# Y6 O) f8 s1 T7 T
$ N6 D6 e- ^1 }# K7 r8 E) z            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 u8 _( p; p0 e, @5 R, m9 X
, W% R( T* o9 Q: q9 O* T; D            server->upp_channel_a_recv = true;//. c" y4 s/ g! u$ @7 s8 l$ R
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);& V7 w, j2 ?; F- q( d) _
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
3 y$ h: f6 J9 {9 K" D" g0 |            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
* j- S) N- R& y2 n9 A            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: P( a/ u' A' v6 |" D9 s( C0 Z% ]0 a8 P
            upp_error_count = 0;
0 K" j' D: l! [) q            upp_dmai_int_cut = 0;
# M7 {0 T( P( W& L
7 X& @" v# }/ P4 y" R. X            // fill in data # R9 G8 x4 H6 e7 L% c0 m
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, H( s5 F* @7 P: T2 v9 ~; \) n            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- f' {) K3 U1 t6 z
        }
! m6 d1 a7 w# Y  f5 k    }
5 |: D) v! [8 w    else{
' j% R5 i; W) q3 A" T        if (upp_dmai_int_cut > 0){
/ ?9 K4 x) M4 ?& _: c# y6 b' E            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, t5 P3 _5 F- A
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ n0 G. g5 E8 q; W) L9 K+ ~6 m8 X5 X; b: B0 c) a
- m( P- L( r* W/ {' r) A* f
            //copy data to upp_recv_list_busy
2 e1 J3 ]7 E$ k            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 |8 o# G" i" H% f9 {/ {
) u& j' N1 i8 f" Q
            //
5 ?5 Y: J$ l0 \. n' b3 T  \            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( l( P8 P) J6 {0 ^6 [" O/ S

6 z6 h- F" h/ m  d" @: F. M            //: x% F0 R  }2 T
            server->upp_channel_a_recv = false;//
0 K4 Q5 Y# ~! l* d& [/ d. s- A6 z  z6 V; k3 S$ O
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' w4 Y1 g, [9 k3 P
        }
( O. G& S* _" m' F9 A    }
% `1 u3 Q& l1 t' V. {
; a, y( Q  p; T+ ]+ s3 i
. }* ]0 A# S0 D& C& D    return true;+ }" U# c8 j+ ^0 I/ O; [+ j1 b# g7 n
}5 _2 Z1 ?( \0 V

  p6 R( X3 X0 cstatic bool server_upp_data_send(Server *server)
8 _0 h  [$ S- K/ S1 f{
! K) Y7 R' i8 J# o2 y& h4 F+ Q    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' @* ~! i! E' P& i) S( Z0 `8 ]
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
0 ?# X# y9 |# @3 b8 `        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) m8 V( e' `. v6 w- Y& Z/ `        char tmp[128] ={0};
6 b9 P. c& f  D% V2 ]0 o+ G" x1 {  _; T( G# ^3 J, b
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
- o# J2 C/ B. `& n9 i1 L1 T% O4 r        print_log(server, data, 64);, I; U* p- W! v3 ?" M

; T. o" j, t. b8 v2 P' Z        //1 H  g, n- \8 X7 |0 ?4 w
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 Q; b9 c* f7 a        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: r5 A0 e' C* {- Q        print_log(server, upp_buffer_b, 64);) a& [% U# ?3 `- |; T. G' N
; r' x* o$ C# p  E/ V( W! B
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
7 C" I- ?5 s7 ^' H3 U0 h" |        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  n7 C! c( z+ G# T2 P        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
  I- |4 n9 y5 Y, O" \% A        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( f: w( ?7 T: S) x! f6 S+ O! P# g, h1 e5 r
        memset(tmp, 0, sizeof(tmp));' s% u7 o, i. a# L$ k  x# K
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 z+ F& G+ h3 h, Q, [- g% ?6 S1 F
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( I) [9 L) ]8 M& `) S* p" b9 o8 @$ Z        server_msg_send(server, APP_CMD_LOG, tmp);0 n" d: i* c. m! C6 ^

  l* Q6 x+ t- N$ x- o: m; q        upp_error_count = 0;6 l# j" B  e' X
        upp_dmaq_int_cut = 0;4 M( f# F' F  q$ O7 J* i
        // fill in data
" {) p9 {1 ]8 ]        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) ?$ F5 Y: e1 g$ [3 E: I        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
; ?6 v2 y9 \7 n6 Z( b; `
9 ^1 t6 f' G; s: {        // wait send success
' S) T. x2 O1 \* D6 X        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : O# _) h* _9 F  C& `/ @

- j. P3 b; Q# P. V& h7 C        // make data node in free list # N  R( \1 m  n  ^
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ k% c$ o3 F9 x$ ~
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
$ {! J" r* F! ~4 r    }7 `0 }, f; p) ]5 H' d- @: t  W
    return true;' l6 L) `2 |( Z
}  k) y# u6 r1 U- @
+ P  a6 }* ~: U) H
4 f  a3 _' b1 Q% R+ S
( C' G, `* i3 o5 ^+ b' h0 ?( S

8 v0 N4 S5 Z' N7 J+ L: y& l' V: m0 {# O' d4 y  V

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐! \+ _: x8 X2 Z
6 m' z2 E# v2 N. i( P% U( E3 c

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 13:57 , Processed in 0.037574 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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