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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # s  L% Y1 c) v. `* P: n' X" u9 Y

& w0 y+ Y0 h2 o8 b0 J问题描述:
* \% T. D' t- F* q$ Q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 u" G2 M7 i; Y% c9 \
7 {% o# A0 _& `, G- a, c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. e' e" K: j/ ?; T8 r- h5 Z- _. @* z% b& X
测试结果如下:  ], A2 j) a+ T' w$ Z) y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 N: Y% X* t" j6 {" ^  o4 m
" J! c( p! I; `) H/ w+ ]

# Y; M! b5 O& d4 [0 x备注:
( X4 e3 S3 W- A/ `- m1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 B; \' v8 \! z" n$ K7 k
2、相关代码如下:
- Z6 C0 O% e6 [9 A. u9 K//UPP DMA缓冲大小512字节
1 S4 s& y+ _" u. M9 f& n2 H6 j! u#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
0 t$ M$ N: B: F5 N/ I#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 x4 {' c$ f0 P5 d0 k$ ?9 g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)) p$ H/ x$ L- n6 q  m5 C
2 ~$ r  i& G2 ]' H& [9 Y8 L
, K* f. \2 a- ~. Z9 M
//upp接收、发送buffer6 @" P  |. N: M0 ]6 H
#pragma DATA_ALIGN(upp_buffer_a, 8)
; X' T. p1 t" t* M# T$ q#pragma DATA_ALIGN(upp_buffer_b, 8)
; w: N7 s) h) N: t  [
% [% T" V& G: ^9 h6 d9 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 U. |" S  c: P  C7 \* kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 i) }' ]- j& q' J5 ?  p
7 b- z4 q7 ]1 a" g4 Y
9 E$ S7 |0 n7 a. I
static bool server_upp_data_recv(Server *server)
* i8 U. a- p& F" W{9 ]( h1 c2 _$ e  X8 G: x, F* l
    if(server->upp_channel_a_recv == false) {
! K& D0 R' Y. f3 D4 P0 |  m        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- D. @) M) Z' M
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( K) e, F. d- ?# d; ^: \
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) R3 M, m7 d0 o3 d
6 O& s9 `( u, W, @
3 r8 t3 j/ E  E            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& l0 @  B) W4 S  S: w9 U

3 Y- X8 r% p5 E) I# J( d            server->upp_channel_a_recv = true;//
) A. l/ S; h% l- V            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
. h' h$ `: O  O$ Q$ L6 N            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 J/ i7 L2 K6 Q( z( u
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. J, ?! W/ B! G( G/ L  V/ i% @+ F            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& j" U; x. v1 y/ ]- ~( q. `" b9 q* t$ A/ {/ b! H
            upp_error_count = 0;% \( f5 \) X( T! X1 C
            upp_dmai_int_cut = 0;" P9 e) j- m2 b7 {  T9 \1 Y

% U* B" R3 X2 i8 ~0 x  C" y            // fill in data
. P* s  l/ R" t4 D& z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, a8 X* `9 i' F& e) |
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 K3 Q$ A& y8 ^7 _/ E  b8 K! k        }7 }/ ]% E6 r2 h/ L" f' M* M5 }
    }9 _2 t* c, p4 w" I. l7 L
    else{8 ?) g! _0 ]* M" \& L: g( o7 D
        if (upp_dmai_int_cut > 0){" ~2 @3 }  k1 N0 y
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! [& w5 A. X4 E: G8 L. L4 [            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 r2 c( Q( [0 B: g1 \) v/ N6 C, |; `, `) [

$ X( c! j0 W* C3 K; S0 T' _            //copy data to upp_recv_list_busy
: m# Y* @) b* f( p" \% v            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 r9 a3 a3 i% Z# X- S) B/ v6 H# S
1 i+ K( d$ B0 ?# i* P. A) E            //' B! Y( k* i& r/ x. c. h
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);, J, x) G" t4 }7 K9 g4 E8 `, u

5 d. o! |9 H* z8 F/ I2 ]- j            //" ?4 L) F6 U" f. M  d. }7 D0 A
            server->upp_channel_a_recv = false;//
% ]. u/ z' \3 R; S  r
& N* D6 k# g* J% n! x            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* M2 v1 m- X+ O7 ]" r# o2 M+ r0 }        }
: N. }6 Z0 ?0 j( @- s8 J# x0 j    }
7 A! E1 @/ |3 s; ]
, v  c5 Y7 \; q- @! _* F( m- b0 _7 d& X( z7 `- {  H0 F
    return true;
" t/ m6 z  Z! N- f& \}
3 x* _* r1 ]/ V6 k5 H
9 n( b% L+ l4 t7 \9 Cstatic bool server_upp_data_send(Server *server)% R) q4 c9 A! s
{
, X; m5 G% J' o3 \5 ?' Z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 E1 y7 Y5 U6 r6 K# A* Q
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' E8 c  ~, z. w        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 k7 S" A) U1 F' ^5 ?: s
        char tmp[128] ={0};+ I: C/ k  ]3 `* n

4 V4 O5 d7 t* ~" n/ M$ U        server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ O/ R0 }( m' ?1 Z0 R        print_log(server, data, 64);
6 [% B6 R, s5 L# |9 L7 C5 {, B- K- f  B; j" d- P: F+ K
        //) ]1 |: Y" {: U9 Q  E+ i; u) R* a
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# W' X, @8 t3 }& w& @1 q1 ?( j* I
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 n% q, X! I9 z5 |. y1 p        print_log(server, upp_buffer_b, 64);  X+ `4 D3 J! a$ Y

6 e. f; g6 t- u6 a/ M        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
6 g. v: s. N7 x" M- [        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
4 n4 ?: ~+ P( ~; @! J+ w& }! w        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ J8 o, G# t& @" K( U" {  L" w        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& J2 J) M+ B2 s- W& y& ?' l6 \( B3 Z* x- I* }+ @) `
        memset(tmp, 0, sizeof(tmp));: M/ K  H+ k/ j2 W: K- }5 ^
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - G3 b2 ?: n+ w0 n2 g4 P
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ K9 G$ |" J$ G# ^        server_msg_send(server, APP_CMD_LOG, tmp);
' X7 E0 w8 R0 j" H- |6 ~+ t; i% B  h4 h4 n+ j" @$ i) E" R$ _2 ?
        upp_error_count = 0;: C9 k( I' `; r1 O  X5 _& y, A
        upp_dmaq_int_cut = 0;
7 j* H1 B% [% I& H. ]& y) J2 B2 t( `        // fill in data
! b9 g' B" @1 U0 z/ d/ k        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # r8 i9 }) p/ K4 k( D6 ^
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. q. h! O& `  o
; N7 C* q: w/ M" f$ u' O8 k$ x
        // wait send success
! ~, Y( p% s. y0 \3 C8 A: l' P        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : H* p$ v5 \& P2 M# [' `6 y
- a6 G. N) u: I" {
        // make data node in free list
( u, V& f  x7 ^        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' \# }4 P4 Q9 L2 g, r        server_msg_send(server, APP_CMD_LOG, "upp send: success");) c+ r! i( c6 G! S( Y1 J
    }
$ K8 Q8 G- S) B1 }2 E/ Z) G    return true;
- U# t! u. T5 f  p5 c  w}
; A: Q1 x3 B2 e! W4 _5 v- d9 u. R/ _
% M& h7 w1 f0 p+ E

: f- r; v" ~2 j* m* {
5 C6 {- I2 i) X( o0 c( z- z4 R

' W% D) c6 a' t3 {  S

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% `0 E5 z$ A3 W( ^7 c+ e/ x/ Z

* o3 e$ ^; q6 Q1 \- c$ t$ l! f1 J: g4 S

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-7 23:09 , Processed in 0.039212 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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