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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ j1 z+ c  G. h4 M3 j! G, ?

3 a2 x3 N$ V7 ~1 W/ |  l( z4 \  M问题描述:
8 m" L- s7 r$ q$ x6 W3 Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:7 o6 @6 c) H# B" q/ ?
( _. u( Q6 C0 r4 e" x2 Q
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! a7 c/ m+ v7 a: f- Z! I" v$ G

( ^7 [6 S; y& Q6 P0 \测试结果如下:
9 G8 W5 M6 F# H- e/ ^* c+ v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: E- N( j2 n1 W( x$ M/ h0 G* u+ I
9 m* W8 A; s; S: U/ w3 C. d0 ~
备注:
/ c& `! s6 B% s7 Y7 O: F1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 M. i# D$ S, O6 V6 Q8 F3 H
2、相关代码如下:
6 p$ n* f: C/ G//UPP DMA缓冲大小512字节  G7 h0 d, N6 w5 b+ T
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* H& n' g+ x, m8 V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" U  @  ^2 D+ X* q# B$ k
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
! X4 k9 z1 z+ t) E$ `
6 ?+ B! q/ \- o( i% L1 I6 D8 x
) M5 T  ]9 `! I$ N8 q//upp接收、发送buffer0 T# g) E- g! W: H
#pragma DATA_ALIGN(upp_buffer_a, 8)% t' Q+ i1 T8 M5 k  Q4 l
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 l6 h" D5 }, j$ [0 T8 T( ~$ R) b; V" g* [
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: h' d: a( X, @8 u( W  q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# x. L, y" {; C9 X: i
& l+ p2 x; A$ p7 I5 P' l. X3 Y4 J5 _( [1 B* ?8 x1 B8 b# ?
static bool server_upp_data_recv(Server *server)
8 k! E% e! |& g9 Y  `. D{
% P  r3 ^, I1 m4 ?4 Z7 i! k& G! ]3 k    if(server->upp_channel_a_recv == false) {% w3 J7 b4 y' v* o0 K
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 ~9 @* A5 b9 K4 R; I        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) A% ?1 [9 w8 [: l6 K* ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; H0 Q+ i- x8 `5 o& X/ J
2 v0 K, a2 I6 j, [4 R
8 ?: s0 O4 P7 ?  L
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# i2 F5 l& ], V; `5 O( v
! `; L% L) o: T  T/ A( K
            server->upp_channel_a_recv = true;//
. w. {2 a; c+ k7 O1 m% L            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);; e' |- Y2 H6 Y% c4 t9 |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;% N% w4 A  e/ L+ ]" N
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 h; }2 g! T) t7 k' [  ?, n
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/// Z+ X) k: I  \: {

* r7 o; ^# _! w/ w% U& R            upp_error_count = 0;' w$ ?9 D7 V4 o) z& M& L
            upp_dmai_int_cut = 0;
% a. e: p8 |! Y  F7 ^3 i6 l! C; T, C
            // fill in data
4 ]- `, V' y3 u# O. ~+ f6 w% D" d            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);4 Z/ w1 M" H: t$ ^- j
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  `  {8 V1 f% e, X; F4 R. |: @        }
1 R- |1 O; d9 b$ z* X    }' ~8 s9 Z  x$ k# Q8 y  x
    else{
; [" R9 P/ m7 ]        if (upp_dmai_int_cut > 0){$ @5 o: n0 d/ m( P0 \! Y5 M
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 z+ [1 |! n6 ~$ `1 Z7 g9 p            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);, C$ _9 U4 z" o& V" ~, X

6 y$ A6 f# H7 v0 b3 L, q% ~9 G2 C: e7 M# Z& V7 U9 T: }
            //copy data to upp_recv_list_busy
& [+ T3 S: ?7 X9 G1 e" l            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 f, g# e- l* c2 e! P) {; M) z6 G+ f$ N

8 N5 G: v) {7 d+ r            //
3 q; M, c6 n: ]. d+ F* J            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 S% t3 K4 }5 @' N( |6 _
/ x9 {8 F7 n0 N! T8 m, P0 j
            //) Z, Q$ J$ j# ~, G* W0 h! V
            server->upp_channel_a_recv = false;//  f% P3 k% i- D. j
/ a. B- U' c9 g) U
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; ]% `0 Q; b' y8 _
        }
% _4 w8 F9 [3 K% @3 C    }
; G/ N: D  T4 W
# V4 w: L( c6 O  t5 e( e- I
- {! p6 p: v+ u& c0 n8 u+ Y) r' N    return true;
4 p6 X' m% W* j# k$ u# L( {8 ~}
4 E" T6 d. ]# p# x4 h( `- F$ I7 n# U" s
static bool server_upp_data_send(Server *server)
. }& q0 a5 S0 J2 ]9 I/ `. V{
% s* [4 L% y! x5 U$ t0 x    if(ListMP_empty(server->upp_send_list_busy) == FALSE){& ~+ y/ F) ^: z: [1 G
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, `! g% a: o! v; |7 z  k# y        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 @" D" A: a# t! H% B0 p( ^5 Z
        char tmp[128] ={0};( ]; y5 k* c- h5 X/ r4 L+ C
5 {6 D7 r4 s; L) c# I5 _! M
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 V( j! f6 v) F5 u$ S. W& e$ ~        print_log(server, data, 64);
- E- z5 m3 ~5 z  }) w0 g3 K9 N( h, ?" A5 Z, ?' n
        //
6 A5 k" _. ~1 k( o. U' Y0 @4 @4 P2 @  e        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) f7 S2 M4 u1 L  L1 q/ E9 z7 S        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! [+ [$ x% K  B+ z$ J& B
        print_log(server, upp_buffer_b, 64);; }& c! e+ Q7 v2 v& r/ B  }

% _4 }/ a) H* U4 w; w0 k7 v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
9 p. `0 r" ~, ]" l$ r( A        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- W+ B* I* w6 k3 C+ r* i! D        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
: s, L" ~; R+ W) ^        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( M% z# v2 o, ^5 {
, P" e1 V0 L* u" {. l! D: z- L/ v        memset(tmp, 0, sizeof(tmp));
, w# q. p2 b7 M! I8 ^        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - _* w* G5 D% N/ v" S
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! D0 Q  j4 u: K: l6 \( t
        server_msg_send(server, APP_CMD_LOG, tmp);
) j* D% I& T2 T9 O* n2 H
$ F+ `- a  T- }6 M5 i1 ^        upp_error_count = 0;9 U+ M: F: a' H1 l3 G3 l- N7 q
        upp_dmaq_int_cut = 0;
$ X3 {' y3 T, [: p# H8 I4 _0 k        // fill in data
, M; i8 q' T& |6 m7 e: e        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 Y. w& S" w. [1 `7 |2 s
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( e, u$ ?( h6 a6 ^4 q  s; Z" }8 m4 ?- s8 A# k; I. m3 }7 `
        // wait send success
; N4 M$ ~5 \1 h  ^        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 {" ?/ v9 p. ?, G/ d2 V' ?+ b( z# H7 j
        // make data node in free list 7 g8 q2 P: x9 t& U9 ^
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);& R5 z, Y2 v9 r/ B& H3 m* a( X6 D' |
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
, x9 C4 v; o. k6 k1 O    }
2 A4 }$ K* E( u    return true;
7 B" T1 o+ K, p5 Y: [1 h! w}/ p3 I9 h+ R# D# [) I) z
4 }% F5 G7 e# i6 c

) ^6 D" m# h4 ~- C) \, n, J+ \; W. h: y, }& K
4 w4 S$ g& t1 ?6 [7 j) t" u+ L. O
/ |$ [2 i5 c( K

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 03:22 , Processed in 0.038232 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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