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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! b9 A6 v+ Y  W" k
# p% F4 ~& Q+ C) D4 W" `问题描述:; v/ z, r0 C- G, ^0 A, g. Y; O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:7 {# f& D; H9 t, K

. u' x! l0 y4 t/ ?图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 n0 @( `* u; @. o' J! o6 t* U8 H1 C4 w: L6 n
测试结果如下:
  n5 F- [. i' p0 v3 c# Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' S+ i5 n' j$ W1 [0 G0 R/ C; B4 ?

) E) _( I7 C4 ^6 ~/ N( u: i( }3 F" [4 D  S- [4 R; L
备注:7 Y9 b+ m7 f+ R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ ~% D/ j2 U$ U, C2 e: X( ^4 ?
2、相关代码如下:
- K8 h; S0 y! X% p//UPP DMA缓冲大小512字节; o! _  y. P, n  f' h; j0 t
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* W7 \/ v8 `) ^: X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 `2 [) L3 R# ^$ ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ Q; t' N. M6 e& ~- v5 l% H! H! d7 O& y  V2 T

( R* d8 e* E. @7 Q, a0 K/ z//upp接收、发送buffer; ~- n+ g4 t5 `% Q; r' i
#pragma DATA_ALIGN(upp_buffer_a, 8)9 C+ `5 I, |7 x: X+ Z7 E% S- {) \
#pragma DATA_ALIGN(upp_buffer_b, 8)' c! Y' ^9 H; d  t% b) w: R
' X& x& m( h+ q# x9 w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];+ D5 T' D1 O+ s+ H3 w& \* M9 Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
6 ]5 B* C$ _- K( |% n2 e
" P6 O7 l/ o7 k7 i5 r( T4 C) t7 d9 W, B
static bool server_upp_data_recv(Server *server)
' d3 C0 D- \; Y1 i9 O& A{$ }- \8 e9 H3 H: B  ~
    if(server->upp_channel_a_recv == false) {$ V) R4 a  y/ F, K
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");! n% w0 r1 S) @% L# F. a
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; Q) A2 Z! ~3 L$ v" G
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# i0 t6 ?, i: f1 R) u6 N7 t0 k- s$ n0 ~0 ^% V5 V& f
( J- D, D; H, n4 ?- J' O- z
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& q) s& y# o' n1 `4 c

1 a" d. l2 ^7 R. }# v5 C. e$ @# W            server->upp_channel_a_recv = true;//3 Q! Y  e* q$ F8 @3 g$ v5 f, E
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
4 N* F9 |; m7 a3 S1 C' ~            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( M6 `; f+ _: c( p- R. e& H            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
3 D7 T6 `5 Z% j  z1 U            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, l* @: q' Q/ u+ w
8 X/ n; Z3 @' n
            upp_error_count = 0;( Z" n5 d1 u9 _
            upp_dmai_int_cut = 0;5 \- ^. W0 C' L- i8 d! w) R! |
' T# q4 B5 \8 j+ b
            // fill in data ( F& E2 ~7 Y( O+ E
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( E) |1 ^9 H3 `* i
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 l" k6 }6 ?& z
        }
6 E( ^+ O- ~3 o' Q5 C. Q& a    }
( p' S7 K0 x7 [; K) F1 P. |4 x    else{' N- G; H5 r5 F, w* n* t8 |0 R
        if (upp_dmai_int_cut > 0){
; o8 A5 w2 u+ ]' n" ^& W( `  {7 T            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 e/ s* I+ T% g5 r' s3 e2 L* e/ R( {: Z            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- }* O9 p- v$ w0 ~2 N/ s
6 h9 u( a& u5 b8 M, m( c

% [, x+ w) q; j  Y$ L5 @) Y( s            //copy data to upp_recv_list_busy0 z0 }+ M! ~% P& t4 d+ a
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 [. O* y+ L3 m6 v' n# m( m9 ], G) r; t7 T' Y& T9 [8 `$ i! ^6 K
            //5 o& _! l. \" Z$ _. A# y1 k
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ |7 j: J3 P; o! y+ U! ~9 Y/ _# f- c$ ]) i* |) Z
            //
7 h3 u0 R+ P7 ?% c            server->upp_channel_a_recv = false;//
% z# Q( ~/ s8 f8 J$ y9 f5 P1 B- T, i9 y0 a3 w& g
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");* ^+ j1 M7 T4 e. U0 Z) B% P5 t9 {
        }0 z' ?( P" V; X
    }3 y$ x. z7 e: g! G. k# j" ]
; A0 E0 i% O: i+ E

# [2 @$ `5 U) |/ a9 Q, e    return true;
9 m0 |- l% \& M9 k}* f2 G9 J1 \( Z; f

% I6 z. Y+ a& n% S* i) X. A; k/ bstatic bool server_upp_data_send(Server *server)
3 i$ a! N2 z( y- S7 }& ]{6 O' p1 D8 @  _" {( d* N
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){5 m, Q5 i: Q  I* W& U
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# M3 c$ W3 }9 C- V% s
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 @+ c1 m- T) y. q        char tmp[128] ={0};
; k9 m, ^* k5 r$ ^# o, Y5 a$ M, `) ?, ^! V
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 {" z2 d- a+ ^        print_log(server, data, 64);$ I' v% Q6 O! k' {1 F
- a8 N. D, O+ [% J
        //
2 b4 x% ~% {4 e# w        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% S3 r/ g$ V& k6 M
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 x; U0 E/ J" Y3 V( @9 ^0 y        print_log(server, upp_buffer_b, 64);
5 X# Z2 h: e0 m: P" `* p: n* Z. M- F
1 p% D9 U& q" z9 ^9 p        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 p6 J& a$ N8 P$ \4 g
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 D6 Q: A' R( U        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- Z; J7 v, L+ j; T0 q0 _& e        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
  |0 f. O$ W/ ]2 _% U  l% M9 ^5 U* K6 s+ Q$ }
        memset(tmp, 0, sizeof(tmp));+ p# k* d- g& M2 E
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
5 n2 P6 c) h; ^. E1 Q% A4 x# N' e            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 N/ m+ B/ K: Y$ q' S6 ~' q        server_msg_send(server, APP_CMD_LOG, tmp);
; D4 R& v  R0 v! Y3 f" c9 J5 N" U: v1 q3 }
        upp_error_count = 0;
4 Q2 Z; T9 g/ s1 ^- ?) \0 Y5 H/ Z        upp_dmaq_int_cut = 0;
' z, o6 o1 }& Y# {& P( T        // fill in data & T5 H5 Q. t4 g7 S8 J
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% I! y5 Z. K3 I& W! Z; u: q        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! [) N  O- a# @* ^% h( D# E5 Y* O/ w
% f. \, G# g9 y2 |$ h) L  b$ q+ i8 m# f+ r
        // wait send success
' b% k! [. U- n$ D' n        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
8 O* f% M6 g2 C+ e! P9 U# O) _+ T9 a4 G) ], D7 W9 Y  {
        // make data node in free list 5 a7 r% u6 j$ [* V4 A5 P. U
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 d  o2 p4 o6 i- ]        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  o- {% o7 Z! G5 M' t    }
" j& m& t6 n0 T+ i1 b  `2 Y% o    return true;) g5 W* l, E; U8 N8 Z& \
}
5 f3 @  i+ O" |0 W
5 [# E3 H3 r: g- V' {5 e
( F3 i* r: O! s1 D: Y/ C

/ F" g2 q+ v; \6 {8 v2 i. E
% h) ~& ]! _: I# ^6 i
" O1 G4 r" j/ A) ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐. G' l, [3 x6 s

: ~* P) w) x& H) t  j1 \) V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 20:30 , Processed in 0.048281 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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