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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
% z/ ]5 t+ A7 G1 @3 J9 {9 x( \
" R+ W  Y9 K$ v; x4 V+ x6 C问题描述:% G* B, Y  n  z- k+ Z, d. e, F7 [; O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; [$ W: i* s  ?% ?' ^
8 h9 J: b9 [5 K+ r& X: ~$ l. U
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 C7 b: J, Y0 ]2 ~" x1 W

1 p% c' N- T+ Y& P- X测试结果如下:! g( T- t/ J4 k/ a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- i- w/ p8 }+ U5 g3 v' i

& j/ V7 r. H" N6 q5 v! g# Z& V, b$ t7 t) @9 w1 k
备注:
8 \4 T7 B4 _$ {+ K& B1 ^- e! O1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( m8 T5 {- |& O1 J
2、相关代码如下:
0 u, v) X  P' d//UPP DMA缓冲大小512字节+ r$ }  s6 a! A. C
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( g8 Q2 f7 t3 \. ]& H2 z#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 u+ m- d* N; K3 D  W* ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" n/ g1 r% t. ~: m0 }+ G9 N/ }
$ K. ~9 s* @# j
( q( |# F0 {* |( k' _
//upp接收、发送buffer, T3 `, f1 X/ D& F! @0 t
#pragma DATA_ALIGN(upp_buffer_a, 8)# X  W3 x9 X$ s. k  c
#pragma DATA_ALIGN(upp_buffer_b, 8)( y+ R6 W& r$ F+ ^" N( `, D
9 y' a( y* y" F3 f
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 |; Q9 V) W& m! d# y; [. C$ Zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 P, @, R$ d; ]1 ~% F! u

* T2 T( q# R9 c: i& ]
# R) e/ ~' y4 ustatic bool server_upp_data_recv(Server *server) 1 w, T, ^5 {  n# ^3 O) K
{: O: [; x5 q( t0 ^1 ^# G" U
    if(server->upp_channel_a_recv == false) {
5 B( X, h! B' ]0 C4 u% U9 s% ]        server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 v. N& c8 F& f9 R& W
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! I& L% b. G9 f/ e1 I            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 a) K6 r! X- X4 K& ]( ?) E) B' R2 E; e+ Q) D% Y% ?, I& |2 E" p

; K' o- y# _& m8 [2 K            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  Z4 X4 X4 |/ c' s7 V) u3 l- E

0 M$ m9 c% @9 D5 O9 h7 J            server->upp_channel_a_recv = true;//
0 P7 g4 d9 R( f1 z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
5 R/ T& N+ T/ ]            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 d# |; {/ l; g1 I4 g$ x  K
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
# \$ P+ r4 X( m6 O            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ U0 q7 k( J9 W

5 T% }/ I) A, |; K" x            upp_error_count = 0;  E: p7 t6 L8 C7 ]7 D1 z
            upp_dmai_int_cut = 0;
: Q3 ^- B0 s% ^8 T0 Y' I- T& n' t
            // fill in data
  J  c. v9 K) M; W5 S            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);7 a& i! U1 d1 D8 ~0 {  S* Y" o
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 E7 P, T4 B% a
        }3 ], ?& O1 K# b& @& v# R
    }4 C9 a  g8 z) m) v9 F; a' x- b; H
    else{, Y& A" o, l: ]3 T" q
        if (upp_dmai_int_cut > 0){
, g+ K/ C! X7 c1 _7 v+ ^            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ \4 A" Z/ z+ }! C. Z
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);  P7 k9 _; X4 I, M
9 J6 }4 l' w, j. p/ M0 d( n2 A
4 E% U: s0 g3 ]: q: g
            //copy data to upp_recv_list_busy
" ], U: U, T1 _            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);& @6 G( O$ f! P/ F) q7 F% }

5 D) R3 ^3 U4 a3 o            //
8 J- D5 _( j  `$ X( ^            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);: T  H+ p3 r& r8 W- v0 C& G

4 O" @; Y8 t' ?! O' e% n+ D            //3 C2 M  v$ t' [. x
            server->upp_channel_a_recv = false;//2 f; j/ H9 h6 j; M9 D- R

, i! F1 D) }7 \$ H: l0 o2 A( u( @  g/ {            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: c( B8 [5 i! p" C' i, Q, w6 Z, |        }+ F' i3 \% _! n$ N
    }
$ \# c/ n% J' N  L0 \* y4 u/ O
3 W3 C" y* R, P0 s# n% s. w5 n9 k! E7 s8 l6 t! E" _
    return true;$ ?+ F# c) W9 O. J# k' d1 y
}* P7 Y. Y+ ~% i8 m  h' R
* b( o1 B2 i/ a# B- y/ i4 a
static bool server_upp_data_send(Server *server)
: {+ o9 B% T3 S- w% Q( T2 p* P{
! E$ d: g3 O0 K6 x    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! Q) H& H  t: V/ P        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 P2 e9 l% k: N6 `7 c
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* X) O5 d3 q) y2 H
        char tmp[128] ={0};( U% g% Y# m) `& r7 I
5 f& t% J; O2 h3 U/ X- t( t
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 k1 R% T- e1 Z$ I& C        print_log(server, data, 64);
: J/ ~( z0 s$ V; Q& f$ g9 B* C% o7 g' k2 @
        //. n) y" r& j# a- b$ i% G
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, f# S2 v% m' b& M5 M% }
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, e/ |, ?% f# C  ?+ p2 H9 k! F
        print_log(server, upp_buffer_b, 64);
/ @4 ?' Y: d4 `$ i- N0 w
( }6 m3 |3 Y' Z  j7 a1 r        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  T+ A  J$ S0 X. {        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 1 c; E, Y0 ]9 c$ k5 l
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;* |) c% D4 I" k; u! p) f  C
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 g0 R: Y" b6 I

2 C" I$ b9 l" b6 [: @        memset(tmp, 0, sizeof(tmp));) d8 n$ P" h. i; D: P9 L" q  e
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" r! b. v% {& ?: i            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' N$ w9 X* B- n. S6 @- z- ]
        server_msg_send(server, APP_CMD_LOG, tmp);4 C1 u$ W% e8 S8 }/ Y* w
4 g/ E  e* s& M. m+ \3 h
        upp_error_count = 0;5 c6 ?8 V3 p& n+ F0 w
        upp_dmaq_int_cut = 0;$ Z: x, c. A# E6 ^' J+ j, }& [
        // fill in data
: n  o/ H% O: X" ^" F5 Z: ~        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % n7 Z1 i# w- w# U$ ?
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 @5 V' K* b& I; O" W
- Z9 G' S6 N$ V$ h/ n" m) V) e        // wait send success5 J2 h6 e5 ~" A* O
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : T" D1 H6 F' k. h  x% S& ?9 Q
, g* b, x% K8 r. S
        // make data node in free list - U+ H4 i. y: T
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; F! }" R* x% t) a0 y+ S
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; |  T7 I- o! ~# b) s    }; R. M  d8 N5 T% {
    return true;
; F5 U5 C8 w9 _: [9 ^}
1 T1 V1 d* k; u9 Q) j7 Y; p* ~! y3 e( E- }, t
- [2 _. w1 ^  l% Y! j6 @
9 _! S  T; ^& K3 X7 p% B. g6 c

' z8 \1 S: ?! {$ f( c" P, ~) u8 \' [5 d: _

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐6 y) P" ?# {: P' i" \$ V
; x  d( I5 u- X

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-24 07:25 , Processed in 0.042136 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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