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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % T0 }2 }; @5 k7 {7 r/ w5 G' S
0 v2 D% u; k- K% A4 Q2 D8 I' x
问题描述:9 K  C6 g6 ]- _" o6 Z( q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 O% N8 J$ C3 k4 z9 a
/ {2 k5 K+ K3 E) z) ]
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! g( R: q+ H( ?- O: p( ~% `
" c& u. i+ ^4 x! r1 [: ]- d3 l% ?9 X1 x测试结果如下:
7 S$ R- j) D# V7 z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' e- X; b0 q' Z: l  s+ I* a: B, O' E/ b
# Y& E. o5 C1 i: F3 H
9 }- E* z# c1 i% R- C8 t1 D8 o7 J  u
备注:
) Y2 V' v3 Q, x6 _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. }4 g% Y" l4 v- X6 b# |! I$ ?0 K
2、相关代码如下:
. o. R0 Z7 I( t7 H, E6 k4 f; E( _) j//UPP DMA缓冲大小512字节
6 a  N- m- t( B6 C; m#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
9 P# b+ ]7 }( _$ d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, k2 F+ q# z) L6 W( b2 k#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' d2 q4 U! T0 M! K. \+ E6 U" `' q
) b9 `" k: e' x
; ]  W/ q% e" \2 a& I: y9 l; V9 c& c//upp接收、发送buffer4 ~1 Z, g7 K% O- S1 C
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 N% Y  ^" ^$ e3 P% N#pragma DATA_ALIGN(upp_buffer_b, 8)
( y% ^- ]# F- N# a( r4 z
. Y$ i2 f$ L) P- U, |5 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 @% v5 T0 O! {# V' `- l9 Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! ^  [1 p" X4 e# C/ L+ g6 s& `0 B! ~
* \8 q: K! j' B/ l7 \8 {; R  Z! q1 a: |1 k" c
static bool server_upp_data_recv(Server *server) : I0 v6 J$ J  e" _4 N$ v0 j4 \
{/ r0 j* O# c$ M
    if(server->upp_channel_a_recv == false) {
% H* X: ?# X0 d$ `        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 Q' h1 K; p/ n+ E3 R6 S) n- W7 P        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 k! D3 @0 U+ w( H; x' t6 G
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: M# X! O. {$ I5 e8 c' n
$ u1 s: d7 u  u$ _' i  K+ D' L( Z
* u0 ?/ ^1 J( N+ q% _5 j" T            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  p% ^6 s& `7 N. `

* S, W4 _5 y0 u  m" H            server->upp_channel_a_recv = true;//
# Q5 b5 O" [6 b            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
& ?$ N8 b; K  P  t4 ?% W7 d' A' R            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
1 p+ O4 N! Y( d            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! f6 V  v6 E2 b! Y% |* a0 L2 R& E            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* Z$ Y( u$ {5 p& k; Y, u2 Z
1 A  w7 N5 B+ b; ^! |9 D
            upp_error_count = 0;; a* C# y5 I) S9 s
            upp_dmai_int_cut = 0;) R- a$ Q  M( E) l" @1 h( Y

( `- u& K4 V( C7 }( x* _            // fill in data
6 U% Y/ ]  d' b            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, l6 f8 ?2 Y* G! E            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# u- W  P; F4 k( H; t8 N7 o6 m        }
" D9 y: ]6 f' [: k. I    }
* k8 \& ]/ z9 x  U( z* o' L    else{
% o- M. R! ~" N        if (upp_dmai_int_cut > 0){- G1 X% [5 Q& ~7 w
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; g% W: H# \5 v& ?$ G
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; F9 \! d* v5 m  [; c# \% s2 \- }/ a3 H+ i. f; U
4 m; h( f# z# T+ p4 T6 o: y
            //copy data to upp_recv_list_busy
( ~, t$ F) l% _) I; M            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( n- f9 S0 V. F/ t0 D  e4 y
+ \( x9 a' P: m! Z            //
  R) e( a. E  B- f- n8 y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 s+ M$ ^8 d3 F7 p  |4 D8 a9 [5 h
5 k! J. [% R* r            //
* F& y6 a! s$ \2 s4 A: m: H/ ^            server->upp_channel_a_recv = false;//; a1 K' g$ k& _  v
, S: u4 [$ a) W7 D' K9 S4 o9 {
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");, V+ o& b& i+ `  v  h9 L# N( K
        }
9 |; l: `8 V/ q" C7 z. z6 Q0 Z    }# j$ `$ [% z3 z3 z9 V. R" m$ u4 k

- q9 d" P5 M, L0 }! g3 _+ g, }0 C. ]+ ?% C3 M
    return true;
" Y2 Z" H! n8 F+ c/ h% r}& G, R2 G4 Q& h' ?
1 Y: M: M- k; l# u9 [0 _
static bool server_upp_data_send(Server *server)
% w; e0 e3 h. _{$ y; R% Y6 v9 S% r1 W
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% V9 Q4 w* l& e# V        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- h$ ~* c4 R6 j8 M
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) y' Y+ @- |+ W$ M8 d/ g/ y: ~
        char tmp[128] ={0};
- c, g, W* |% J: k) _% L
3 i. Z7 v/ @0 n" y3 ?2 |7 p! R        server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 T1 v: g# q: B& r7 C  a0 {8 S        print_log(server, data, 64);
* L9 V( Z1 d9 w3 N4 @7 ~7 |$ T7 m- c% m5 P, Q7 u
        //$ M7 @" c' ^: X, Z+ I5 ?
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; ?7 d2 a: v7 |6 s        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: E; y1 m5 {! t8 c4 K        print_log(server, upp_buffer_b, 64);$ o: i: R' _! ~$ O& p' ~) z

9 v5 E' I0 R' v, q$ ^        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);* @+ _# L# L. y4 l6 o, _2 }) |
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; % v' ^, F- x; g9 Q6 K7 j1 V
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) J! B* F  P. b$ I( a3 A8 V* b
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 y& x, o8 [$ O$ V& X/ l. }5 |$ ^- ?; p6 U  l
        memset(tmp, 0, sizeof(tmp));/ W, O- d/ {0 g5 T; P* |6 z9 ?# @
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / F: }  u  i; _$ y. j" a
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% M8 Y7 D/ b# Z/ p0 g' K
        server_msg_send(server, APP_CMD_LOG, tmp);! B- e+ j( ]+ t' H

1 |4 w( z$ ?' I9 k! f: V        upp_error_count = 0;+ D$ x% ~1 [9 K4 R
        upp_dmaq_int_cut = 0;
) }  Q0 G- v0 ^# ~' Z6 A        // fill in data
# {( E- T8 Z9 ~5 D        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ X" b7 B$ G$ p- g4 @        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 B. c, l: f: U3 [
) o$ o# e) P( g9 F; j
        // wait send success
, N. j$ I9 B6 u. M7 S        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * c) k: V3 x! U/ Z
9 [9 _# o% a' u
        // make data node in free list
, u2 \6 t* f6 C, S/ L        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 z+ |3 o' t: H; V% b. f
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
+ c7 a# K. I9 {  T2 R    }
0 N/ ?9 c. n$ Z1 r9 H  G    return true;9 @5 K) ~& G. J0 [2 F
}
8 r+ C9 Y! _; r0 k* T  \) K1 [! m

' t' G2 N' w) G% H4 x  A& j+ [8 B$ c9 o

' X' A( @. {$ M( G1 f& u2 @8 U9 D5 K

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* o& ^9 l: i9 T9 s4 x: r0 R

( j' f' {; P( F3 G- B+ b

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 18:54 , Processed in 0.043458 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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