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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 [. x+ \0 h" w% q" r8 X0 ?* z" W: d% d8 X
问题描述:
1 j6 C' K+ G9 `! }在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% l  ]; [2 Z! z2 ~# V2 `* o
/ W7 y. \4 l3 D( O3 y) a% C: \# i
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。  V' M9 M2 |& S8 B

' S/ P8 M: s- i$ D/ L测试结果如下:
/ |2 h$ A% N2 v* F' N" V138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 K1 \, J+ t; v0 f! c' P% s' w- ?* ~5 D9 n9 F9 W
+ K* b7 I: t2 H# S
备注:0 `! H2 ~6 \# y. h' e/ U' D3 O" g7 r6 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 E. D1 d- s2 Z" k
2、相关代码如下:
/ Z( A: x& x( E# \% k: k# h//UPP DMA缓冲大小512字节% c5 l* G7 e* n
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  b" h3 ?8 L# m0 J
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 B. Q4 R/ q( s: e* g( z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% j! d; Q4 d3 P( U& a  n2 z- f5 w: S" p1 T% F0 H2 m9 }8 c

" n1 K- n; S- V, ?9 W5 x# m* U//upp接收、发送buffer" y% C4 V  |- j3 F! n" B# Q! R" y
#pragma DATA_ALIGN(upp_buffer_a, 8)
* r$ g. S& d% |5 K- P#pragma DATA_ALIGN(upp_buffer_b, 8)
3 L0 Y" v% B$ ?/ X+ Q8 m. @* e' s
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- Y2 q* F9 y5 G' S' Kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 g5 d$ p6 H2 o% X0 Y* s" z
3 m1 w# D9 m, B" J* ]

3 V+ O- ^7 T$ t' w+ tstatic bool server_upp_data_recv(Server *server) . F* p$ K: S3 V
{& e  s/ z. }& Y
    if(server->upp_channel_a_recv == false) {4 \  ]& f& c! g4 T3 }) c% n
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 z- J: g; P4 k3 w
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 ]( q1 _" R0 d1 \9 m; P
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# s: {8 k0 l& Q( P) q) A0 g
  C; C! N- H* A" i/ o; h0 f
0 }; B" S6 V( ^1 P& D            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 X5 ]) [8 o, i. z6 C. z  b
3 F1 ~! j1 n  E/ n: P6 G5 F8 W" H# S5 a
            server->upp_channel_a_recv = true;//
: T" ^3 B  [" p- x$ Y/ I' M            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);6 Y% `6 F; X5 R/ n
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;( \2 @- G' h2 g8 l
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, U6 T0 c! |0 X/ [            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 R0 H! Q  c6 ?. l  i6 P. o  Y8 Y$ c$ P- c4 q( I0 `
            upp_error_count = 0;2 z( {+ w$ p$ j& z* F3 F# q, |$ T
            upp_dmai_int_cut = 0;1 \0 }" p. N) K
( I9 _) d, r8 }2 S+ k
            // fill in data ' ?! J$ p$ U/ D( a, C3 G$ P/ _1 T6 j
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 f, B2 I. e/ ?; c2 U+ I4 S( r1 F
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" @8 h' {. p1 k
        }
$ N8 R- M( K2 O. A% k( a4 h1 t5 R    }
1 T4 O+ h4 M: _! i3 \    else{3 ^* p- k) m2 l3 O
        if (upp_dmai_int_cut > 0){
' N( L# w& }# F* [* b$ G# }" o            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% {& n6 d, z! T            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 W# n8 {# v% `3 t1 [* o8 g$ g1 ~4 \7 m4 o3 {1 e- l

, H) u& a& M* v            //copy data to upp_recv_list_busy
: n0 \& f0 \8 ?( k' M5 ^  ]            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, R$ X! A8 i& M0 O7 {% ^

: H! }$ V- r  @2 T. w8 m4 X; U. l1 p            //. i2 h) S) c- d  k3 [+ q
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 ?' i. r; N4 ^2 G! s* b: T
: S" o( q  W. S3 h2 g
            //% h0 F3 v: L2 |" z, |) ~
            server->upp_channel_a_recv = false;//( ?0 G2 U: F* Z3 K
7 ]1 R( |4 i7 a- r0 E& b
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 q; s' t5 c/ D& e* ^        }2 }2 E$ a' O/ c$ a9 R
    }( n+ r6 F) t4 b/ e% M* @4 e3 U

" l. b' t0 S! l- {0 J7 y6 w& d/ G- I5 y; L
    return true;4 s. H1 w5 G0 x+ f7 ?2 R
}2 Z  Q: R3 m2 s1 V2 h3 W# Q

  t+ o# S! D/ ?+ C7 h! {/ ostatic bool server_upp_data_send(Server *server)5 M& v0 ~5 {* ]' g6 ]2 y
{- I; V9 K) o8 h. P& T% G9 b
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
  t2 U3 e! c& ^% H6 p        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 K' S0 @. `6 k2 O& ^* R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 y5 j$ A& ]: w5 X- n8 \) n        char tmp[128] ={0};
1 ^( n$ U! H1 a/ Q" }7 G9 g8 \- W" ^, N
        server_msg_send(server, APP_CMD_LOG, "upp send: start");, g( S7 R) ?) @, d+ y2 n
        print_log(server, data, 64);" E  C% o4 `. k  E2 K

& _9 T3 `9 m2 V        //
* ~- {! b" l1 [        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
( J& [9 Y" ]' q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 f3 f/ w# |7 X9 a
        print_log(server, upp_buffer_b, 64);
5 _1 c: v1 Q! K; g, G
- X8 _, ^  D) }8 n- h9 r        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 |$ U: L8 }8 m- z0 ]/ N, z        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 c; a' j. Y0 M2 \7 c5 `        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 s: A% S7 l& T  ?
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
4 ?, ~& g# P8 l% D* p
0 ?& I+ p8 V( C: @8 |        memset(tmp, 0, sizeof(tmp));
7 ?% C* B, E0 _) ^, z" U        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 7 R+ Z' z2 u9 p2 n; z
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  K: t% r" d$ H2 R9 s" @        server_msg_send(server, APP_CMD_LOG, tmp);5 k9 e  c6 u) t( [* T8 i8 o
. C9 V' Y+ F0 l5 l. N. X4 R+ }1 x
        upp_error_count = 0;/ \. }/ W* M2 g- A4 P" E8 O
        upp_dmaq_int_cut = 0;" z) I* z# r% ]' @
        // fill in data
# U  J2 w4 e% z        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 t7 s9 ^5 d2 W8 K        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# D( Y. t$ z$ x

/ A3 q  Z: \+ F! ?" |* c        // wait send success4 `3 s9 r7 i/ w% z; a; l
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( g/ K: T" g" X2 p1 f$ S9 g" R
/ V) R. {! s) j/ n* Y
        // make data node in free list % F- [# C# u% X0 j. \1 W
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
! L& {3 B9 @8 X        server_msg_send(server, APP_CMD_LOG, "upp send: success");# g/ C8 F7 J4 w% `. f
    }
3 {% @  \- N5 M4 i/ o' k$ U" x  u    return true;5 d2 Y, a! F/ B6 S: `0 i0 `( |  `! y
}
4 h! N+ U9 ?$ _+ _% w# x6 h8 X: \& e3 t4 j& m  G: r

* K0 K7 @7 C3 T" L; J5 \, q( k1 h# E5 _5 S) I$ u8 W

" `* Q6 L4 ]  ]4 @6 f! z; o8 W6 C' }( g1 \$ Y- t! n, i

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐5 w8 S+ J5 E$ h# M* O

" X0 }3 y5 h" c3 x' ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 03:30 , Processed in 0.044096 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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