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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& {* z7 o' h* S1 ~2 F. v8 I# f. O6 @- ?' S3 U8 t" x& F) w
问题描述:% V, a; [3 d0 v7 d
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
4 a( \" R8 D! F
# q/ `# U2 d# e8 b2 [图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 C9 U& @5 U7 t7 K  V: {$ }

' B1 b; }2 a9 F/ i9 c测试结果如下:1 H' d& Z) Z' E( \( a% K) i* I2 @
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# m3 g2 H1 l. ^& G9 p% X; J9 |5 i1 ?3 C$ A

4 `& m4 I% B  [0 [备注:4 ?3 t( u! q: @9 c
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; _; x+ A! z4 l% U2 g0 h5 q
2、相关代码如下:
+ v- p$ P/ }$ O  m& D! V2 N+ [; r: y//UPP DMA缓冲大小512字节4 ~5 E" g2 i) e3 D' C% ~+ n/ L
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- C7 J6 O( q8 b. M#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% R4 c4 \- R5 o5 h7 ?/ B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
5 S7 Y8 w* Z2 d( T) X7 ^5 @7 e1 ~, S1 \) I: j4 f$ F* s
: Z- Q+ i! z! k. g5 F) j3 B3 z
//upp接收、发送buffer
% D  a" L& G2 E& M0 @9 |  J; ^% _#pragma DATA_ALIGN(upp_buffer_a, 8)
: q, q$ Q: s4 Z% |' n; h: h#pragma DATA_ALIGN(upp_buffer_b, 8), e3 ]; H+ Z9 s4 u4 M

0 W, h% ?: T! h/ A. O' J8 Q$ h* bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 h8 Q  l+ y: Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& o# [2 u: H5 j$ @4 M
( f* e! K  r8 p0 G, Y
6 E( Q( {$ y+ v9 @/ O( B% v
static bool server_upp_data_recv(Server *server)
3 I/ A7 J; T6 v3 ~1 u- Q4 J{. \; B: I% G/ ^1 K) i  R
    if(server->upp_channel_a_recv == false) {
7 w+ M) F3 ]6 t# e; Z0 I) n        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
9 h, J! S9 R" {9 `, D. J* T+ A        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 f' |) m4 U) J) U1 l4 B7 u' j# x6 x
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; A. M2 R7 \( m7 Q5 Q; y  d9 ]" J$ g) Q* g4 f/ K
3 p) x$ s  _% v* N; h
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' C% |  q3 Z' @: V* _$ ]6 P! f$ u9 L2 |& Q/ P4 a; |" v" R
            server->upp_channel_a_recv = true;//
0 J0 r; }- c/ H+ H# e! ?            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  n2 Q  Y$ Z0 g1 L
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;9 _: \1 f- M- @: V: o
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' ~8 I1 V1 R. _; Q
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! V( N. [2 |1 U' C) g. e# G+ t
2 G& Y& Q+ {& A
            upp_error_count = 0;6 s. `) r! Q3 u# C7 A
            upp_dmai_int_cut = 0;
# G4 X% }1 X  |1 j# N/ a1 Q
; u! z0 H8 }$ ?' Y; U            // fill in data / G6 F1 B1 k! N1 W7 k
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 j# N$ z/ @7 _0 m3 d            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# Z0 c( q( M0 G3 X, V3 A" N; s        }0 S5 ^5 J  L1 @; @$ L+ }5 O
    }
) f4 Y: U# N+ f, x+ b" ^/ n    else{
6 b8 p. t9 `, z8 c+ U8 a* T- \" k        if (upp_dmai_int_cut > 0){% W% e; {  t- M) s, l
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);  ]7 e) a" C# ^$ S/ C! ?' n% N5 i
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 X4 n( l1 p4 U& u+ v/ }! c/ S
3 V& `, C0 T8 m
, t! |- U. `8 y5 {7 g
            //copy data to upp_recv_list_busy% [. ?$ v; ?0 v+ S) K
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% C  @( D* [: }5 }( r) U8 e9 @. U2 u
7 n6 C, Y7 c- [1 Y+ |6 S* r. S            //  v3 O  X% K( c/ w) T
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 l. t6 R! V: o2 ?, y0 X7 \2 o* C. n

: }9 `1 l' y$ R' k: y4 Z) `            //; J1 Z  H  E- i- _
            server->upp_channel_a_recv = false;//
# ], r5 m, G% z  n. ~9 a' ^8 r0 o; A5 ?, ^$ }! E0 _. x
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* Q, P1 c, Q% N: J. t6 s        }
8 ?9 \1 `' k5 N( O" ^7 [    }
2 P4 \- i9 j! s% C% Z
* P, Q- Q7 w5 H( S$ T1 n9 |9 M1 R8 ]* E" r) [/ S. ^
    return true;) g% K+ L& |. M; J5 I
}% R( v( ]* b3 r0 y( `
1 ~3 E7 g2 p! \% B2 y
static bool server_upp_data_send(Server *server)
  k9 s1 H; r2 t9 e! |9 _2 c{
1 d6 j- L* T& D& g7 _    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 S  t$ Z4 B) c- g        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( m) l3 ?& U5 K5 Y. H9 H
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, T; y# D: B/ H        char tmp[128] ={0};
! g6 v; L5 O! L- g9 p& z
8 P6 G' `, U0 P0 T0 O        server_msg_send(server, APP_CMD_LOG, "upp send: start");
: a$ y4 c+ D( W, J& p' h) ~- I        print_log(server, data, 64);
* y9 j2 N6 v2 U
% t  n2 J' F- B" R' q  {        //9 s: p8 y7 A' x& t/ z. E- a0 |( c
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ V1 R" J. g  d5 M
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. [4 f! \/ a& w# K
        print_log(server, upp_buffer_b, 64);, m8 |+ n$ A1 i4 c
  F" W, O+ _! e
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);  E" z: \2 m9 ~3 j' V7 d& l
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 `+ T; z8 |3 x: t, k4 u        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;( W  N& \. u) F6 a$ Z( J6 A
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;8 Q* B* \4 @1 C" O" ^+ m5 I; t; K, ?: l' E

+ ~6 x; j3 c! [        memset(tmp, 0, sizeof(tmp));
% T9 |, k& z- z% L        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 I8 C  G# Z7 E7 G% J
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 \1 p" _  D% `. E: f
        server_msg_send(server, APP_CMD_LOG, tmp);
# }( D+ ^9 G$ V/ ]; p
4 z' T. \" U! A4 k9 @/ V        upp_error_count = 0;& T' g3 ]6 G+ H# B
        upp_dmaq_int_cut = 0;* W, l' D, c! D# Y) D) g
        // fill in data
$ g$ F1 @8 X4 X: W7 H3 g        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % }1 ^  I  a5 y9 v9 U
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 R: Q' m% A$ h4 h1 \& t& w$ s/ ^- {# C$ v3 `
        // wait send success
6 L6 T3 t+ y% x0 o: a4 x        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 z& k% M& X3 h) s7 f# S' E% A$ J. W6 ]$ f: K7 k
        // make data node in free list
' u3 o5 I) K  R! F) o        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ B/ d( w) M0 n8 A
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 I( R  w; T6 ^" j) F( ^    }0 F7 |7 I; |/ Y, x' {7 l) D
    return true;6 m! i0 K( O1 e$ u# B
}! ]& r: a1 E! s+ e' G# g* j% v
4 F, a) U  |$ X/ Q  `' b3 s( h

4 x9 F) i5 b1 D( k6 G% g9 C" `1 M- K+ ~# z( G, [7 r, H

  |, x& y' t$ p, d
; D- m9 ~, ?! v+ n3 V5 Z' m

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 p9 T) `$ V. c% o  ]1 \
7 c  C# m! G2 w$ y  @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-19 02:00 , Processed in 0.045835 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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