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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 r/ V* {; A9 G- t+ D: D1 n' S' Z9 ~' k( Q
问题描述:
3 g  k* q3 ]; t2 P' y" e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 L8 D: l/ S5 A3 e8 ^" h# T  D5 l4 B& N; o8 s, s7 A9 V# X
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- c4 ^0 u7 T+ K6 U9 j9 R  w( x( {5 v5 E  A4 `
测试结果如下:" ~% C# c* F) `
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?2 [- C  D7 L9 b1 t
3 P' G1 D2 y; L: D1 Z( r& m5 @
6 m  a" v: D9 w1 L: J  s& u1 Y' M; Q
备注:
% c! z; v: r% M3 i& x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 c1 n) G' l. w( f
2、相关代码如下:6 z! ~- N; s1 k, M1 Y
//UPP DMA缓冲大小512字节# M/ B+ F0 e4 B4 i
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 b- M# L. y4 F; V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; H! ]5 ~8 K4 W/ ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)* r8 t- t9 z, y+ _7 o6 c6 `3 V

, q* f! S' ?, E2 t' {- P, E! J# u. A6 Q, t' X4 Z; ?
//upp接收、发送buffer
  T- ~* L, @: E& K5 [- }3 k#pragma DATA_ALIGN(upp_buffer_a, 8)/ s$ G+ s& [4 j$ w. B
#pragma DATA_ALIGN(upp_buffer_b, 8)" Z, n5 q, Z: P& G) H5 X
. z% ?, V+ L. s- \) ]- b+ r
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 \' e9 h( E8 ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. {( R4 }2 I5 a

+ t! q. f2 o5 c! H! g5 f8 k
, ]" \) j) A" @" L$ V. u. a& Rstatic bool server_upp_data_recv(Server *server)
8 Z/ x$ ~5 a, `  p2 o, w, `{7 |, k  A# C- p5 I) U
    if(server->upp_channel_a_recv == false) {
3 r& b3 V% h$ o1 Y4 C        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# L/ _, t' {( a2 k        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 H5 a' F% x  O& w8 S0 r8 u/ e! K            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 z. H2 [7 q) c* C* q
1 _- @: L0 F6 T# L1 ^
' z0 n* i* N; ?
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 W6 `, l3 M5 [$ M+ _
7 R9 L& q& w# D' g; D# c/ G/ e% o' F            server->upp_channel_a_recv = true;//6 j: ]0 ?# A& p# [; F! L
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 S) Q, `3 l2 \7 i. u) x* L8 R4 L3 B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;( \7 O9 G3 F$ i% D1 g
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' d3 x/ x5 X4 f. C5 X9 m
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 @, _" A$ A5 H* W4 y4 g* d

) n5 G8 }2 k! L$ u8 G) x            upp_error_count = 0;
- q2 n* G% l6 V# m/ O            upp_dmai_int_cut = 0;7 j0 m4 N: C/ a2 Q" s' E
; P" h' @' Y: }; X
            // fill in data 7 p2 b6 o8 b7 ]/ `& ~. m, z
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- S7 e& T* R& t8 `# v$ r- Y( z3 i            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  P- |' Y3 a2 `* j) O5 I  F        }
- K$ r5 M" b* _9 |/ j9 h! U8 @- W    }! _3 \9 }9 Y& q1 P+ Q
    else{& {. U- b9 D( T/ O6 I  s
        if (upp_dmai_int_cut > 0){
0 Z1 Y4 C( G! K- m# J! R5 j3 t  W            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" d) Y3 Y; \7 t7 T7 c2 e8 m            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 }1 w  x2 n! \, ~9 d. R3 Q

' p2 |9 T: Q& y. j2 ?9 M# F1 d9 [/ c/ `% ~% G3 v, P2 V
            //copy data to upp_recv_list_busy3 C: ?. B; q# {2 |& _
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, G( ]# ^5 x) }7 A

: H7 q% ~# e$ Q% H# j0 j            //
: d! o6 M. q! C            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, u; y( z+ k3 U: S& A
$ L& M+ R. q( S- r- W5 M# D# X% a            //: i4 D7 ?& W- w7 s, ~
            server->upp_channel_a_recv = false;//
; v  C# u' I; I' N$ J: E( @8 H' o2 ~( C. f0 B: r( `
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& ^9 w6 f- J4 l( A- [; [; H        }
& B, i# {2 V- E* O* K    }7 \- j' X# J2 l3 t
& P! }/ ]' j9 I  ~! \

/ d$ Z9 V% o- n" Y% z2 j3 v    return true;! S  q/ _: P1 s, Z* x
}5 f- j& h3 Q( G
4 A) h$ ~4 I4 T9 L9 n7 F9 e( {
static bool server_upp_data_send(Server *server)
, L: T4 Y- @8 d{
9 Y9 g% R* U( S0 \% S* C8 G0 ^    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! d( i) E9 y) ^# A
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 b; m, W) |8 l8 z- g: }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 s6 [' N* E: p& X% }' m0 \) P" r; _
        char tmp[128] ={0};$ Q" X2 p2 F) I. z

9 x. T" W  d- A& I* A9 ?  @; ]        server_msg_send(server, APP_CMD_LOG, "upp send: start");3 d( ~0 h0 c& O& |
        print_log(server, data, 64);# Z" B3 A/ k6 }# {

, }! r) V4 k0 R/ q0 }( `7 _7 j        //
$ o0 K/ t$ h* K0 r( p& u7 {        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- Z- ]6 I) p6 }* j        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 T/ u6 a8 }6 ]6 S, R. e
        print_log(server, upp_buffer_b, 64);
6 ~# o: Q5 `0 Z; {( @7 ~# d* K% v) K$ ?0 L$ \
" f1 G- e" u$ U# P5 l9 Y* ~        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& A; A' y' P" Q        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 u. Z- L8 U6 f  V7 B
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
* q8 q/ v/ h0 y% y/ r* [# W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% y. H4 M7 w3 B* C0 W/ S. P" |3 S; t2 B
        memset(tmp, 0, sizeof(tmp));( o+ i, v8 E& j- Z1 u& ?8 q2 D, c( M
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 K2 G. o& }+ J2 ]
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 b% u3 J! \( h$ M+ v& b/ l
        server_msg_send(server, APP_CMD_LOG, tmp);
, {7 E8 V7 l, E8 y9 k. m6 m: x2 [5 G: b6 {. o
        upp_error_count = 0;
9 r1 {& S& ]+ x8 _3 g. S        upp_dmaq_int_cut = 0;
) ?. Z0 B, p' I$ e5 q        // fill in data
3 h. o. Y8 l4 U' s        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. H3 n" R! K% G9 Y9 ^        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");4 K7 L# T7 F+ O  n) y
& _* G' v: ]4 D: Q
        // wait send success
. H; `0 K- ?4 _/ W! y* L        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 O0 ?/ M: B( I5 {8 Q( D$ c# ~" g2 q
        // make data node in free list $ [1 ^+ h0 E3 n1 ]; i8 w
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ ~: _; D& W4 P2 ^6 N9 Q; c/ J
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 G1 w/ Q* E; H: _$ S" V    }
3 w- b# O& u% W" v) \    return true;# z. a& n5 y' z/ \5 o+ J9 S# Z
}
! F; X( `% V' W: h" L0 ~) V+ N; {8 M: P! I0 o$ k
# U& p& n6 E9 e9 |
* L/ D1 _- y4 e9 e

6 V2 y8 |0 k+ E  k+ N
4 [3 d4 j! G/ M) U( l4 c# L

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
2 p/ W7 {- s6 Y1 q
) j# Z' {$ @7 a! d

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 05:34 , Processed in 0.045315 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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