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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : O; |  \  `8 [, Q2 X
$ I* n1 l( @1 X( ?0 v) G1 }
问题描述:
, F7 r1 E' {3 D( ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% j1 |9 Y  \+ G/ x! K# U8 h6 S) }
8 L! G* W5 q8 \
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 p% F& {$ ^$ e9 |+ {. B( f# ]* B$ T
测试结果如下:
; _0 K, L: I% u3 h138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& l, t3 T( C8 j6 W2 K0 V$ {( f- D0 R5 z9 k2 Y- i9 P
  e5 |) w4 ~* `( f/ s
备注:6 j& Z; p- }# \9 |) ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& `* ?, o4 ?, @( J( a
2、相关代码如下:% ]1 [! i$ |6 P- K
//UPP DMA缓冲大小512字节. {, E$ `! @( x2 h! P2 X
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍& o  y6 ?) L2 @6 d: u) x5 Y) q
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' I: d! D4 H4 Q7 Z/ ^$ v1 c7 o, M8 a
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 D5 \4 F  m# ?: ?: l% H
* u: {- i; p0 A6 w0 ?
. v$ E: k! O0 y
//upp接收、发送buffer4 b) r5 ^! s/ t: `/ }! r
#pragma DATA_ALIGN(upp_buffer_a, 8)/ f/ r& _" r8 l
#pragma DATA_ALIGN(upp_buffer_b, 8)
+ D2 g4 ^$ i* }6 I0 }4 }% l" Z- k7 O: ?# m: J4 d! X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! L  M& d1 |( r; r) zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 u( M' a  V% G& ^+ C; u
5 f' x) `: Z7 U8 l* B7 q

4 H# a- u# |# @static bool server_upp_data_recv(Server *server) 9 j0 O0 m/ \; P5 P, J  n% C8 c* d
{1 o8 J( n, g# k0 V
    if(server->upp_channel_a_recv == false) {/ k* F* q0 b8 i6 I7 x1 x; Q# ]
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
2 i8 a) I2 g; x+ h5 O        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" L8 L2 @! N# @* t! n' E
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* j! M* D! ]; K

9 M2 ?3 T9 v! `
5 ^) X2 ?+ J' ^' U            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" [2 o4 o( Z6 u6 K
4 S) Y4 W, D  u
            server->upp_channel_a_recv = true;//* i; H. I+ S) J+ }, z6 m0 l0 }: ]$ n
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! J7 J+ E  B/ [! ?            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
4 ?1 l5 u2 ?5 x/ H8 c' D            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;# W) _1 [7 a$ w9 I! q
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' W2 w" P. w6 W0 E2 Y; D. U

' _  c5 a+ N4 a% b; B3 [            upp_error_count = 0;
# Q  I9 f8 y" `6 E+ N7 \+ Q            upp_dmai_int_cut = 0;0 F& v+ Q- h1 [# s  X: ]8 h5 G. K% i2 z
/ i) g6 O+ X  k; o! _$ t
            // fill in data $ [( F5 ^: w+ E2 E! h
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& i, o# H/ B2 p8 q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");3 ~% j7 b  w* K/ ~
        }
4 W: y4 B% }8 G0 Y8 P4 A. ^* O+ v    }& K; r9 }; L0 N0 H# y
    else{4 X  w5 B. Y: T3 j! x
        if (upp_dmai_int_cut > 0){
" F7 m# s. C% ?5 b            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);7 _  ?1 Q( o* n1 s! X+ z
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  h& G; P$ A6 p2 \8 I9 c9 `
. g  |: j8 U( ?# }1 C  e* O+ r/ }* n3 w2 H
            //copy data to upp_recv_list_busy9 B% E" i! p3 K  Q
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; c6 C& M" y2 A6 B0 T' Z+ J6 T" G# o: `+ ~8 J
            //
2 A( g. ~8 L* J+ e9 r2 Y0 T$ t            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; t8 |( J( Y. ^
* g# |( N) ^% E  N/ x0 M            //+ ]# {, p, x  t& C) y2 n
            server->upp_channel_a_recv = false;//
0 Y: p* ?: a% g, G% ~1 O8 y  Y* G
6 g  b" Y6 d# D: S. c6 H: v4 G            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& d: f, O7 e8 Q5 I+ g) q6 i
        }
+ r: f! `3 b6 B    }+ ~/ w$ R: X6 N* _* @( w! H

3 ~5 s- m9 }, `( c9 |3 W4 X  G( J1 G/ J
    return true;, p+ M7 M3 v3 J7 q3 y1 A3 b6 k
}
; u# [! J+ c: y0 K" L/ x* R- K" ~- t# w" v" }2 j
static bool server_upp_data_send(Server *server)
8 o& c9 L1 I6 N: r' k{
. T, B. E+ ?" K5 U; V- f* J    if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 V) Z& q  N) O4 K+ U: w' b1 F+ \: S
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 t! z* i2 J4 o6 ]3 n# b$ O3 a! b        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 G& `& s, T( O' _; W2 _' l
        char tmp[128] ={0};
+ n  r& G4 `/ L7 E" ?3 _+ O* T, Z  q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  A% e$ T% P0 d0 u: j        print_log(server, data, 64);6 F1 ]0 x' d% \9 @/ N* m" ?

3 |2 A) x; r/ d$ A        //9 R! m" V, b: u1 j; `8 Z
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 i" Y4 H: o. o6 [# \% L        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
  P' M: n) e5 c. K9 d0 E3 ^        print_log(server, upp_buffer_b, 64);
5 p' `( W0 Z5 ^- k- B1 W( d
  j$ Q) J3 \' \7 t+ `/ D& d/ k        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);& ~9 ~# k/ S% F( m
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 j# Q; y/ c; a2 P        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
$ g5 ^; X4 f( b        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
" w+ c" l; U% p8 x0 [% \' ~! ?( }: ]
        memset(tmp, 0, sizeof(tmp));( g+ {/ g/ X* _& M
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% o  ]$ l7 i( w  k/ ~9 s, O            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) K+ h5 n  i) P, S" r
        server_msg_send(server, APP_CMD_LOG, tmp);
/ j! }% B1 X4 G" U, t* F! i: w/ V$ F# o. c8 W" l5 ?* E( a/ a
        upp_error_count = 0;5 S7 y+ e  U& X$ B) L; X+ F" n
        upp_dmaq_int_cut = 0;  G# R" e$ K2 o9 F
        // fill in data 7 W0 X2 \5 s6 f) G, Z) S) \3 T2 k" Q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 e. `6 P8 V7 @& v& S        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# N3 @) Q/ g+ x; `8 b( L
3 f* r1 c% D* g# m; R: j4 Z4 x        // wait send success
) E- L: M: ]0 _' x' O$ b( i4 G        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 P& ?. G: G; y

% S0 m7 P6 [$ x( I9 N        // make data node in free list
0 u* Q4 F4 x5 i, A2 r( G5 K; g# r        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( `1 c1 m. b. O        server_msg_send(server, APP_CMD_LOG, "upp send: success");" {. d# `) C; d. u' C0 v# ]9 z0 ^
    }
, l* b) k! I; P1 }9 o7 f! ~    return true;
2 a  {# Y5 d, {3 _}
0 `7 h! T: [1 w+ Z% J0 M- X* |: ~% `+ k1 h7 m
; j' T6 N8 x. B" r! y  r

' d; R! M4 \8 }7 F! k
1 Q( J5 s/ l* {" Z( j
( k# t  a- R( o, \& n

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
  \/ S! Y/ i, d  K5 Q, r' }4 k* }0 C  S( u/ {. I# ~7 S" j9 R" H

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 06:50 , Processed in 0.043254 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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