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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 Y7 ]# `2 s7 h! e. ?1 v6 h
, v) h/ h$ {; d8 |5 c+ d问题描述:8 l  G. F: b# y! I6 r
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:0 r' @7 c: F+ o, x% r0 w' q- X
% I) h$ ?8 N0 K  |% x" q8 a
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 j/ m: T* R9 z3 a

/ K$ B& c( t( f5 g& Z! j. g$ Y测试结果如下:
+ l4 h3 e! H: }1 h/ W: u138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- D; J; N8 C, z: Y  C$ t% G, l. c( o

: {* p. L) f5 i备注:7 r9 P: V% l5 c) {/ R' F7 G
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
. E- m6 C! x4 `. ~
2、相关代码如下:+ i% g7 ?4 E& W) j/ r8 T$ f
//UPP DMA缓冲大小512字节1 D, z4 }5 y3 r  M: h7 I
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ Z  w9 u8 o8 \$ E1 I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! @3 J4 }! b0 R# }4 y( [! ?5 n4 e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, G# r: f  I: Y, ~9 B1 Y8 q' l. m! j/ s' |+ _- }

" y$ t& U1 x1 i3 _' }0 R9 Z//upp接收、发送buffer7 f; F7 ]* ~) K
#pragma DATA_ALIGN(upp_buffer_a, 8). J4 K. B# f! E
#pragma DATA_ALIGN(upp_buffer_b, 8)
! S1 ?( S1 ^/ K7 i6 x) R" K( R" R4 i- k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) g8 C4 }$ n1 |* B- e3 ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. g0 h1 B9 }2 e2 O* d' p

7 o. m3 L6 U! c# ^) {) V9 @( ~; W% _( s9 ^
static bool server_upp_data_recv(Server *server) 5 V7 A9 l/ [5 Y. Y
{3 L5 N6 s1 N' ~2 b" [) I
    if(server->upp_channel_a_recv == false) {/ a# A. G! r0 j& K
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! a. A* y/ c( ]- I        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 i+ V2 t! s- q            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 o" D" Q5 ?& h

+ A/ C& q* G7 w) T- [5 |$ x0 u
- ~9 s5 R* g& R9 X& d            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ f" E# w! d2 i4 a1 W
2 D4 F/ u7 t8 _3 F1 T: m4 c9 @* g            server->upp_channel_a_recv = true;//
! y( [# [" |+ M7 K) M            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
% |5 V) Q5 I: ]) M            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;" _8 L8 [" L7 p* Z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;$ y% W& C' V2 d: [1 e( R
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! r- P' x4 y1 W6 m! z- |6 W
- f8 Y0 R; P* {0 c  N- ]( `! I
            upp_error_count = 0;
5 P$ h4 v. d8 b6 N* y( q            upp_dmai_int_cut = 0;# C# H9 q( d+ P: v% z

+ a) P% |6 ]( ~5 |            // fill in data
1 R/ A0 r5 a! o! L6 x1 ~            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 |$ M# V6 ?  G
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( K+ `, m& _/ p$ Q) T3 z        }
8 H! j: W" q9 r. t, K    }
% g. @) I' B1 [4 j    else{" m5 ]' N8 D/ b  b0 \( v7 e% R; E
        if (upp_dmai_int_cut > 0){/ c  _" C# p' c/ g) \
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 ?3 w5 i5 r: Z" N2 x6 |6 b7 m, V
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! H' p  v% R6 z# d, T; q

1 r/ W, E, q6 D! {7 l* F+ j5 Q3 s+ q2 c: A( p* A0 O
            //copy data to upp_recv_list_busy
0 D' O9 u" e( R! b* _+ }0 I            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);/ v8 Q' P" n2 ]4 Y' {' s

8 ?  d/ s. G# D# W6 P            //# S6 g; T0 f8 [( A
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% |& v& q* ~* K) h- \+ s% {3 x' N4 E, Q
            //
4 E3 x! f6 r: _9 b9 I            server->upp_channel_a_recv = false;//
9 K% a5 c- G1 J% o- }' G# X5 a$ H; P& i4 O1 \
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");4 g, t9 Z. {- S! \
        }
$ h4 k4 L. U3 `# Q3 H    }
# o& _7 l# o2 [* X2 I% T" l% H+ r+ x) S6 ]& U3 l; y% [
# w# M/ B- g" \( G; M8 ^/ c
    return true;
& s! P- V2 M- @0 f) D}7 V2 O3 g' ?7 F" L# A
* {7 m) w5 c: R3 A
static bool server_upp_data_send(Server *server)
/ g3 l& e+ b% Z$ p) N& Y$ H! K{) |4 A: j* A; ?; G9 o' c
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) N& N/ c8 ]+ `' q5 a        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; T) M/ ?' |, ~2 s( `7 s2 h. i        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* n: D8 C5 _, w6 f
        char tmp[128] ={0};
7 [3 \3 p2 M; n1 |4 K* @: C) [* B3 Z. b& A3 t' P9 Q6 J
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 }% f3 j" m7 o1 L& k: }* D        print_log(server, data, 64);
. D0 }4 G! i7 l  ?  w+ u, p5 H5 ?7 b9 a( f( B) I  x1 s9 @
        /// R$ ]7 u" K/ |3 l* E  B- g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ K6 ~7 k9 J3 R4 ~        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
+ p* m3 X4 e' I8 |* t        print_log(server, upp_buffer_b, 64);
! `( C: o0 w7 g& b( `# S9 [; q, ]6 x3 U) d/ o! e* f
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" r$ R9 a, L* n' `        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( a) r( q9 V1 w        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
! N: J8 p2 V; i: r+ a        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
/ `2 {5 c6 Y+ m$ R/ @0 f+ f1 X+ c3 J2 m: N: u0 @+ I
        memset(tmp, 0, sizeof(tmp));( J' k) B. \8 v3 D) m7 w
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . D* u! J3 r; k: _
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, g! Z0 U2 o9 N0 F        server_msg_send(server, APP_CMD_LOG, tmp);
7 G0 C- l$ {2 v. h: c3 J
, c! X4 r9 c- Y1 X% N6 `        upp_error_count = 0;4 L, {9 ^" f" k2 v
        upp_dmaq_int_cut = 0;0 p' p3 r* P" ^6 k' G
        // fill in data   E  g# o7 x, o0 c1 T/ Q% o- s2 |
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ k4 i4 }1 j6 u        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% I* F3 {5 F( `  I8 ?
$ ?3 O- x) G5 o2 q9 i
        // wait send success
( n; H3 q& I+ {5 I        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & H, W: h. c! y  }! I( n
5 w& o  I0 V& a. b9 @7 Y9 ]
        // make data node in free list
6 x7 [: h) d- R1 L        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 E! d+ h: d& w
        server_msg_send(server, APP_CMD_LOG, "upp send: success");, E! b  j% L8 q8 V  H4 L* S: S
    }; F* {+ o" c! j2 o# j
    return true;
! n  |7 w  h: N. X. z0 x; g/ |}
# b; @/ @/ L. K& ~$ h, |. y7 [% s0 [2 T/ |2 f
* E8 S4 ~; X9 {; D/ h
; s+ V- ~3 S) u, q) I

7 }' D  S# T1 Y% F5 U8 C5 ~- E2 R! I& S

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: M$ E- V8 D4 d  F; S7 u5 P

# n: U& `, G6 Q, U, @/ h' ]& p7 B+ x

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 23:17 , Processed in 0.038689 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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