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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 _) Y( h6 y" L8 q( T

6 s) n: q# i6 x3 W! C5 |问题描述:; X8 k0 D, E. A2 i
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 _8 F6 H  \- u. w- ^8 k  O

( y* |% w1 |; Q% R4 t( S2 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# n" _( ?/ I1 R- v5 T2 r
0 E6 k8 s, v8 U9 e4 z测试结果如下:
. Z! t% {" G. g- {/ Y* F138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ V$ m9 ]0 c3 B6 |+ b% A! L/ v' l+ h0 @" p

+ Z9 L" l5 g5 @3 {* |: y备注:
1 @  J; }; [* J1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& ^0 x/ D5 [1 i9 s  Z- ]8 h/ f
2、相关代码如下:
3 ^9 H! U% H% j3 z, r$ b8 Y9 ~5 z//UPP DMA缓冲大小512字节
2 u7 G: u5 P" |2 Y6 O. R#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, p7 _$ x+ I: k: I
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 M: J  c0 U; H; S& F* q: ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 Z& b! Q  N, B; |4 B8 y! w4 \

( p3 N4 l$ G( A$ o9 [- ]5 t" t( d
9 i, E( ^; n9 T//upp接收、发送buffer
$ y$ z$ r3 a  r1 J#pragma DATA_ALIGN(upp_buffer_a, 8)
; {+ o) N. O& l% Y: G#pragma DATA_ALIGN(upp_buffer_b, 8): H- j8 B4 ^+ K2 R* g
; b1 m8 A" s+ a1 S
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# h( r6 ?/ k: ]7 m" `' b
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 G; {9 C  J+ M' l; `  Q, j3 g% E9 v' s& w% _8 e
6 K" j% m7 N7 ?- I
static bool server_upp_data_recv(Server *server) 0 Q8 m) D0 [" G3 P5 b0 e9 K2 e
{
' I% ^+ v2 q7 C: f8 t  `: O3 m    if(server->upp_channel_a_recv == false) {2 d3 I: }# J0 `" s1 Q; L  T
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* N3 u- q- Y: d$ t( {. [
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 |$ N; D, t% w  K8 ?1 D# X6 k& F            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 l" a) V* S, }+ h: D7 N+ O3 K5 b$ V& R" z

2 l5 L2 Z1 M* y  K/ L            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" O" R; J1 d3 t! l: H* b. G- _' {
8 l) I$ F. I0 j( `
            server->upp_channel_a_recv = true;//4 m0 j% p( h  _' C3 A, K" s
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
$ P" {, w9 D: Z# x7 r  M% N( ]( _            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( ]. {* m3 P$ O( ^            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;; l: I3 i% n9 ?
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ ^- P) f8 h! ?+ I( N* x$ `: ^
1 d% `3 k) C4 O/ ~$ L! N+ B
            upp_error_count = 0;, o8 ^- {  T- a9 n5 g7 l4 c% T, J
            upp_dmai_int_cut = 0;
# F3 k% W4 ?6 U. g5 q" H1 x' P* ~+ P7 M
            // fill in data
! n+ j3 o4 l9 Y, {, O' Q6 V            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, U) ~/ q& H6 C* C+ ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 ]3 p2 ^0 E6 O/ G2 Q" s6 I! ]        }& v& V( O2 M; A+ I! A* e- [, X
    }4 c5 j, E  h) V. G+ k" E. f
    else{; d7 M0 v# I- F6 r2 |
        if (upp_dmai_int_cut > 0){5 p" h1 _8 {6 T+ I1 L( J2 z- Q  }
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 v& ]2 g/ Z: P$ y( K            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 I8 p5 A$ v, M1 Z

4 G; Y6 Z9 k1 H+ a. f
& l' k( U8 ?  v6 x9 D: _            //copy data to upp_recv_list_busy& a0 I: s" d1 [) \; p# o
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" y6 E1 ^6 y& g9 k

! {! X: }: G- p  A& F            //! B  g; v6 V; l9 @" W1 f$ m
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 ]; q6 y+ @# N, p7 p  ?

4 Y5 I" s; o+ p7 h            //
3 ?0 k! }2 y, Z. N6 v% t! t            server->upp_channel_a_recv = false;//# i+ {: U+ P2 f0 U1 ]
$ Q* d3 t2 D" W% c
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; e0 k; l, G+ y) @5 m' k& Z
        }' c* I4 ]" M* t+ b, S: w2 g
    }" Q' |6 w3 H! e- w8 U: g9 y' g3 a) Q" b
& [9 R9 F* n, c& u( {

( U) a: ~  q8 a    return true;7 R9 c0 A$ U1 `! l6 i4 F# s
}1 F# }3 v' T5 [+ _4 ]3 ]: _) J

+ J; M' Y4 S+ e* ^2 W9 k! pstatic bool server_upp_data_send(Server *server); s9 j: f/ v& t! U. {& v
{$ T0 G. a1 ^; h% i3 k. ?
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 u" \7 J& V/ v: Y        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 r  Z7 i7 t6 q5 d& ]: V7 R2 q8 s        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* V2 J7 J! a6 H$ z4 a
        char tmp[128] ={0};
- r  v3 }4 p$ v
, y' |8 e( l: }: n* P/ G        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. k; _, q' F8 I1 ~        print_log(server, data, 64);
, p+ `! W! R. a/ f" _# n4 K
: j0 _; |8 z* D5 c! ]3 P, [: u        //+ s( |* a3 Z( r' W- M4 L# P. v1 M
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ X% I) ?. m% c        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" d$ M: ~" c+ Y- ~% n
        print_log(server, upp_buffer_b, 64);& U# x5 `4 ?* F# G% u

7 b6 @) c' p2 o6 k- \        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
* G" j1 Y0 U/ I3 ?! y        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; % l0 f8 f1 |- d, A1 Q& `) {6 i( Q
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
, j8 z) x3 S8 Q8 n8 w0 \2 q        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& B5 A+ t/ x" F1 I' ]0 t9 B- s
2 n: l4 W4 f: T5 Z, }
        memset(tmp, 0, sizeof(tmp));
4 O8 {" v* z6 E( o        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + F" ?! ]$ I* x' w
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' H3 ?1 r- n( u3 u; I3 Z" T5 z$ |# q        server_msg_send(server, APP_CMD_LOG, tmp);
) I/ A1 V$ G1 u$ k( K9 ^
: P& k6 l: v5 _7 m        upp_error_count = 0;
% R3 `6 O; y0 Z4 d        upp_dmaq_int_cut = 0;
0 Q6 K: |' l+ _! f; N        // fill in data ! @. k' }- S* ?
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% ?* O$ B% E3 E        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) C+ _2 d* Q6 b+ X: x' h( `- D) ?$ [0 G- @% q( _
        // wait send success
# K/ E  S- W( e- u        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , r4 u3 ]1 x% ]1 i2 A
2 Q# b0 `3 p1 `$ A
        // make data node in free list $ |+ W3 D* u$ @9 a  R2 [1 r
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, z1 z  @- p4 _$ f: J8 A        server_msg_send(server, APP_CMD_LOG, "upp send: success");6 A0 k/ |0 C# P5 D2 X: C+ T3 z- I% j
    }- c" ^  ]/ n' O$ f6 B9 p2 K1 p
    return true;
# Z3 U6 \. O8 w% t( [* d. u* c}. r, S3 J2 \$ d  Z$ R
; `% h" Z3 @+ y* M9 y) c" M
& v0 J0 i, ?# O1 v) w2 i2 [7 |. V
) V4 y: ^/ \8 K9 r! T7 r; U* v
: y8 e& L, V/ Z, X
7 I+ i7 z1 x7 c& w* D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐2 ^  J6 `7 z; |/ t( z5 o" W
, ^8 c1 o6 r; \

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 03:24 , Processed in 0.041877 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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