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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . f# \# Q. L8 N7 U* U6 r

* v" b+ J4 {* R, u& {4 d" S- f; a问题描述:
. N9 M. t& ^2 N2 b" I7 E在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:# B1 J, f3 H! \$ \6 J* S
" X; M, f3 G, P+ x# N8 J' d7 t
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' G4 T  {0 J8 K* Q- I
+ h  s+ p/ C/ W/ `
测试结果如下:
% n% r- \; c0 Q, W  O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 P. }: G* N: M* g+ [# ~0 x' ?
, n6 d8 ]+ s; y4 A4 N! A+ a3 c, U, F; W3 Z
备注:6 P, j$ k* T- b* y' w7 Y( @0 b. a! S4 L
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. C7 ^# z, u7 m' ~/ S
2、相关代码如下:4 r; w8 F, Y6 |! P
//UPP DMA缓冲大小512字节* s. X6 d' w7 Y4 |' m8 c
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" m, v- r6 H* w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; b) W" G" x* P/ y% t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 R- W2 m0 g1 J# W% T  d1 b, R% Q9 I  B1 ]7 k5 G* x

  v3 X; r; W% q3 `+ [//upp接收、发送buffer
9 \' ]- L3 X, M' `1 p: K#pragma DATA_ALIGN(upp_buffer_a, 8)0 I, f  k- w4 C
#pragma DATA_ALIGN(upp_buffer_b, 8)
6 o1 L6 L9 v  u& {) Q- t8 x# z' ^+ l& q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. K% U4 _- R. _$ e0 _unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];! v3 l6 m; c5 ~* D- ?  ^0 I

# P% c4 A" A0 i1 E+ Z$ h' ~1 A# F+ j) o
static bool server_upp_data_recv(Server *server) & w; d" z6 t. s8 v' _
{
0 w$ ~/ m. r2 Y: x    if(server->upp_channel_a_recv == false) {
. l6 Q  o$ Q. d6 D        server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 a" C  P1 h3 @
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 s( Q; y1 j' e2 ^: f
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 x3 J. ]2 }* G3 y. @
2 {, k- z; Q( u; g; V9 w
7 R8 f: c1 }0 J! \6 Y            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' g2 ~; o$ o1 ]
( D4 z- `* D" {# M% E0 n& s            server->upp_channel_a_recv = true;//
$ k! y5 B, L" P4 |* U2 R' j            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
3 `% S4 X% H8 M! D3 L  G            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;" c8 {8 T- k$ G
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 s8 o  h6 c  ~) I) Z            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" w4 c; e9 R0 i* `' _; `; ?; S

/ E0 Q7 R) u8 A! m            upp_error_count = 0;
; R8 T+ l8 j2 I6 C            upp_dmai_int_cut = 0;1 c) q  }  {; X( f+ ]$ |

* F' @( Y' C( e4 o            // fill in data
- W8 ^- r; }  @9 t" b( ?( q            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! Y+ n; s0 u* Z  L% d6 T: \! [
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, N2 L5 ~$ ]9 w: V/ V2 C7 N        }0 i2 F' ^- O, V! P; W
    }. m/ `; K( P$ B% l1 X" I
    else{
4 j4 s# r0 C9 _0 K+ z' j- B4 \        if (upp_dmai_int_cut > 0){
: k  K# y; |" K            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 B6 C" n+ O3 G9 Y/ r            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( j3 b4 x% K4 h. L7 s
$ s5 E! t* g, V5 \3 B

+ B# J+ [$ {$ `+ U* s" j            //copy data to upp_recv_list_busy
" i2 T) R( R# T8 f7 `) @+ _. ]            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* S; H/ ?1 ?" j2 P+ G
0 \; {% H5 v3 e- j
            //. T/ P: ~' Z' x+ `: V# {
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);% u5 |" ]- f! {- x& j

# J3 _5 T" o" K& X, Z6 S            //. v/ K4 u, l2 s  O9 C2 z
            server->upp_channel_a_recv = false;//
( q* [7 D+ e/ ~
/ g8 K! E8 X. T; y8 E+ h; e            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& i* w( ~" @; W/ m* V
        }4 }( k  I  Y) }: W- \; I) h
    }
0 r+ J# i1 p9 T; ?+ J5 [
$ w1 r, ^- U$ R6 x  E- Z$ m
7 y) K2 J9 N% c: {) s# \    return true;
9 V+ |+ ?! T2 H8 t/ ~}
9 D; e- O# g" e, p
" E3 _/ c6 @+ k) Y/ Xstatic bool server_upp_data_send(Server *server)$ I3 S7 {) O0 I: h9 N
{
$ L8 Z; S, a; m2 |& ?: q' B/ p    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( [; a. R! q4 a7 A        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' m* H( e" e# n6 x* t        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! H, y, _" R2 p7 F6 x        char tmp[128] ={0};
1 L5 l$ _) q  G. r# G5 X) ]" h" e# D) H2 w' w
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
, O5 }" X4 x8 {: }        print_log(server, data, 64);2 l1 G1 {/ _4 H4 ^. h; y! I2 n. p3 C6 e
& E6 q& X  {3 D: F/ S7 D
        //
6 e! ^- S+ B, g  l3 R$ i1 r& L        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- V: j0 V+ c' o* h# N
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* N- u0 ^% q2 @( F( J        print_log(server, upp_buffer_b, 64);8 Y- t9 C" g+ Q2 z5 P0 C8 M/ R! r
/ W( h5 N& `1 X0 D/ g' b7 A0 Y& X- i
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) s; B# c6 g' G! y! L7 O! h
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
5 K" P' U  }0 K1 E6 Q6 H        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;4 V- _2 \, s' Z+ H+ \
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% y! z9 B4 e7 ~" \6 f$ w& a! U
) n, r# V' p, y. M! l. e        memset(tmp, 0, sizeof(tmp));) }  g) y( T8 A  U' M
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) l1 t6 ?4 f; l            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 @( C; J1 d5 K  i8 P
        server_msg_send(server, APP_CMD_LOG, tmp);' q4 @' R) m3 S

8 c) X  {" d9 M        upp_error_count = 0;# |  [7 U$ E5 k0 d/ m% p3 C
        upp_dmaq_int_cut = 0;/ j$ M; d* o+ e: i' p
        // fill in data & ^8 e* x! g, M4 U" |: t' \
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( v' v" }4 i* ], C1 l. z        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) u4 o& U8 x( U# k
' i" z3 k8 m# W, G) p/ c$ d% V$ q        // wait send success& q: b# A: U- O4 V5 r% u
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 p, v' Q7 v3 `

' e" U3 U. f) Q: h  E- P4 K5 {        // make data node in free list 7 c4 b2 V" m9 F  h( Y. {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; g- O) p0 D* x8 D9 U, \1 S7 I9 l, b
        server_msg_send(server, APP_CMD_LOG, "upp send: success");# ^: P2 r; q8 W& |9 K
    }' v) q2 d( A+ p4 T7 y2 A. m
    return true;% }  n1 B1 _3 e% r; b( A1 c
}
9 N) t9 p' ~* ~+ o
* R$ `4 s& t# k' N4 K. K, ]
7 s4 f8 S, {; O( L3 n& s' [

! D( E1 Z# ]: S0 ^, c6 x
1 O" q) e) n3 h* U9 K

- ?% c! _! `' Z1 [- D( r7 h

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
$ T+ L1 e6 q1 r" F
% B0 w& d2 K! k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 22:28 , Processed in 0.042773 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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