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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ q$ i% Q- \3 J- M' C
# h8 }, M5 X: \, m/ g) P
问题描述:7 a4 Q5 ~( V. e* Z
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; ]/ z1 ^) o! i& |. K- x
% z$ s  K. a/ _3 Y# z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" G- }; ^; w& P6 R) E( t% A+ R8 f2 D* K4 ^- o8 I; [" p# W
测试结果如下:
* j. h. k; o3 a* S; z0 Z6 n  Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 z, l. i+ G+ F1 h; K9 `+ o& ?& a0 C& M- O7 ]; X( J

0 t2 ^2 {; n5 X7 I- V9 ?' k备注:( n8 P" _% w& i& }& J3 m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% @( x, ]5 H3 l1 {* b4 o7 ~
2、相关代码如下:$ M+ j) {* t) t; v( H. n
//UPP DMA缓冲大小512字节6 r. |4 H( n5 T2 g9 |
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ A6 c/ r! `6 g7 r4 e/ K$ j$ j* e
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 B# j( x4 Q+ |- s, s) @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& \5 h5 ?9 g% ^
2 H, h4 E) y# w* A3 K1 U1 r
+ }" h' j! a' y5 p//upp接收、发送buffer
, c) [) a- {1 h" A$ u0 t; l& |: E. ]#pragma DATA_ALIGN(upp_buffer_a, 8)
$ B3 B* z; h& N: a/ P#pragma DATA_ALIGN(upp_buffer_b, 8)) {) T9 D- }9 N, e+ Y3 h

, D* ~3 \1 U5 L6 Wunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; l( h2 A' N" O/ V7 U8 Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ p* @" h. B4 Q: ^3 ~
' j+ l6 n$ t; ]  s4 G

% X. L9 Y7 N* Pstatic bool server_upp_data_recv(Server *server) " }' V1 e$ g5 a$ Z
{5 s" U2 h8 E6 I5 C  w# t
    if(server->upp_channel_a_recv == false) {
/ O6 j: R" [, j, A) ~: b- K2 L# W        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, @! q# X$ R3 y+ V% Y( q- L& F, R        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 H$ o2 J- |) T: _8 f+ e            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' ?  `' V* Z; u: }; }5 D. S# A" J+ h8 \7 v6 ~; K

* Y! Y; c; w, t/ H7 ]) _            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ {5 Q  T7 [2 a2 E
. C# |* g) _+ [8 i# S) Z            server->upp_channel_a_recv = true;//
# X" Q. ~5 Y2 }; ?6 o+ u            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
$ z, O& ?& D( i( A6 _            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
; [# a* h& L8 T" V$ \5 N, V            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;* i7 Z4 @7 D- k! X& ^1 ^
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 g4 O+ F% x; E/ d/ h
' g8 X: y/ ?' ^6 W5 ~, H3 l            upp_error_count = 0;2 \0 T( g% E. ~8 |, k" o( s
            upp_dmai_int_cut = 0;
, c6 d! Z& w7 n4 z: ?6 v. S9 J! ?! M7 q. u5 |
            // fill in data
8 x! |: L/ F* x' ?. Z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 X/ M7 y$ f9 m8 N# R/ }
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");  p- p, V6 B/ Y0 R9 {- s
        }  a+ p( h) F6 ^2 M( @- B) u  i
    }4 r- C% K! J4 @+ q
    else{/ V" X$ p5 y4 h6 i7 k: M$ b. {
        if (upp_dmai_int_cut > 0){3 S# ?7 S) Q. _9 w+ F% E- U
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);) t) {- L' e" J, W' L
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
8 `" V0 M, f2 p+ N) w8 i) l: B8 J) g* W' M/ S; ~9 o/ [' S
' M2 S9 X5 N3 a$ l$ D  C
            //copy data to upp_recv_list_busy0 j7 w/ c+ ~4 J) G
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);! u2 y( ^8 X1 ^/ ?& d2 S/ }% D

, E8 J1 I! f6 X% i            //
: [& }. L0 \  P2 Z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" D2 y; F9 @  w# ]% X  L* S! {0 E+ Q+ k9 A( t0 [
            //0 ?) m8 v: Q5 r$ {/ m" H6 s
            server->upp_channel_a_recv = false;//
3 b: f% H. D' ]  w7 `) t* c$ B5 P1 r$ R( L) o
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");/ B  g+ ]; e3 f2 y9 W) y& r0 P
        }
& Y+ {" q" G% D- {6 a, a7 @    }% @1 ~( A  v5 ?2 @% ~2 L
; t3 F' B5 \$ n( `; F( V' y

, H5 w* g( c- F5 f8 D' P" A    return true;
" v; A3 b, m1 @- l) r. Q/ N4 P}
: ?1 z, _! L/ F4 u" U7 C) w' g! z3 i8 C; H9 x0 s8 `
static bool server_upp_data_send(Server *server)! [; [; ?5 x7 x: k9 `! R
{
5 Y# K8 Z3 \" \- ]5 ^& D( Y    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ }9 P9 ^9 P* [
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# q1 _/ p% Q' E3 P$ L" ?; R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ R( C" @4 x5 Y. M- {$ H        char tmp[128] ={0};$ I: T( m3 x/ I
/ G  k4 i! o' U& H
        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 J6 g, T0 Y: b6 o1 ]- y& c
        print_log(server, data, 64);. s/ w% W9 t  Y- |2 }
: g3 y: O! o0 @6 U
        //
7 V; ?% t! L( ?: c9 Y% ]5 s: a2 X) \        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
  v( B7 v$ j. g6 l        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: B# I+ t$ ]$ v/ M" S
        print_log(server, upp_buffer_b, 64);
' E$ u9 f8 o) i( p0 B; l
6 [" t( B) U; }! J" A' Z) q        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);8 X( u$ K6 F- j2 A5 S& Y; E. a
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( U; E( o/ A' l% n) ]5 i' k        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 j4 D! |, q3 X% c' h        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* m% \, |0 t$ Y% S6 O5 F

+ F# n! [7 _4 M6 O& p" s0 h7 _+ u, \        memset(tmp, 0, sizeof(tmp));3 [! s7 B3 u# H0 W+ Q
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # j  W" j) q  u& b, e5 v
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ J+ G( @% ]; K! K3 A6 z5 L& M6 c        server_msg_send(server, APP_CMD_LOG, tmp);+ M7 @" _8 K, h/ M  K+ l- |

/ \4 R# L* d9 G, n        upp_error_count = 0;
% X" z- o8 K7 o8 ?        upp_dmaq_int_cut = 0;
: W( Z# W$ c6 R! b7 }; r3 u+ A( s( d, [        // fill in data
, v4 x' W7 P7 p        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( w, X5 f% [! x& R( F        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 i2 Y* @9 s; H5 Y7 c: E5 E
& L7 X* n: `! I# ^
        // wait send success  x- u2 D# k! s# K$ N
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* |. p* H- n" a2 x$ R1 Z! H  y( j! L& ^" U
        // make data node in free list
" w7 a8 Z9 S  t4 ^9 Y) K; U' [        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( `4 V3 V7 v+ a0 X5 u# R) ~! g
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 x5 f( A8 o# h9 M0 r    }
6 M; \* R% t! D( N% G. f+ u& I    return true;
$ e% ]# W, V) a' d! ^% v}: u9 _" W. h5 `' K3 w

; S2 _( B3 Q: [
2 g6 d$ e4 ?" a; y

0 l# H& q0 q, r! O0 }# _
0 I  N! H9 W! J, z
! F$ h* E2 s# @4 q" `+ j' R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& d- u" ?+ ?1 h5 C3 b

, e3 ]* Z" f9 {! e( W0 k6 O" s9 y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 04:46 , Processed in 0.039446 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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