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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 f5 C" `7 J* M5 Q
2 w0 s- ?; e. S  v; D问题描述:- u$ \( S$ [0 o) R3 a8 `9 d
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% @  {0 ?* B+ y4 Z" C! C3 F) ?% a" U7 \  h. _/ W8 z, F* v3 y
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, f# }) }2 y  l; s
  E* z$ p* h! D/ f" t
测试结果如下:% M2 x" {1 N0 {9 I- d
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 P' b9 S( h/ f. y0 W9 D- ~/ C1 _% n( j' `$ p! L# u
/ V" |" V( B; x+ O8 O
备注:: V+ R9 F2 R* `6 L
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" {/ e% ?- w1 D: o+ e% u
2、相关代码如下:
- l6 S  `4 Q9 }//UPP DMA缓冲大小512字节" Q" g3 r, |5 v. {
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- l: \; a# n$ T6 }) c2 s#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) F. X' L" e0 l0 R4 `* R+ Q* _
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 k0 H# F8 ~& x1 ~4 `; C; `6 V
/ U  T% e. E  l& a5 P: W; o# V- B$ [( y5 ?) H
//upp接收、发送buffer5 g6 I' H4 ]/ S: a: h4 ?
#pragma DATA_ALIGN(upp_buffer_a, 8)
) S. F/ T2 z- {: s' p5 m( x#pragma DATA_ALIGN(upp_buffer_b, 8)
/ U7 X# _" Z) L4 J6 |% T9 r3 S8 R- }0 J1 ]' f/ W
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ n9 O0 m8 ^5 ?' g8 @+ Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 O/ E+ U8 Z* m6 J. S: s+ U0 N, N
, a& A& j% P" g6 A7 d6 O% ^
static bool server_upp_data_recv(Server *server)
1 ~; H7 C$ z) }: m{
: z; C/ |+ ~& N( V5 g# O    if(server->upp_channel_a_recv == false) {
& f8 a) y; c1 @. e( p0 F2 {        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' t8 ~- A. c3 l3 a- f3 F$ ~7 t        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& y+ A: ^, f6 i+ H            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 J: w5 x( j0 R: b3 t# b

, m& A9 Q5 Q) y# k* ?
' W4 d) a% ]9 j0 e# V: n* [            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 K6 l3 t# B- o1 H/ [
: X) `$ r% }3 T) @; {; O; H3 P, T
            server->upp_channel_a_recv = true;//
" ~: [3 ]7 ^" B1 K$ [, g/ B- S            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
, d! L  J& y9 p) z* U9 w' d9 M            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
6 K2 W2 B$ y5 F- r' \0 H, Y+ q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;7 q7 w" X/ `+ [& e
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 s$ I  S4 u1 r0 E
1 N4 v2 Y/ H* b4 d. _            upp_error_count = 0;) V5 w# Y( g4 a% I
            upp_dmai_int_cut = 0;2 A7 L1 y% Y; ^% s+ w" d- P; L

9 F- I* r6 }$ G. Z            // fill in data
6 x* {! q8 l! ]: O) |: E            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ |8 o1 T9 E: n1 t+ [: j            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 M. R) v& w; T& c# F        }) f1 C. \  X* o+ _" B
    }
' S9 d% ^% r" B- ]3 i# u    else{& j0 h3 L" X& Q% j; a
        if (upp_dmai_int_cut > 0){
# v$ f) c4 I" I7 t9 o' k2 r+ \            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 {/ `$ I: _0 z! u# x: I            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 g7 x- o" X0 v+ R" |: ^
- F7 A$ ?  O2 l
7 q( Q4 ]. c; p; ?8 S, [; K4 J2 _            //copy data to upp_recv_list_busy
7 K. q/ j3 U# J/ y6 q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# E% [4 H7 R7 Q, f' B, M
4 p9 n' j! a& A3 M/ e0 c            //4 z6 X: }+ r5 j" ~8 b# [% y
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% \9 ]: ^4 d: d1 y' v; e: z" L' {. x, o  a
            //
/ R8 i; X3 f* e  `- U            server->upp_channel_a_recv = false;//
1 E2 f5 L# R! ]9 t* W& [5 r+ s' _' d( d  J1 O& ?' }9 y6 F
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 ~  z, O& y+ |% m! v  `4 Z
        }
" y* k# j) L! ^1 l* |1 Q6 @* _    }
. Q% P; ~+ p, \% f8 P3 J7 z" S
1 w& C. [' `9 u/ B% _/ G5 G' u' O; ^1 y
    return true;, r% w- i4 y( X# R
}' _/ C2 n3 a  V, P
5 q: \7 l0 m' B! K
static bool server_upp_data_send(Server *server)
: ^: S+ r+ a7 U  d- M; z' G( e* b{
5 e, P1 {2 j# D) L2 F    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: C7 f: \, N0 y+ V6 u. q# [8 k% D        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( I( A( q3 O5 K$ q5 b. t" x        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# d0 B" C7 \" K  Z        char tmp[128] ={0};
" _6 u+ s8 N5 Y4 o
! K. S" v. |9 S7 ~  d2 ?. C# X1 i6 j        server_msg_send(server, APP_CMD_LOG, "upp send: start");( \( u9 x+ Y+ b
        print_log(server, data, 64);
# R* K: ]6 l, O- R
; x# _8 T$ k1 _$ Q        //4 z7 J! `. z" U" \4 D* Q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ Z5 A. `5 }& y9 _
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 U7 t5 b6 v% ?7 k        print_log(server, upp_buffer_b, 64);
, _( S& u8 @7 e, T5 t
$ v  U4 y' L% n: k        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) r! U. u9 o! N2 ]
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;   i4 }1 P$ J( B  i& K8 z3 W
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ w" |5 t" w" m; P  J4 C% M2 ?0 l
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( c" N( G3 A' b+ Q3 O
# L# {5 p$ c1 U( p9 J' U& U* I
        memset(tmp, 0, sizeof(tmp));& K- o( X1 v% d
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 {9 K# y% B3 M9 P) l0 J9 ^* g            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# ^0 A) D$ q3 p& u. j+ {' L2 M# W3 [        server_msg_send(server, APP_CMD_LOG, tmp);
) a7 @1 u* F  {) [; X& T+ ^- B4 q7 Q& f: M4 g2 {! Q& \0 o
        upp_error_count = 0;# a8 @: G' X$ ~
        upp_dmaq_int_cut = 0;' ~/ |" l+ D3 X7 z8 H. K- W5 P# N
        // fill in data ) D1 ]* y# q* c. }2 u/ b5 j
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 S: [1 |2 }1 s. m. T& a* s- m
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 q4 H# U; W  B
' [% t* h0 e& f0 _4 Z& y
        // wait send success* [4 u' h$ x8 C$ p+ F6 F" }9 j  _
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ) G* o* q; V+ ^/ `
& \0 G8 |- o0 }# t% k4 K
        // make data node in free list 3 E. C% {% Y" ~( i2 g2 K5 H9 h
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' E- U" n8 s, X! W1 }3 ]3 ]        server_msg_send(server, APP_CMD_LOG, "upp send: success");  s8 u; n3 L. Q* p+ b1 H0 y
    }
7 V) |' m  W7 v3 m    return true;: Y0 r& p; M! q4 X
}
* b$ T3 p4 A2 T# d, R7 L
. x! A; d' r% b6 ~9 D

5 F1 E5 Z& [5 U' z6 E% o3 L; b5 E5 i) D" |0 @8 Y# e
7 W. v0 G' `4 `, }

4 W$ E+ E. i6 \

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐" c9 V6 H) T+ @' G/ Z! S1 c

' F# m' A/ _, M* }8 ?" Y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 19:25 , Processed in 0.041935 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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