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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" |( o7 A7 H2 F- J0 s( v0 P0 U+ m0 y* T% S$ t8 M7 |4 R$ D
问题描述:
+ t4 Y- G9 Y/ T+ x; }$ O在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( h- L* g4 B, u/ m1 |% X

5 e+ T4 M' c/ u' f2 f& {+ X0 h图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; C2 Y6 {, T9 v
& s# F- R. A7 W) [0 n
测试结果如下:% J# e0 R8 ^2 K
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 ?0 d8 K9 d7 I8 o; z* m
! S' R7 q" G% Y) e
1 e3 A2 ~6 O7 T4 r+ K# o! }, Z
备注:
8 t& o3 O, U4 d* X, b4 F1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
  Y8 `  @2 w  a% S
2、相关代码如下:0 u3 y3 G9 J( j* N4 K
//UPP DMA缓冲大小512字节
% K  q, g# z; D#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 I* a9 N, w0 g0 {) Q* W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ \6 l9 O- _: D' e0 f! X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# \9 v* N; C& |, j" n

' v% G# G9 ]+ C& X, F
% W  P) f# E- C//upp接收、发送buffer+ C" n/ k) y. y# L: F6 V$ t
#pragma DATA_ALIGN(upp_buffer_a, 8)6 ?1 R; X0 [2 w, K
#pragma DATA_ALIGN(upp_buffer_b, 8)
) |2 c# C# h0 W% g2 |6 G' U
# X; Z1 x, T. Y, n3 D4 Q7 E6 {# funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];2 ?( ~  t- g- h9 ?2 r( |
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# d+ `) v+ u! _5 t9 U  A& n6 V- H$ \/ q2 q

' o* n9 E3 t$ V8 c8 _static bool server_upp_data_recv(Server *server) 4 W) b; b6 v$ H: k
{
. d# V3 n5 _2 e/ K    if(server->upp_channel_a_recv == false) {
2 k. d: |. h* k) I8 E+ G9 _, p- C        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& g' U4 F0 d" v! Q4 N6 J& r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! R; V+ \# y0 \8 K  Z  o' N8 N            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. B" g( n$ u- ~: Q& J) y  a7 j7 c! C& \

7 X3 h% y' o6 V$ }1 i: }            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 f1 n' m$ i1 n! E% Q' a9 N6 d. n* C1 }' i' r: B; E3 P) h! N
            server->upp_channel_a_recv = true;//1 G6 V& _# T  m) m  L0 ^2 a
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);1 p, b* ^* ~% t' J
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ \* a) Q* K- z( Y/ \+ I; A8 a            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
/ B! x! ]% e! \: x! a! n            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 g8 r! N$ }+ b! i; \& e0 j& r: m3 H0 O% D/ A# w1 l
            upp_error_count = 0;' C3 `! ~# C$ `0 Z& t4 @
            upp_dmai_int_cut = 0;
8 }+ J0 E$ ?4 {: ~& W# W0 k/ N2 ~# U9 s* w8 U
            // fill in data " E6 r. a- J) w! A* K" U
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ i& }9 H5 K. I. y" |            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# @2 {% X/ S% w7 R  ]: {7 O; j        }
6 I$ {) L5 B* t1 F! d8 z    }' G3 {' m  v6 Y& x6 ^
    else{
8 }; Q4 j5 ?3 q4 D. a        if (upp_dmai_int_cut > 0){
/ q; m  E1 U7 a; y& d/ c" k4 c            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ C2 z/ z- c* j9 W9 h
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 Y6 e) c$ a" _# a
" v5 p  e; S$ |) |$ s. y8 Y& c4 ]" }

) U" N3 w  P" F            //copy data to upp_recv_list_busy
% c# u* h/ \' h0 g) u            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
/ Y1 T, C" {6 b
. R: j) C# u; g( ]            //
$ X6 W  I7 }, w% q, j            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' F/ [- g5 D3 s/ ]7 i% d8 A

- W8 Y) y0 W/ E. s            //, o% @4 `7 L$ s+ A: ]9 y
            server->upp_channel_a_recv = false;//9 W; `+ `8 K8 j- Z* s/ P9 V
4 u: w  M3 P- s+ I
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
  f$ E; B' V$ ~" S        }  o4 E; r' S9 _$ q9 v
    }* v6 o; e" q" i
$ D1 o1 ?/ ]' h2 x3 p) w; K, S+ ~! o

' V/ S! }8 ]2 H) A    return true;
2 {& ]3 p6 m8 y; |}
8 {" f: y& V6 }* `5 J+ C4 M% \: K
4 Q# ?: \8 L5 }7 Q, hstatic bool server_upp_data_send(Server *server)+ q2 e* I1 ^3 ~; C1 E3 F9 l8 r- J( `
{' F! R$ Y! P8 K
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){/ b; v. t: X4 F3 i$ N
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 D2 H/ [' e1 [  n. F# P
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 D0 u& k1 j2 I& a+ v( j6 u        char tmp[128] ={0};
; X8 c- M  [2 U3 g0 H
# L  H; S8 z9 r        server_msg_send(server, APP_CMD_LOG, "upp send: start");
6 T/ P! g1 s- O0 X3 W  ]        print_log(server, data, 64);
+ @: K2 I3 X* Q
0 O8 g. {% }9 ~        //
- Y8 N8 n& z3 e! |8 k        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ H$ e$ b% C4 W- N, N  R9 E' g
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% G3 U* }! [, [/ R        print_log(server, upp_buffer_b, 64);! D3 E; ?7 g# l9 ^) n
# o, f9 g3 V: |+ v
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  ]; x' C7 I1 s1 W. h+ I+ e        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  e- [3 C' T, x6 N9 B        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 m& l' m4 c; ?7 B4 T+ M1 }3 U        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* b$ J4 Y! G% C6 ?1 L* M9 h
2 z9 c( A' D. }2 Q& t% i3 o+ R- P7 V
        memset(tmp, 0, sizeof(tmp));# _1 o; t+ ^/ K4 L; a
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . D6 N1 b! q4 K& t$ B* z9 G& ^1 i0 ~
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 i" j6 K7 h2 K
        server_msg_send(server, APP_CMD_LOG, tmp);
; G! e  s# }$ l) O7 x# q( m
8 ?% B8 s7 p; I; j# l        upp_error_count = 0;
- j* o6 m# |; ?  Q# X' G        upp_dmaq_int_cut = 0;+ ?4 P5 ?; p9 B8 i
        // fill in data
7 O' _+ u' n% \6 P$ o% K: ]6 T+ ?; t        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& q2 _7 k8 \* v% D, `6 [! ^& S        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' B: k2 a  @0 V+ |

7 z9 t5 c/ Q% H# S) A5 [6 A        // wait send success; s8 k- G0 S4 D. n, C2 e7 }
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 a) n5 C! V- U- b7 V

  `  X0 O. {2 @9 J( n1 ?        // make data node in free list 4 Y) f+ Z) Y4 X" m* p
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 J8 a/ |' Z5 s2 }5 _4 s9 H
        server_msg_send(server, APP_CMD_LOG, "upp send: success");- @- |0 w$ O( V4 F% T$ f
    }
) I& s9 I8 n  d- p  N    return true;# V' p) j' K) G$ ^/ ?- C3 }! @
}
# s- d7 A! ]  s6 ]/ ~  u0 k8 N
6 w) `6 y* F# d# u

  y2 `! n1 u" a, o/ ]! U
1 c. h5 H0 D$ ~, T5 s; V+ ~

1 ~2 `+ ^& h7 X, \/ J" \  l% S
7 ^+ N' m8 I; I0 b; q% `

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 s& B/ h( o, c# Y% f& I; B+ l7 [4 J* A+ |

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 10:04 , Processed in 0.040956 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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