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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " p" P- T4 s) |9 f2 G& M5 F
3 v% H5 N2 B6 F' t3 ]( Y+ x" `
问题描述:' Z0 q4 r8 X& n; [3 T& s
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 {3 M6 |; b1 T. Q! v+ ~# y; Q! u# U% ]! j' _1 H. [8 Z4 f0 m
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* a4 R, m+ F8 V7 e
/ M+ `  n5 j$ l# {" P$ T
测试结果如下:3 [0 u' B0 s- K' v: s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  N0 x* \- [7 _8 Z; r

2 e* l) i( K5 O; V7 ^6 o) k$ R" T) a" P
4 I; I# i+ ]  a) Y" Y" y! T备注:' u* }, H1 u4 }0 O) C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* m" x5 z9 K7 L/ S8 K# F; Q. P: t
2、相关代码如下:
' E# j, |: s5 |3 N( U/ ^//UPP DMA缓冲大小512字节8 v* e8 f1 E0 D7 \. A( @
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 A3 z: Z+ [5 M% J7 p! p3 _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# {" [7 O/ D2 `7 x1 C3 R0 I6 Z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 f9 b  w1 s! U' h* i; q2 s
. Y( I, U0 \- T8 F! G6 O( t
- u/ V1 C9 I' O, C6 i3 V6 l3 ~) v//upp接收、发送buffer. y6 D! ^" e# F* x& t+ c
#pragma DATA_ALIGN(upp_buffer_a, 8)$ p6 E  @+ [( L8 b) \2 c
#pragma DATA_ALIGN(upp_buffer_b, 8)
  _% V& Y  O5 E/ a
3 d, _# v& n$ r" I/ M) Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, Q) O% P) D* Q% z% @/ Xunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  ?2 d* c4 L" O7 q; ]" R8 W# T
- u+ |! V- \7 G! J/ D6 C
# B, p: B: _! I& ^
static bool server_upp_data_recv(Server *server)
9 n" d! q7 \) r) A$ f{
% F9 o* @6 Z$ R7 _9 h6 D4 L    if(server->upp_channel_a_recv == false) {
5 R- u. N" Y9 [9 ]        server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 g+ ~) J" `! Q# k% e: Y) w, }% E6 @$ s
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 M) X) s, `9 d, C6 @            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 p2 v+ c2 ?' t
8 p' e  w9 ~: L) N% n1 {. q' E
- D4 T' l- ]# k5 Y" `6 Q0 B            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 z- d" R/ p$ |5 W) a
$ F/ _, ~- ^3 h! r; E' [0 s
            server->upp_channel_a_recv = true;//
; s' B8 S+ y4 c' [. V  }8 S+ z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
* a1 e9 M* }0 N0 g            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
4 a# _( n2 o, m            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' C/ B( t% t, _7 `
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 W- p5 U1 L0 Y' D# J- u
" X; F& {/ {- z1 P: g( z            upp_error_count = 0;
7 C% p9 N3 V( U; L6 L' ~            upp_dmai_int_cut = 0;
9 h9 b( X+ R( g2 |+ y3 j( P9 `" k$ m) a# r
            // fill in data
; c# `# Y/ ^) H            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) ~4 G9 r- _; S  l9 z4 S" Z& \  g
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 K1 B- J$ I. S4 e: [: c        }( G+ g/ E# S1 A: a  Q$ v5 w
    }9 y$ Y. Z' p! X. A1 `
    else{
  ?; H) Z) F3 _2 _1 _        if (upp_dmai_int_cut > 0){) _/ J2 v, x6 i6 `' A  P
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& f% Z7 i8 n, Y) ~
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 ?& t4 u8 g4 W, }
5 v5 f+ _$ K7 D; b0 d0 x6 f9 ?5 _
, J5 q6 \/ S+ p( {& f            //copy data to upp_recv_list_busy
5 B! i3 _' a/ m: c            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' \4 o+ W$ A$ M- C

/ ]# A, c3 _" ^* K8 D" P( m5 V            //
6 |, ~5 i& B  l) K, O* V            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  z( U5 M% |1 _2 h" @7 i
: q+ P" @% S0 f: q
            //- h) O- r* J6 {7 ?! k: A
            server->upp_channel_a_recv = false;//( }9 Z5 g7 s* M* N

. q" ^5 _1 C, x  ]4 I* M* Z3 C            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 }2 P3 W6 W' C' f/ {        }5 {, X7 ~, j. u1 Q" }( _
    }
) @5 z* L9 ]: R! v" Z2 c# K) ^8 s% @6 v) m2 a4 @

  i3 `# e) {% f    return true;  C0 d5 L- G( }
}
3 E3 o4 K* _; M6 `7 j
* f  ~  ~7 E1 Cstatic bool server_upp_data_send(Server *server)
, V. |+ a- t# h1 V# z& o{
  [7 Y! E% h- ?! @7 ^% Y    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' W/ _$ j" u& c, o& w# _: L2 H! U        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  r* D% j, R6 A# b        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- ^" ]6 {7 B* K5 |6 r
        char tmp[128] ={0};' v5 g) @  g2 m6 M2 {

6 J- Y& B% o6 L        server_msg_send(server, APP_CMD_LOG, "upp send: start");7 P9 m/ B3 T0 \" M  Y
        print_log(server, data, 64);
. k- _/ e( v* h3 O" I% t1 _+ \8 c  c! _! o& P% l* }4 Q0 C6 V
        //4 \* L+ B3 @* A' ~. g; o7 O' m
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) D6 W# g. w3 O% F% k
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 F$ i/ h& J/ |9 {+ ], x        print_log(server, upp_buffer_b, 64);
$ Y7 C" ?% u4 R+ X. H# A4 b) z' Y) z+ g" R$ @# c
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
; m2 G8 C$ o/ B& T7 K        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; , x( O& b4 J# A
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! N  g! A! P+ T% r
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( a2 K+ M8 Q4 \  I8 I; Q, E; }1 }$ f, a5 z( \8 _
        memset(tmp, 0, sizeof(tmp));
5 q" S$ U9 }3 d5 H        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' q& d1 Z' P7 o) _9 [            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 s4 L3 i/ m: |6 _5 a# D5 X        server_msg_send(server, APP_CMD_LOG, tmp);. `( j& x  ?6 V, {* R; n
9 g" [+ b- c  ]& j6 r8 ~- b  C6 }
        upp_error_count = 0;
4 K/ j1 U6 k) F        upp_dmaq_int_cut = 0;, h+ ?+ w3 T& a% e8 h/ J
        // fill in data
( b. Q4 T7 @7 p, Q+ W4 A7 k+ ]        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ I& ^0 l: h, I% S$ k" g& H        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, J( z" p: V* J+ X) K3 G% |/ M" y' ~5 Z7 u2 z+ Q
        // wait send success5 A' J3 @" K. m* a4 \
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- G2 y& I: _; |5 p5 a+ s+ z% P# Z+ b& b, I5 C8 V; {
        // make data node in free list
+ a! c" y/ y. P% k        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: b3 a' ]. B! X) h, G+ v        server_msg_send(server, APP_CMD_LOG, "upp send: success");1 Q7 p  t' U; K* s3 w
    }
3 z( a: o" p! x6 j& W) q& |4 c  t    return true;
3 H! \  V0 D1 v: w) n}* \: G0 W2 \: M! P) `
- r3 x' r2 |- S0 [6 k. @5 H
( d/ B" w' m4 |0 f
7 a5 ^  f5 \5 n( ~& V' u' V
( a# L  {5 t. {* Q
9 S0 k+ y6 D0 h: f+ Z  T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 W! Q6 ]* Y) v' x. I0 O

, k# {! d9 ]6 Z4 c$ I1 _

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 09:49 , Processed in 0.043533 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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