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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # `( H) f( |! C, i/ @4 B; g7 j. W
7 L' m/ |) W) s9 S' j4 u3 A. G% w
问题描述:
7 M2 \& Q! x1 e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' F& ^5 B. {: @8 u2 F7 E% V/ ^; q. U6 A7 D" _
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 g+ y, ^2 k+ H; K; N! @8 s
9 X" p: V! Y  t5 \+ b
测试结果如下:1 k! I( A' l9 _9 u! \$ A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! h8 w; H# d6 j, X
+ a- t8 p4 u" e
+ W, b2 e9 I: ]+ V备注:$ u1 Y. N% q, g! F2 k& U' U4 r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: i, n  {: j6 l/ P
2、相关代码如下:0 ^+ X# O" R; u. f: n; E, Y
//UPP DMA缓冲大小512字节
# i% \% w; ~. ^2 e) y  v2 o: H#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! h+ X; r% [. O# U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# D) @2 e1 x. Y0 P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)2 n" Q* O+ B- B. g7 o) d, L

' o  W; }  P: L+ \- T
: R6 k  H2 H9 e+ ^2 Y5 c: q8 N1 E//upp接收、发送buffer, C2 L1 }- f. M
#pragma DATA_ALIGN(upp_buffer_a, 8)
" `4 @2 U0 x6 v  p#pragma DATA_ALIGN(upp_buffer_b, 8)* n. x- H& q" P/ m. l( B& m0 t9 X
0 ]8 O5 L! K# {* ?% c7 r
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) x( t1 ~; g. y* A
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. @, v* _2 k4 o% O$ d- \6 x. l5 q

. H% @. s7 B1 ]+ V0 ]* t8 j0 D
$ B  i4 G* j- w$ s, Sstatic bool server_upp_data_recv(Server *server)
& c# y, N  Q+ e6 L! k/ u{- q( v$ b0 q7 P- |0 F2 z$ o0 R! Q
    if(server->upp_channel_a_recv == false) {- s/ ^; P" [" x
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 [, Z3 W4 l# r
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 P5 A' E% k& n8 {* G            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 C* D2 Y/ q" B) D9 K( ~" o0 m0 k
3 X  D7 E, s4 ]+ f
8 a, `) Q" ]1 |: G8 Z5 w            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 Y+ a) t2 x0 b0 T8 a2 {

: w: z) ^9 N/ m1 g% i* h! T            server->upp_channel_a_recv = true;//
6 y: g- K6 R$ e% C, r. I            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);8 f% t: m% e) F) }* ]; {
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
8 R. a$ g! J- y9 m/ B7 [; A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
1 I: Y* n5 K- z$ ^            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; E9 a$ O5 a3 I) m5 E0 K. d, g8 Y( v5 N4 R5 g( a0 J/ ~6 p% D
            upp_error_count = 0;
/ h" Z; j) u- `# W            upp_dmai_int_cut = 0;
9 I1 ~* t6 T5 V: H3 t7 @- E' W6 x6 t& Z& c  s
            // fill in data
5 S$ q5 ~; ]1 b! H/ y            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 g4 O9 D1 ^7 `& S- @0 N8 |: C) D            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" Y+ m& |2 M, G- V$ Y        }6 H/ e* F7 b1 }/ T2 X
    }# X+ c* ]# K. n4 Y. B5 g
    else{' u& d2 C) P# M) Q7 V) c" U
        if (upp_dmai_int_cut > 0){
. C* u' o5 V$ h/ C6 p  \! N, J: Q) ~2 s            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. A0 l' ~4 m/ _* y4 W5 B2 }
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);) K4 U( }6 ?7 q6 J3 u) _

: S4 T5 h* L- k- Q1 Z
) T/ t: E- S5 e2 r) V& z, E            //copy data to upp_recv_list_busy
, D6 ?' g" G# i5 }$ P. J9 n9 @            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% ^9 R, c2 B+ |2 K
1 O1 I5 ^  K& L' _8 R! f            //
. S. w, l; r' O' X- l. T/ {            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% c5 ?+ @, m8 N4 F2 R6 s2 y2 [& C" L% A! V1 r
            //
$ `9 U8 H" J5 c' J. K0 T1 v) X3 n! }            server->upp_channel_a_recv = false;//
0 g1 Q, j- B9 U, B$ j1 x9 ?0 z- X
/ \9 w' P7 u1 n; A4 ]$ |# P            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- o, \6 R- U- S( P5 ~# `+ V) }        }
+ u; ?6 ]- s; w' {. K$ k, M+ H    }3 {# T$ O3 _2 R1 c+ \

% z% C* J$ I$ L: F  i- j8 e% G+ ]+ a/ A7 X' ?+ ?+ k
    return true;
5 s: _3 a6 i# Q* N0 S6 _1 B2 g}* m7 J& t0 H6 q
. l, O0 L) f6 F" L* ^" @
static bool server_upp_data_send(Server *server)
5 J& t* d0 W8 n: W) z+ T3 e, A{
  B' [' r, _% `. Z( F: Y  H    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 O- G3 k, z3 |. Y4 M8 {8 p. O: X        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  r6 A# h" X. C$ M- J        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 t) g1 v8 ?$ V! Y4 Q9 m( m9 [        char tmp[128] ={0};# k5 B, Z" W( p0 G) ?
* P4 E7 k8 j+ {, J; T6 i  ?
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" s* G# v* y3 ]  H1 v/ |        print_log(server, data, 64);
$ O- f: ]# `0 H# Y$ e" n
" Z0 r, ]: L( U        //$ c7 l' n& U/ K4 W: Q: `
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 c9 }1 ?+ ~; X/ y        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* _" k7 Z$ V+ O2 s1 g2 [3 q
        print_log(server, upp_buffer_b, 64);
/ i6 s+ b- h0 q
( L' ?7 j; g6 i( F6 m+ q/ @  `& u        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
0 K. y0 ?" B7 r: u3 s" A9 i        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 8 ]% l& d2 n  p, Q' F5 }
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;6 ^2 y! Z* B$ ]9 A3 X7 H3 c1 q3 I: v
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* s4 b# g, D7 \! {. B4 r

% H  K2 K. F* y9 R8 r        memset(tmp, 0, sizeof(tmp));
# T2 N1 r9 X- j  L1 M        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , ?, s# u( {3 y2 n' @* [6 y
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 U& O% ~2 \) S+ u, L9 k
        server_msg_send(server, APP_CMD_LOG, tmp);
8 J& U$ ^7 Q, @& ]/ z! ?2 z) X) Y: l; b- ?
        upp_error_count = 0;
  R7 ^0 \% c1 ^7 n0 X! C  k; b) M3 s        upp_dmaq_int_cut = 0;
% O% G! N% n% a: @' a) y        // fill in data
; l) n4 [5 b( P, k0 {        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ' L6 _5 c' @8 @- Y  C" y
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 z# x3 B$ E2 O& A8 {# h0 y
7 q3 x* T4 c( f        // wait send success
/ o' {( q+ H( u& x4 q! V1 ?        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& m- j$ h6 g/ ]8 z  l
# s$ w/ o" z9 Y! a0 k3 i        // make data node in free list
4 c4 R8 r: n5 S; F3 w" p        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 \9 [9 K* @# g! _8 F1 t& f# F
        server_msg_send(server, APP_CMD_LOG, "upp send: success");/ C1 b& N' o" c' f, i; E' \* ]
    }! V" r% n! i  g  m2 h! g: x8 r
    return true;( ~; }2 i* L' W3 x1 n, X/ h
}
# A& g) I9 Z) i! h3 F; _3 n9 C+ i( j! [0 ~' }1 r4 e+ c

5 n* [- ~7 T! z( |
  m$ C2 L: \- u% a
- k  X$ X" U! Z$ \4 \

1 P; P' x' Q6 m& A8 t

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* q- Z: w" V' a. I. ^# q* j$ r# w

5 ?& W& Q. W- t. i: L) U

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 02:25 , Processed in 0.041509 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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