138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : X" q8 Z% v- o+ X/ Z: `

6 D& J( |1 ~) s2 [3 h( t, o; ^8 |: d8 c问题描述:
9 m# e  T  S5 b0 g/ o) Z7 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ n0 ?" L: C5 {" O! T% ~1 o

. X8 e( C' L: G* [* M) g/ O4 T  y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ f* e; \9 ], w( c; r+ l+ O' |
7 V3 a* ?' G4 E, H+ C6 ~) R+ H
测试结果如下:6 z* T  A4 S4 `( O8 \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 l5 N: z5 C/ x9 P# ~$ k4 l
. F$ q  F: ^6 ?- T# U
) ]5 l! B! s# O
备注:
) R, b2 s1 e) p6 c9 [1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 T/ |( \7 a: X6 Y+ f& G
2、相关代码如下:! m& a8 g. |' v7 y$ @0 R( Q9 G
//UPP DMA缓冲大小512字节: c9 N: [1 g: d1 {7 E9 C
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
  M  ?2 t5 y& x" }' h( d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: ~% T" m; G) ~/ J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 ^. e# V* E* ?: W* w/ G% `

4 b( [7 ]. V  u6 {+ E7 V3 T
1 h, C0 @. Z! I- u$ M0 C" Q//upp接收、发送buffer
' S  C& Q: ?6 a' A. z#pragma DATA_ALIGN(upp_buffer_a, 8)  @! O% y! S2 K- F; K
#pragma DATA_ALIGN(upp_buffer_b, 8). i+ a4 s3 M+ ?9 @

6 F5 V% j' d* `5 Z* ^0 _0 Qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 J. _9 x' c& U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 F. P1 _- k& o3 j$ \
; J) p6 [3 X( @: U

3 _$ @. W: G) C& cstatic bool server_upp_data_recv(Server *server)
) e& `5 J1 p) u1 u% B& B, \% q{
$ B1 Y9 q' p! q* M$ h+ m% {    if(server->upp_channel_a_recv == false) {, i3 z) E0 Y  W, l9 g$ d
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( {5 J# n. q6 Z! e        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
2 g. P# H& H: n. B) Q. d            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 H0 o1 z7 C5 t4 \; B
- F' T9 x0 w* v! k0 e, ^2 Q2 ~; p9 [! a# R
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% j: L! |" N6 D$ I; a2 R- c
6 j( v/ J1 t/ `/ W/ C. M, z7 ?/ R5 p            server->upp_channel_a_recv = true;//
0 b; ~8 v+ L, X- J- ~            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* `5 Z6 P# s$ l4 |; \& c
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
, S3 ~/ b7 i. Y" I3 `) N            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
: x/ u; B1 G) u0 n+ u& M            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" |% ^! f& E1 l# u" d4 Q7 |9 i; D" r  `. |" _$ R4 y
            upp_error_count = 0;$ T' J- ~; S3 y5 I# E
            upp_dmai_int_cut = 0;  T/ l* [6 q; W4 U3 C# Z

8 ~) y9 M' t) Q$ Y; B            // fill in data / g" F) ~3 i( w; J: K- W
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  \, m3 T7 D; M4 n0 u  p) j            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, T/ Q6 x0 y: z& a% m' A) w4 Q" g
        }
( S5 c, `& v& x    }
) I2 N6 ]6 F4 r5 i. m! i. t5 F    else{
8 t# [8 E% k  A( r5 f+ h) W' l        if (upp_dmai_int_cut > 0){
: X+ v3 p: N1 x0 @' z- s- I            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ k1 Y- f# b. P            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 C# t/ \- H" [* P" n( A  P
9 k- G3 N4 A5 j/ M1 e0 F- a

& K1 |: R4 U! P) q! P) J" P3 Z            //copy data to upp_recv_list_busy) H# \0 e" T, V0 L% j
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 E6 e) Y) N" w
& J- }3 K+ O' \- m
            //
( y; u) s) O1 [+ {) j            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; b8 c4 F& P. v8 _* F1 J& ^
: U: \/ x( Y+ [: X; Y            //
6 [, O- `3 Q8 Q1 g" ^: o$ ?& d- W            server->upp_channel_a_recv = false;//+ m! p/ z6 W0 c

0 ?+ H$ `0 v0 c4 u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");" R/ x" u2 M- }3 ]+ @  T4 w4 J
        }& ~: s9 C' r4 r- x
    }
+ @3 A( M5 U% f( n0 n6 \3 I, Y# y( D! p6 J) D' C) G
! G9 ~& w: w9 k; g% m+ U$ [7 s
    return true;
. o9 F* W; E4 n* d# \+ M}) {& V: }3 q( ]6 W
9 z' Q6 v" ]5 ^& m. S8 n
static bool server_upp_data_send(Server *server)
# d" a& }/ Q) y% B& f{
, M9 C3 u1 N2 R+ E0 i; g. q( ^    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 q3 @" ]) l" L6 z" ?2 k        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( Z1 ]/ o3 P1 P        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& L) G1 N' R# X; r! Z
        char tmp[128] ={0};3 A- O4 G( @# v& Q, e: |- `+ U# w/ |0 \! R

7 w; _% I) Y# N: t        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' a" N" T0 {4 W$ S( f# k. D* @! R4 \        print_log(server, data, 64);% u; y, ~8 y, b
; z' K- y) B0 K1 d& m1 M
        //1 c5 D5 @6 |8 S- J5 u6 b# O% e
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 k& @( _' v9 w2 c% A, H" r
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ S0 P! m, o+ c
        print_log(server, upp_buffer_b, 64);1 _- V% W: x* D: z3 ?& j8 f8 M

$ K' {9 y5 Z! W1 g( ]# L        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
. e2 k6 @1 {& _- y. n        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; & w6 R; r6 {- z
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;6 j% j# n- H) c" v7 F0 d
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 t. T; E: c: y$ c9 h; b$ `& R4 }$ k7 U  g. m; `
        memset(tmp, 0, sizeof(tmp));
% @) u" X; X# f& M4 Y! |        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 z( ^: E, O; N5 {' Z6 k            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: A9 D3 T" \8 m: G  _
        server_msg_send(server, APP_CMD_LOG, tmp);
/ O( X2 a, U- |* s# X1 P% ]/ R
5 K2 s. ?. [' h9 h  P7 m& E0 [0 ~        upp_error_count = 0;: `2 y; M2 i& C# o" Q. Y- t- {7 Z
        upp_dmaq_int_cut = 0;9 B- J! O$ S2 F* z! @
        // fill in data
0 X1 i) k5 D4 [' B: T& J; f        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 i. B. |: [0 G' U, }) i        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. X3 D/ a' e" O* ~0 G% l
+ r- C( @9 g& M. ]& N2 d        // wait send success
2 ?" ]4 a: k- n2 @6 a' r        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 o2 |0 G0 E7 V, }! T3 H9 X

2 ?, i1 ^, i0 b% B( Q        // make data node in free list ' T$ v, ?% d7 T) ~* B8 ?
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ J8 ~4 x6 g2 `        server_msg_send(server, APP_CMD_LOG, "upp send: success");
, Z; |2 S1 [7 @. C, b5 ]$ v    }  a& v# Z" k# i' @0 L1 T2 b9 l
    return true;$ x$ o# ~( t. }8 X. ], L- V) t
}2 E7 E3 v: }; V; u9 W, P
) y+ P) c0 }: j' A! h; a" u  }. i0 I

; `- ~: J% c, Z6 d4 o7 B6 v" {8 l. `' u# E3 Q/ q; U  R) g' m
1 o# V# u" |' f5 Q& J1 R% `
/ J9 x) ^/ ]3 x7 f: Z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐/ F+ _4 }$ H6 N" k4 d

$ s7 |( ?# c9 i

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 11:57 , Processed in 0.043785 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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