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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 m8 G% v% x' v6 ?/ u! |6 v- n( A, d& i
问题描述:# T: t; Z% y' w1 I; s( F; {
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, J8 D  K5 \/ K/ k7 G" I, d  I. o: T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- }' I7 Q" v8 y1 g3 Z; g& c' N. A/ ]
0 J1 D0 B, `$ _; ^) h7 D测试结果如下:4 A! g/ h$ w4 B* \2 z* [8 c
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. ], l- z2 X  \( I4 A1 f2 _* k" U
- O) J/ T: V: h" n

) S# z, L6 g" t备注:
" {" ^4 f" C+ b1 z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 }9 S& z( s+ D) R5 j- @
2、相关代码如下:4 G3 z( Y; Z' ?. f
//UPP DMA缓冲大小512字节/ A/ S4 [- C# Q% F6 I
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  M$ ]! `9 h) ~7 j/ z: r$ l/ H
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 w% b/ S' s0 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( v" R4 {" \7 K# d2 H
& W! O& Y! m! Q. \
4 u0 \0 `% J  S
//upp接收、发送buffer6 b: {# e% G8 y/ C* o3 i
#pragma DATA_ALIGN(upp_buffer_a, 8)
/ q( P) i1 ]) E& h#pragma DATA_ALIGN(upp_buffer_b, 8)$ d* Q2 f5 x: Z/ g# d

' x- y6 f! d+ ^, u$ k' i' Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
( L2 G5 l9 g  [& Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ W8 R8 P9 @' H! |  Z( U' F4 ^$ d, h% h

7 _* O) k. d: b* @static bool server_upp_data_recv(Server *server) & e7 c' M7 Z$ c; a( C! r8 u; l
{  W( S- U$ B: W$ q
    if(server->upp_channel_a_recv == false) {$ a1 y; @' M  P; E
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& r! g0 y' A& A8 S( f/ R4 ]2 {  K        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 r0 t7 j. u+ _* e8 b7 y' _5 G            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 {9 l; C" U! b1 g7 h
3 q) q9 a" L: ?$ Q. y4 l

: k$ ^* C. n" l            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
: H# q; ~' @" v" B+ ]/ o; \, r  E/ L5 J) l# q- |
            server->upp_channel_a_recv = true;//
8 N$ A) G0 v0 `- Y$ P% O$ a" H            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);0 g( y5 ]* V2 E. T/ }( r6 _
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
! k# T2 I3 o" }  P8 s: I            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;3 k8 H/ v. R( P
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ v/ X+ d$ p: P3 u1 x4 _- Q5 F2 e  b8 t. L2 H( D4 |0 n
            upp_error_count = 0;+ W' u4 n0 w6 t3 e. Y- k
            upp_dmai_int_cut = 0;
& }) j& \! Y% w7 A0 I7 N
3 q& ?$ i% [+ X9 h7 y            // fill in data
! V! [2 k5 N( m$ S+ P- Y- c; L            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 D/ }  q' T9 Z3 T0 r8 M
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ `* \- ?( h8 z7 G4 B4 Y3 A
        }4 y0 d/ _! a; ?" v' P: u* |' u6 b
    }
+ ?2 Y4 W0 j! `4 L1 b  k0 k    else{2 i8 H2 @3 ]1 E" S2 A
        if (upp_dmai_int_cut > 0){: K2 R. a5 t+ f+ `; Z
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ i# G; e+ m$ G4 z            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, u8 q, E$ t4 R# b$ Y/ h0 H# u
, ~# ]1 q+ M2 V% u2 z$ {, r
8 y8 }/ q  }/ a  W: S            //copy data to upp_recv_list_busy) s9 \' f; Z7 _) s9 a. c
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) N. F" U7 i8 s/ V
. k; I1 n. M: ^' B" n8 U
            //6 Y6 H+ l5 V$ e* |4 v
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 N0 p6 [  k* K8 i7 R+ D% L5 K) X" ~. z! Z& a
            //
5 \* z5 l& e, d; H4 P$ _0 O            server->upp_channel_a_recv = false;/// B* d- N' o7 n2 D6 M) N
/ m9 p: Y- {" y6 K) P* ]3 t! J! p& r
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");- x+ `+ G! ?, L9 Q
        }3 C, W& C# A2 K
    }
% l! F) G9 q% \8 q6 ~) m* h$ J/ w" R: u9 @) J! t
+ l7 V/ I! Z% _8 C' E9 \' G
    return true;
* e" m. L3 D' T}
/ p( C) B/ [8 f% F1 i/ m9 F$ V8 s( m; W' q. g4 p* d- M
static bool server_upp_data_send(Server *server)1 _6 ^' d# E3 }& m
{
$ m; T8 o" J) d  B6 E( t    if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 T* {  w* ^+ k
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
. O3 o3 o( t$ f  p        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);8 w% n- G7 \9 \( v3 D# L
        char tmp[128] ={0};
! N; V& s1 z  `2 O* u; ^* U4 N& {/ b+ u. O/ V
        server_msg_send(server, APP_CMD_LOG, "upp send: start");; {* E8 i% ^3 j
        print_log(server, data, 64);6 j1 Z6 O- e% R
5 Y) v9 }; K+ `+ f7 t' ^5 T/ v% h7 l
        //
2 U+ ~0 U$ B* `$ \% W        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 M+ ~9 o! u5 ?, R  V* \+ g8 U5 F; ~        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 i/ A* Y; S' U( Z9 C. M" M4 f! j
        print_log(server, upp_buffer_b, 64);3 i& l! n* e& n$ n
* S, d9 j7 w' b2 y1 o2 e9 [  J
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
$ X% i: N; D6 E( |/ n* g) b        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
' @! g: Q  I) I! M1 R- O        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 W) g& g  O, i, ~
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 m- _- a! o6 r  {/ t6 Q, H

8 Q2 h  O* u! J+ ?, ~0 Y  U        memset(tmp, 0, sizeof(tmp));
/ ^) o/ P/ X3 Q2 t9 X        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
* X0 |. Y: f; \) \! A            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  s% X% h- P5 q; q' @        server_msg_send(server, APP_CMD_LOG, tmp);" J- E) S; ]8 O6 u' g) K  l! r2 [: w

4 {/ L9 Y2 a& V6 G% P" t9 }        upp_error_count = 0;
7 H. J; Z, o! }; w5 J        upp_dmaq_int_cut = 0;
* x& X  L' x8 p  F3 C        // fill in data - @3 t/ X) i1 E  r" O4 A8 Q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 D: s; M/ f# e5 w- G+ t+ j* a        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
4 V- E8 E8 a9 P! G9 `% S: C8 J+ Q2 ~* r) Z( f- i; X$ Z
        // wait send success( U  U; }7 j& P- f+ ^4 K
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, `+ D5 ?6 F) @: F0 R& }. Z# d( ~1 N9 n0 r2 u4 T5 l4 K: M# `- r. @
        // make data node in free list
+ ], ~5 N9 A  t. Q. c6 X8 ?        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- X5 g: ~* W7 D7 @# e4 e        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  ?: q6 ~* o% b. o0 c    }
0 ?. w  f; U6 \" V/ |' Q6 O/ o" A* Q    return true;) ?1 C- [0 @; ~
}/ d0 D3 x. r  s6 M0 O

, Z: Y) L9 {( Q& c1 R; L4 ]/ h0 _
( l' Y( T9 e- x

: t0 [$ |& ?% b; g) f- q

9 m9 ~1 J* e3 u$ P; D+ I0 B
( D$ C- ^4 C! N, h$ a3 r- o

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐3 v- m- ~* M2 u1 |/ P4 [$ p  k# t

2 W+ P  t) A9 T8 V  ?& T

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 22:16 , Processed in 0.039156 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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