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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
: e$ a8 m. e( a4 o! j/ g6 m1 V4 V  E* K- S. U. m1 y
问题描述:
( Z7 j. ^, S* M# h# b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* n9 L4 Z! m. S
7 e6 L2 x( @. |% }" ~& U  z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 U5 W  C0 M2 p# k0 ?9 K% ~
4 `; s5 T- Q( S, n' m% b  D. f测试结果如下:, D  i+ K# Q4 u1 h  T7 e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! h7 g# S! w. ]- N: u& u
( d" H' \2 c0 \, c8 }4 f3 M) x' x2 |8 a- q
备注:; s7 |, g5 h5 t' P
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 m, {6 Y' F: `4 ?
2、相关代码如下:
4 i) s! O6 w& m' e8 ]0 g% E& O& P//UPP DMA缓冲大小512字节5 g9 V9 g- u" E4 r
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 e: H! [3 [5 v* m' B#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( x. Q3 @* _+ W3 Z. p: y# e#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" i# C* d; ?2 |0 _
& a; A1 B( C# S& L! h, @+ @
4 m" v% K8 L, Y5 w//upp接收、发送buffer
2 A: u( y. e6 Y; o: P" ~! ?% J/ d: ~1 I#pragma DATA_ALIGN(upp_buffer_a, 8)0 ?5 Z1 n7 _* f
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 Z+ g+ ?6 \5 x! `) U! ]5 I- {% P5 u
2 e5 ?: q; F% Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 s- @; ^. H$ n1 d" T: Q: {( h6 e; {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* x, q6 |- _: v* V7 c* j) I

: G% B7 e1 }; D8 ~( [, L* M. J- s2 T
1 `+ h* @6 m& o7 [static bool server_upp_data_recv(Server *server)
3 Z( [2 u9 N, a' K" A% t- o{( C: x; }/ R* s+ K
    if(server->upp_channel_a_recv == false) {; W2 A0 I% q% W6 w' m' i) @
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 R, U2 u8 u5 N+ X/ v  G        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 v0 ^8 _( w& [( |$ n            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ z7 B" H# U! J
  ^: L: e) {) r4 G& f! W: H, S- Y

6 Y) x& N' O. V8 Q            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 H9 c1 {9 I' U9 [/ _- j: g1 \. J' D3 \' h4 c9 X6 l1 @4 ^
            server->upp_channel_a_recv = true;//
+ |# S  U2 w$ l( e            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
) E: t8 E# P% D1 `2 h            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;! G& s. E6 n& s9 q' b6 j3 B
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;& o& q6 }" Z4 P! S' U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! u) v  k) c" ^' n0 s6 N
, q' \2 o6 }& C3 w& n. M4 \            upp_error_count = 0;
& X$ ~4 L1 }$ E1 }            upp_dmai_int_cut = 0;
) T7 v) h! e# o6 b
* w6 i) \6 I) T) P% Q) F, n            // fill in data
9 c  u6 D' E4 q4 h/ U            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ F; l1 d4 G$ N: J* ~" Q1 U            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 K$ G2 w+ B, V/ h7 k+ ]% H' N
        }4 C1 g% W8 Z! P. n7 @
    }
2 W% Z9 Z6 w$ |, A* p    else{
; m) ]. e) J& K$ D        if (upp_dmai_int_cut > 0){1 {3 W" ^% v. B% g2 [
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ j. ~/ R1 K/ A% F2 O2 R- q0 e
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  p& f/ i8 }) N9 ^) ]* z: \: u3 v
9 S9 g7 d3 ]/ a& x) E5 A2 q5 Z: j% G9 Y( M' b6 T) {
            //copy data to upp_recv_list_busy1 K, N0 \! |6 b. Z
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 Q, x' [1 v9 v) i4 Y
% W' c3 p8 {; i' H$ m8 t. `
            //5 B6 z9 l6 ^1 b
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  j* \1 ^* X% v3 C2 N  v4 Z) n. F% q5 i/ `. f
            //
& U0 _6 x8 ^- R0 X0 h            server->upp_channel_a_recv = false;//( |0 N% a8 f0 W
8 _7 z* @# W* ?, Y+ Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");" }; V' Y3 ?& n6 |* z
        }
8 n9 P% u* z) J4 u- `) t6 d( C4 w    }
5 x" a( ~% U& g; X4 g- E2 z8 {- D* X, O6 T
5 @# L. L( s+ Q; |0 P, n
    return true;( B( r3 i8 y: h7 x
}
' f1 [5 Q" \, K1 D$ }/ i
' q- G2 s; p, K" B) P. ]& X! R( ustatic bool server_upp_data_send(Server *server)
$ S" ?' _* _3 m: ?+ T{/ Y: y9 j6 W! R1 i$ B  H6 A
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){# C* i; z, b, {. m
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' V$ u" D- H9 m" k3 e        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);7 F# M4 F& o5 S" r) ~) q7 r  |' }
        char tmp[128] ={0};
* G1 i( }! p; @/ e
" {9 s4 }3 X( W/ l        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ e8 @* n2 ?2 n* M9 t3 M  Z
        print_log(server, data, 64);) Y% c  y) p' A% W9 [
1 `8 H2 ^/ O" }4 T9 o( G; l
        //
; N8 Y& k& Q4 F& w, ?" j        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ r0 N; ^, w& }5 ?        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& ]# H8 U+ F* Q: ^" B
        print_log(server, upp_buffer_b, 64);
# e* q3 w1 R9 H+ I4 T6 A! U1 N9 T5 A# n1 U
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ R" W( Z. [1 j4 L# W
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! e1 J9 x  e6 z8 X/ ]" K- a; h
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
( e" ~5 P+ j* {4 c        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
8 Z8 m- T0 F' ]4 a7 M8 ^3 m. k5 `: j/ q
        memset(tmp, 0, sizeof(tmp));
# Y$ |( X# A, g+ ^& U. l  b        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 ]1 O! K( x0 I
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 e% i& {# e  T
        server_msg_send(server, APP_CMD_LOG, tmp);
* p2 q5 P" q: F8 w+ F; y4 p. Y/ N& j; j' d% P" D! W
        upp_error_count = 0;
1 b3 X2 j. P6 M  F" k# D" k& U. m# V' Y. C        upp_dmaq_int_cut = 0;
$ T4 G0 s& `" [6 O' Y5 {        // fill in data 9 @9 l0 E- X: Y* i
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* T& R3 ?8 B" u        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
4 E" E3 Q4 d& E( J# X; y$ y
; Z9 s: i' G0 z, l5 _7 H) N0 ^        // wait send success
9 b- J) ~: C' [5 C        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 R: z# |" R1 z! N* ~: _$ ^' l$ l& m- V( Y0 J, J, l1 A
        // make data node in free list
9 R2 N) |) C/ f# k        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) L+ c' r5 d# O5 Q; B9 o        server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 G! z9 ?8 b8 d* ^$ H    }
, h$ f% X1 P; f4 m/ g3 o5 B# V* @    return true;2 d0 U$ R. G# j
}. O+ @( A6 ^8 {5 d# S% o% Z5 A
" a! p$ Y' m8 D0 W- [% s
" o$ T/ \5 g0 U. U7 _8 R% h: C
. v+ I8 x! z3 e9 x, p$ Y9 }! h
0 r4 z- s) l  k3 z$ y& W2 W# ?

% e; ^! R3 M: \: C6 d

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- ^9 W4 d2 m0 T% q+ d* ]  b4 p! u5 _& E$ W% Q" @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 04:21 , Processed in 0.043660 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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